From 0cc934b7de9958c10ba4e6b6e74fa9fc6dc798a0 Mon Sep 17 00:00:00 2001 From: David Renshaw <dwrenshaw@gmail.com> Date: Sat, 2 Dec 2017 10:59:18 -0500 Subject: [PATCH] modify signature of write_value() to use ValTy, as in miri --- src/eval_context.rs | 29 ++++++++++++++--------------- src/operator.rs | 4 ++-- src/terminator/drop.rs | 4 ++-- src/terminator/intrinsic.rs | 6 +++--- src/terminator/mod.rs | 25 +++++++++++++------------ 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/eval_context.rs b/src/eval_context.rs index fdfc567..5d87730 100644 --- a/src/eval_context.rs +++ b/src/eval_context.rs @@ -494,7 +494,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { match *rvalue { Use(ref operand) => { let value = self.eval_operand(operand)?; - self.write_value(value, dest, dest_ty)?; + self.write_value(ValTy { value, ty: dest_ty }, dest)?; } BinaryOp(bin_op, ref left, ref right) => { @@ -539,7 +539,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { if !self.type_layout(value_ty)?.is_zst() { let field_index = active_field_index.unwrap_or(i); let (field_dest, _) = self.lvalue_field(dest, mir::Field::new(field_index), layout)?; - self.write_value(value, field_dest, value_ty)?; + self.write_value(ValTy { value, ty: value_ty }, field_dest)?; } } } @@ -582,7 +582,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { bug!("attempted to take a reference to an enum downcast lvalue"), }; - self.write_value(val, dest, dest_ty)?; + self.write_value(ValTy { value: val, ty: dest_ty }, dest)?; } NullaryOp(mir::NullOp::Box, ty) => { @@ -626,10 +626,10 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { match (src, self.type_is_fat_ptr(dest_ty)) { (Value::ByRef(_), _) | (Value::ByValPair(..), true) => { - self.write_value(src, dest, dest_ty)?; + self.write_value(ValTy { value: src, ty: dest_ty }, dest)?; }, (Value::ByValPair(data, _), false) => { - self.write_value(Value::ByVal(data), dest, dest_ty)?; + self.write_value(ValTy { value: Value::ByVal(data), ty: dest_ty }, dest)?; }, (Value::ByVal(_), _) => bug!("expected fat ptr"), } @@ -646,7 +646,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { Err(err) } }); - self.write_value(Value::ByVal(dest_val?), dest, dest_ty)?; + self.write_value(ValTy { value: Value::ByVal(dest_val?), ty: dest_ty}, dest)?; } } @@ -654,7 +654,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ty::TyFnDef(def_id, substs) => { let instance = self.resolve(def_id, substs)?; let fn_ptr = self.memory.create_fn_alloc(instance); - self.write_value(Value::ByVal(PrimVal::Ptr(fn_ptr)), dest, dest_ty)?; + self.write_value(ValTy { value: Value::ByVal(PrimVal::Ptr(fn_ptr)), ty: dest_ty }, dest)?; }, ref other => bug!("reify fn pointer on {:?}", other), }, @@ -662,7 +662,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { UnsafeFnPointer => match dest_ty.sty { ty::TyFnPtr(_) => { let src = self.eval_operand(operand)?; - self.write_value(src, dest, dest_ty)?; + self.write_value(ValTy { value: src, ty: dest_ty }, dest)?; }, ref other => bug!("fn to unsafe fn cast on {:?}", other), }, @@ -671,7 +671,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ty::TyClosure(def_id, substs) => { let instance = resolve_closure(self.tcx, def_id, substs, ty::ClosureKind::FnOnce); let fn_ptr = self.memory.create_fn_alloc(instance); - self.write_value(Value::ByVal(PrimVal::Ptr(fn_ptr)), dest, dest_ty)?; + self.write_value(ValTy { value: Value::ByVal(PrimVal::Ptr(fn_ptr)), ty: dest_ty}, dest)?; }, ref other => bug!("reify fn pointer on {:?}", other), }, @@ -977,14 +977,13 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { val: PrimVal, dest_ty: Ty<'tcx>, ) -> EvalResult<'tcx> { - self.write_value(Value::ByVal(val), dest, dest_ty) + self.write_value(ValTy { value: Value::ByVal(val), ty: dest_ty }, dest) } pub(super) fn write_value( &mut self, - src_val: Value, + ValTy { value: src_val, ty: dest_ty } : ValTy<'tcx>, dest: Lvalue<'tcx>, - dest_ty: Ty<'tcx>, ) -> EvalResult<'tcx> { match dest { Lvalue::Global(cid) => { @@ -1357,13 +1356,13 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { (&ty::TyArray(_, length), &ty::TySlice(_)) => { let ptr = src.read_ptr(&self.memory)?; let len = PrimVal::from_u128(length.val.to_const_int().unwrap().to_u64().unwrap() as u128); - self.write_value(Value::ByValPair(ptr, len), dest, dest_ty) + self.write_value(ValTy { value: Value::ByValPair(ptr, len), ty: dest_ty }, dest) } (&ty::TyDynamic(..), &ty::TyDynamic(..)) => { // For now, upcasts are limited to changes in marker // traits, and hence never actually require an actual // change to the vtable. - self.write_value(src, dest, dest_ty) + self.write_value(ValTy { value: src, ty: dest_ty }, dest) }, (_, &ty::TyDynamic(ref data, _)) => { let trait_ref = data.principal().unwrap().with_self_ty(self.tcx, src_pointee_ty); @@ -1371,7 +1370,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let vtable = self.get_vtable(src_pointee_ty, trait_ref)?; let ptr = src.read_ptr(&self.memory)?; let extra = PrimVal::Ptr(vtable); - self.write_value(Value::ByValPair(ptr, extra), dest, dest_ty) + self.write_value(ValTy { value: Value::ByValPair(ptr, extra), ty: dest_ty}, dest) }, _ => bug!("invalid unsizing {:?} -> {:?}", src_ty, dest_ty), diff --git a/src/operator.rs b/src/operator.rs index 57989fb..771e875 100644 --- a/src/operator.rs +++ b/src/operator.rs @@ -5,7 +5,7 @@ use syntax::ast::FloatTy; use std::cmp::Ordering; use error::{EvalError, EvalResult}; -use eval_context::EvalContext; +use eval_context::{EvalContext, ValTy}; use lvalue::Lvalue; use memory::{Pointer, PointerOffset, SByte}; use value::{ @@ -45,7 +45,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ) -> EvalResult<'tcx> { let (val, overflowed) = self.binop_with_overflow(op, left, right)?; let val = Value::ByValPair(val, PrimVal::from_bool(overflowed)); - self.write_value(val, dest, dest_ty) + self.write_value(ValTy { value: val, ty: dest_ty}, dest) } /// Applies the binary operation `op` to the arguments and writes the result to the diff --git a/src/terminator/drop.rs b/src/terminator/drop.rs index 3cf20bb..835020a 100644 --- a/src/terminator/drop.rs +++ b/src/terminator/drop.rs @@ -3,7 +3,7 @@ use rustc::ty::{self, Ty}; use syntax::codemap::Span; use error::EvalResult; -use eval_context::{EvalContext, StackPopCleanup}; +use eval_context::{EvalContext, StackPopCleanup, ValTy}; use lvalue::{Lvalue, LvalueExtra}; use value::PrimVal; use value::Value; @@ -64,6 +64,6 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let arg_local = arg_locals.next().unwrap(); let dest = self.eval_lvalue(&mir::Place::Local(arg_local))?; let arg_ty = self.tcx.mk_mut_ptr(ty); - self.write_value(arg, dest, arg_ty) + self.write_value(ValTy { value: arg, ty: arg_ty }, dest) } } diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs index 8fc92b9..2a575e1 100644 --- a/src/terminator/intrinsic.rs +++ b/src/terminator/intrinsic.rs @@ -5,7 +5,7 @@ use rustc::ty::subst::Substs; use rustc::ty::{self, Ty}; use error::{EvalError, EvalResult}; -use eval_context::EvalContext; +use eval_context::{EvalContext, ValTy}; use lvalue::{Lvalue, LvalueExtra}; use memory::{Pointer, PointerOffset}; use value::{PrimVal, PrimValKind, Value}; @@ -67,7 +67,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { "volatile_load" => { let ty = instance.substs.type_at(0); let ptr = arg_vals[0].read_ptr(&self.memory)?.to_ptr()?; - self.write_value(Value::ByRef(ptr), dest, ty)?; + self.write_value(ValTy { value: Value::ByRef(ptr), ty }, dest)?; } "atomic_store" | @@ -418,7 +418,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let ty = instance.substs.type_at(0); let ty_name = ty.to_string(); let s = self.str_to_value(&ty_name)?; - self.write_value(s, dest, dest_ty)?; + self.write_value(ValTy { value: s, ty: dest_ty }, dest)?; } "type_id" => { let ty = instance.substs.type_at(0); diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs index f62d12c..b99366a 100644 --- a/src/terminator/mod.rs +++ b/src/terminator/mod.rs @@ -328,7 +328,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { for arg in arg_operands { let arg_val = self.eval_operand(arg)?; let arg_ty = self.operand_ty(arg); - args.push((arg_val, arg_ty)); + args.push(ValTy { value: arg_val, ty: arg_ty}); } if self.eval_fn_call_inner( instance, @@ -343,9 +343,9 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { match sig.abi { // closure as closure once Abi::RustCall => { - for (arg_local, (arg_val, arg_ty)) in arg_locals.zip(args) { + for (arg_local, arg_valty) in arg_locals.zip(args) { let dest = self.eval_lvalue(&mir::Place::Local(arg_local))?; - self.write_value(arg_val, dest, arg_ty)?; + self.write_value(arg_valty, dest)?; } }, // non capture closure as fn ptr @@ -355,9 +355,10 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { trace!("arg_locals: {:?}", self.frame().mir.args_iter().collect::<Vec<_>>()); trace!("arg_operands: {:?}", arg_operands); let local = arg_locals.nth(1).unwrap(); - for (i, (arg_val, arg_ty)) in args.into_iter().enumerate() { - let dest = self.eval_lvalue(&mir::Place::Local(local).field(mir::Field::new(i), arg_ty))?; - self.write_value(arg_val, dest, arg_ty)?; + for (i, arg_valty) in args.into_iter().enumerate() { + let dest = self.eval_lvalue(&mir::Place::Local(local).field(mir::Field::new(i), + arg_valty.ty))?; + self.write_value(arg_valty, dest)?; } }, _ => bug!("bad ABI for ClosureOnceShim: {:?}", sig.abi), @@ -400,9 +401,9 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { trace!("arg_operands: {:?}", arg_operands); match sig.abi { Abi::Rust => { - for (arg_local, ValTy { value: arg_val, ty: arg_ty }) in arg_locals.zip(args) { + for (arg_local, valty) in arg_locals.zip(args) { let dest = self.eval_lvalue(&mir::Place::Local(arg_local))?; - self.write_value(arg_val, dest, arg_ty)?; + self.write_value(valty, dest)?; } } Abi::RustCall => { @@ -411,7 +412,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { { // write first argument let first_local = arg_locals.next().unwrap(); let dest = self.eval_lvalue(&mir::Place::Local(first_local))?; - self.write_value(args[0].value, dest, args[0].ty)?; + self.write_value(ValTy { value: args[0].value, ty: args[0].ty }, dest)?; } // unpack and write all other args @@ -432,7 +433,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { dest, field.ty ); - self.write_value(arg, dest, field.ty)?; + self.write_value(ValTy { value: arg, ty: field.ty }, dest)?; } } Value::ByVal(PrimVal::Undef) => {} @@ -442,7 +443,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { arg_locals.next().unwrap(), ))?; let field_ty = layout.field(&self, 0)?.ty; - self.write_value(other, dest, field_ty)?; + self.write_value(ValTy { value: other, ty: field_ty }, dest)?; } } } else { @@ -451,7 +452,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let dest = self.eval_lvalue( &mir::Place::Local(arg_locals.next().unwrap()), )?; - self.write_value(args[1].value, dest, args[1].ty)?; + self.write_value(ValTy {value: args[1].value, ty: args[1].ty }, dest)?; } } else { bug!( -- GitLab