Skip to content

Commit 10cf7ec

Browse files
authored
Merge pull request rust-lang#144 from oli-obk/vtable_refactor2
move all code accessing vtable internals into the `trait` module
2 parents c502bb8 + 1a697f9 commit 10cf7ec

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

src/terminator/drop.rs

+1-7
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,8 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
178178
Lvalue::Ptr { ptr, extra: LvalueExtra::Vtable(vtable) } => (ptr, vtable),
179179
_ => bug!("expected an lvalue with a vtable"),
180180
};
181-
let drop_fn = self.memory.read_ptr(vtable)?;
182-
// some values don't need to call a drop impl, so the value is null
183-
if drop_fn != Pointer::from_int(0) {
184-
let real_ty = self.memory.get_fn(drop_fn.alloc_id)?.expect_drop_glue_real_ty()?;
181+
if let Some(real_ty) = self.read_drop_type_from_vtable(vtable)? {
185182
self.drop(Lvalue::from_ptr(ptr), real_ty, drop)?;
186-
} else {
187-
// just a sanity check
188-
assert_eq!(drop_fn.offset, 0);
189183
}
190184
}
191185

src/terminator/intrinsic.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,6 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
418418
ty: ty::Ty<'tcx>,
419419
value: Value,
420420
) -> EvalResult<'tcx, (u64, u64)> {
421-
let pointer_size = self.memory.pointer_size();
422421
if let Some(size) = self.type_size(ty)? {
423422
Ok((size as u64, self.type_align(ty)? as u64))
424423
} else {
@@ -481,9 +480,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
481480
ty::TyDynamic(..) => {
482481
let (_, vtable) = value.expect_ptr_vtable_pair(&self.memory)?;
483482
// the second entry in the vtable is the dynamic size of the object.
484-
let size = self.memory.read_usize(vtable.offset(pointer_size))?;
485-
let align = self.memory.read_usize(vtable.offset(pointer_size * 2))?;
486-
Ok((size, align))
483+
self.read_size_and_align_from_vtable(vtable)
487484
}
488485

489486
ty::TySlice(_) | ty::TyStr => {

src/traits.rs

+21
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,27 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
285285
Ok(vtable)
286286
}
287287

288+
pub fn read_drop_type_from_vtable(&self, vtable: Pointer) -> EvalResult<'tcx, Option<Ty<'tcx>>> {
289+
let drop_fn = self.memory.read_ptr(vtable)?;
290+
291+
// just a sanity check
292+
assert_eq!(drop_fn.offset, 0);
293+
294+
// some values don't need to call a drop impl, so the value is null
295+
if drop_fn == Pointer::from_int(0) {
296+
Ok(None)
297+
} else {
298+
self.memory.get_fn(drop_fn.alloc_id)?.expect_drop_glue_real_ty().map(Some)
299+
}
300+
}
301+
302+
pub fn read_size_and_align_from_vtable(&self, vtable: Pointer) -> EvalResult<'tcx, (u64, u64)> {
303+
let pointer_size = self.memory.pointer_size();
304+
let size = self.memory.read_usize(vtable.offset(pointer_size))?;
305+
let align = self.memory.read_usize(vtable.offset(pointer_size * 2))?;
306+
Ok((size, align))
307+
}
308+
288309
fn get_vtable_methods(&mut self, impl_id: DefId, substs: &'tcx Substs<'tcx>) -> Vec<Option<ImplMethod<'tcx>>> {
289310
debug!("get_vtable_methods(impl_id={:?}, substs={:?}", impl_id, substs);
290311

0 commit comments

Comments
 (0)