From f2d895a655e515887dcda4981f8475c4d43e2505 Mon Sep 17 00:00:00 2001 From: David Renshaw <dwrenshaw@gmail.com> Date: Sun, 3 Dec 2017 11:16:00 -0500 Subject: [PATCH] Pointer::with_primval_offset() --- src/lvalue.rs | 11 +++-------- src/memory.rs | 9 +++++++++ src/terminator/intrinsic.rs | 8 ++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/lvalue.rs b/src/lvalue.rs index 045f4f7..9d6145e 100644 --- a/src/lvalue.rs +++ b/src/lvalue.rs @@ -363,17 +363,12 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { PrimVal::Bytes(elem_size as u128), PrimValKind::U64); - match self.memory.constraints.add_binop_constraint( + let offset = self.memory.constraints.add_binop_constraint( mir::BinOp::Add, p.offset.as_primval(), byte_index, - PrimValKind::U64) { - PrimVal::Abstract(sbytes) => { - PrimVal::Ptr(Pointer::new_abstract(p.alloc_id, sbytes)) - } - _ => unreachable!(), - } - + PrimValKind::U64); + PrimVal::Ptr(Pointer::with_primval_offset(p.alloc_id, offset)) } (Err(_), 0) => base_ptr, (Err(e), _) => return Err(e), diff --git a/src/memory.rs b/src/memory.rs index 83a637a..124275d 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -96,6 +96,15 @@ impl Pointer { Pointer { alloc_id, offset: PointerOffset::Abstract(offset), } } + pub fn with_primval_offset(alloc_id: AllocId, offset: PrimVal) -> Self { + match offset { + PrimVal::Abstract(sbytes) => Pointer::new_abstract(alloc_id, sbytes), + PrimVal::Bytes(b) => Pointer::new(alloc_id, b as u64), + PrimVal::Undef => panic!("tried to construct pointer with undefined offset"), + PrimVal::Ptr(_) => panic!("tried to construct point with pointer offset"), + } + } + pub fn has_concrete_offset(self) -> bool { match self.offset { PointerOffset::Concrete(_) => true, diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs index 79b6b96..405a331 100644 --- a/src/terminator/intrinsic.rs +++ b/src/terminator/intrinsic.rs @@ -331,12 +331,8 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ptr.to_ptr()?.offset.as_primval(), byte_offset, PrimValKind::U64); - if let PrimVal::Abstract(sbytes) = new_offset { - let new_ptr = Pointer::new_abstract(ptr.to_ptr()?.alloc_id, sbytes); - self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?; - } else { - unreachable!() - } + let new_ptr = Pointer::with_primval_offset(ptr.to_ptr()?.alloc_id, new_offset); + self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?; } } -- GitLab