Refactor writing ByValPair to pointers.

This commit is contained in:
Scott Olson 2016-10-16 15:31:02 -06:00
parent b1094f6c1e
commit 3f67c4612c

View File

@ -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;