Emit the right types for vtable pointers when dropping dyn*
This commit is contained in:
parent
e82cc656c8
commit
7f798c2b21
1 changed files with 78 additions and 80 deletions
|
@ -452,7 +452,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
args1 = [place.llval];
|
args1 = [place.llval];
|
||||||
&args1[..]
|
&args1[..]
|
||||||
};
|
};
|
||||||
let (drop_fn, fn_abi) = match ty.kind() {
|
let (drop_fn, fn_abi) =
|
||||||
|
match ty.kind() {
|
||||||
// FIXME(eddyb) perhaps move some of this logic into
|
// FIXME(eddyb) perhaps move some of this logic into
|
||||||
// `Instance::resolve_drop_in_place`?
|
// `Instance::resolve_drop_in_place`?
|
||||||
ty::Dynamic(_, _, ty::Dyn) => {
|
ty::Dynamic(_, _, ty::Dyn) => {
|
||||||
|
@ -516,17 +517,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
debug!("drop_fn = {:?}", drop_fn);
|
debug!("drop_fn = {:?}", drop_fn);
|
||||||
debug!("args = {:?}", args);
|
debug!("args = {:?}", args);
|
||||||
let fn_abi = bx.fn_abi_of_instance(virtual_drop, ty::List::empty());
|
let fn_abi = bx.fn_abi_of_instance(virtual_drop, ty::List::empty());
|
||||||
let data = args[0];
|
let meta_ptr = place.project_field(bx, 1);
|
||||||
let data_ty = bx.cx().backend_type(place.layout);
|
let meta = bx.load_operand(meta_ptr);
|
||||||
let vtable_ptr =
|
|
||||||
bx.gep(data_ty, data, &[bx.cx().const_i32(0), bx.cx().const_i32(1)]);
|
|
||||||
let vtable = bx.load(bx.type_i8p(), vtable_ptr, abi::Align::ONE);
|
|
||||||
// Truncate vtable off of args list
|
// Truncate vtable off of args list
|
||||||
args = &args[..1];
|
args = &args[..1];
|
||||||
debug!("args' = {:?}", args);
|
debug!("args' = {:?}", args);
|
||||||
(
|
(
|
||||||
meth::VirtualIndex::from_index(ty::COMMON_VTABLE_ENTRIES_DROPINPLACE)
|
meth::VirtualIndex::from_index(ty::COMMON_VTABLE_ENTRIES_DROPINPLACE)
|
||||||
.get_fn(bx, vtable, ty, &fn_abi),
|
.get_fn(bx, meta.immediate(), ty, &fn_abi),
|
||||||
fn_abi,
|
fn_abi,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue