Skip to content

Commit 8ac7fa4

Browse files
committed
Synchronize get_vtable with the codegen_llvm one
1 parent 80feed3 commit 8ac7fa4

File tree

3 files changed

+14
-13
lines changed

3 files changed

+14
-13
lines changed

src/librustc_mir/interpret/cast.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
327327
}
328328
(_, &ty::Dynamic(ref data, _)) => {
329329
// Initial cast from sized to dyn trait
330-
let trait_ref = data.principal().with_self_ty(
331-
*self.tcx,
332-
src_pointee_ty,
333-
);
334-
let trait_ref = self.tcx.erase_regions(&trait_ref);
335-
let vtable = self.get_vtable(src_pointee_ty, trait_ref)?;
330+
let vtable = self.get_vtable(src_pointee_ty, data.principal())?;
336331
let ptr = self.read_value(src)?.to_scalar_ptr()?;
337332
let val = Value::new_dyn_trait(ptr, vtable);
338333
self.write_value(val, dest)

src/librustc_mir/interpret/eval_context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub struct EvalContext<'a, 'mir, 'tcx: 'a + 'mir, M: Machine<'a, 'mir, 'tcx>> {
5353
pub(crate) stack: Vec<Frame<'mir, 'tcx, M::PointerTag>>,
5454

5555
/// A cache for deduplicating vtables
56-
pub(super) vtables: FxHashMap<(Ty<'tcx>, ty::PolyTraitRef<'tcx>), AllocId>,
56+
pub(super) vtables: FxHashMap<(Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>), AllocId>,
5757
}
5858

5959
/// A stack frame.

src/librustc_mir/interpret/traits.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,28 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
2424
pub fn get_vtable(
2525
&mut self,
2626
ty: Ty<'tcx>,
27-
trait_ref: ty::PolyTraitRef<'tcx>,
27+
poly_trait_ref: ty::PolyExistentialTraitRef<'tcx>,
2828
) -> EvalResult<'tcx, Pointer<M::PointerTag>> {
29-
debug!("get_vtable(trait_ref={:?})", trait_ref);
29+
debug!("get_vtable(trait_ref={:?})", poly_trait_ref);
3030

31-
if let Some(&vtable) = self.vtables.get(&(ty, trait_ref)) {
31+
let (ty, poly_trait_ref) = self.tcx.erase_regions(&(ty, poly_trait_ref));
32+
33+
if let Some(&vtable) = self.vtables.get(&(ty, poly_trait_ref)) {
3234
return Ok(Pointer::from(vtable).with_default_tag());
3335
}
3436

35-
let layout = self.layout_of(trait_ref.self_ty())?;
37+
let trait_ref = poly_trait_ref.with_self_ty(*self.tcx, ty);
38+
let trait_ref = self.tcx.erase_regions(&trait_ref);
39+
40+
let methods = self.tcx.vtable_methods(trait_ref);
41+
42+
let layout = self.layout_of(ty)?;
3643
assert!(!layout.is_unsized(), "can't create a vtable for an unsized type");
3744
let size = layout.size.bytes();
3845
let align = layout.align.abi();
3946

4047
let ptr_size = self.pointer_size();
4148
let ptr_align = self.tcx.data_layout.pointer_align;
42-
let methods = self.tcx.vtable_methods(trait_ref);
4349
let vtable = self.memory.allocate(
4450
ptr_size * (3 + methods.len() as u64),
4551
ptr_align,
@@ -66,7 +72,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
6672
}
6773

6874
self.memory.mark_immutable(vtable.alloc_id)?;
69-
assert!(self.vtables.insert((ty, trait_ref), vtable.alloc_id).is_none());
75+
assert!(self.vtables.insert((ty, poly_trait_ref), vtable.alloc_id).is_none());
7076

7177
Ok(vtable)
7278
}

0 commit comments

Comments
 (0)