From 3f67c4612c6b9a7ac6579644bea6f5ccfb0803e4 Mon Sep 17 00:00:00 2001 From: Scott Olson Date: Sun, 16 Oct 2016 15:31:02 -0600 Subject: [PATCH] Refactor writing ByValPair to pointers. --- src/interpreter/mod.rs | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index d9d3cba31c0d..0380c0b01822 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -1073,20 +1073,14 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { Value::ByRef(ptr) => Ok(ptr), Value::ByVal(primval) => { - let size = self.type_size(ty); - let align = self.type_align(ty); - let ptr = self.memory.allocate(size, align)?; + let ptr = self.alloc_ptr(ty)?; self.memory.write_primval(ptr, primval)?; Ok(ptr) } Value::ByValPair(a, b) => { - let size = self.type_size(ty); - let align = self.type_align(ty); - let ptr = self.memory.allocate(size, align)?; - let ptr_size = self.memory.pointer_size() as isize; - self.memory.write_primval(ptr, a)?; - self.memory.write_primval(ptr.offset(ptr_size), b)?; + let ptr = self.alloc_ptr(ty)?; + self.write_pair_to_ptr(a, b, ptr, ty)?; Ok(ptr) } } @@ -1190,16 +1184,25 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { match value { Value::ByRef(ptr) => self.copy(ptr, dest, dest_ty), Value::ByVal(primval) => self.memory.write_primval(dest, primval), - Value::ByValPair(a, b) => { - assert_eq!(self.get_field_count(dest_ty)?, 2); - let field_0 = self.get_field_offset(dest_ty, 0)?.bytes() as isize; - let field_1 = self.get_field_offset(dest_ty, 1)?.bytes() as isize; - self.memory.write_primval(dest.offset(field_0), a)?; - self.memory.write_primval(dest.offset(field_1), b) - } + Value::ByValPair(a, b) => self.write_pair_to_ptr(a, b, dest, dest_ty), } } + fn write_pair_to_ptr( + &mut self, + a: PrimVal, + b: PrimVal, + ptr: Pointer, + ty: Ty<'tcx> + ) -> EvalResult<'tcx, ()> { + assert_eq!(self.get_field_count(ty)?, 2); + let field_0 = self.get_field_offset(ty, 0)?.bytes() as isize; + let field_1 = self.get_field_offset(ty, 1)?.bytes() as isize; + self.memory.write_primval(ptr.offset(field_0), a)?; + self.memory.write_primval(ptr.offset(field_1), b)?; + Ok(()) + } + fn read_value(&mut self, ptr: Pointer, ty: Ty<'tcx>) -> EvalResult<'tcx, Value> { use syntax::ast::FloatTy;