use rustc::ty::{self, Ty};
use syntax::codemap::Span;
-use rustc::mir::interpret::{EvalResult, Scalar, Value};
+use rustc::mir::interpret::{EvalResult, Value};
use interpret::{Machine, ValTy, EvalContext, Place, PlaceExtra};
impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
ptr,
align: _,
extra: PlaceExtra::None,
- } => ptr.to_value(),
+ } => Value::Scalar(ptr),
_ => bug!("force_allocation broken"),
};
self.drop(val, instance, ty, span, target)
let instance = match ty.sty {
ty::TyDynamic(..) => {
- let vtable = match arg {
- Value::ScalarPair(_, Scalar::Ptr(vtable)) => vtable,
- _ => bug!("expected fat ptr, got {:?}", arg),
- };
- match self.read_drop_type_from_vtable(vtable)? {
- Some(func) => func,
- // no drop fn -> bail out
- None => {
- self.goto_block(target);
- return Ok(())
- },
+ if let Value::ScalarPair(_, vtable) = arg {
+ self.read_drop_type_from_vtable(vtable.read()?.to_ptr()?)?
+ } else {
+ bug!("expected fat ptr, got {:?}", arg);
}
}
_ => instance,