about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCharles Lew <crlf0710@gmail.com>2021-08-01 20:09:22 +0800
committerCharles Lew <crlf0710@gmail.com>2021-08-03 01:09:37 +0800
commita1cff1cd4990a4ee8c5df8d7c71c05a0bcd60dec (patch)
tree3e4740c115c8138cb94916e422aab81ee3233b1c
parent63ed62531324cd4660deb7faff58e6c17b93b487 (diff)
downloadrust-a1cff1cd4990a4ee8c5df8d7c71c05a0bcd60dec.tar.gz
rust-a1cff1cd4990a4ee8c5df8d7c71c05a0bcd60dec.zip
Small refactorings for miri.
-rw-r--r--compiler/rustc_mir/src/interpret/operand.rs12
-rw-r--r--compiler/rustc_mir/src/interpret/traits.rs21
2 files changed, 16 insertions, 17 deletions
diff --git a/compiler/rustc_mir/src/interpret/operand.rs b/compiler/rustc_mir/src/interpret/operand.rs
index bd6ee4a37e3..d5bc2b1e2ea 100644
--- a/compiler/rustc_mir/src/interpret/operand.rs
+++ b/compiler/rustc_mir/src/interpret/operand.rs
@@ -63,15 +63,19 @@ impl<'tcx, Tag: Provenance> Immediate<Tag> {
         Immediate::ScalarPair(val.into(), Scalar::from_machine_usize(len, cx).into())
     }
 
-    pub fn new_dyn_trait(val: Scalar<Tag>, vtable: Pointer<Tag>, cx: &impl HasDataLayout) -> Self {
-        Immediate::ScalarPair(val.into(), ScalarMaybeUninit::from_pointer(vtable, cx))
+    pub fn new_dyn_trait(
+        val: Scalar<Tag>,
+        vtable: Pointer<Option<Tag>>,
+        cx: &impl HasDataLayout,
+    ) -> Self {
+        Immediate::ScalarPair(val.into(), ScalarMaybeUninit::from_maybe_pointer(vtable, cx))
     }
 
     #[inline]
     pub fn to_scalar_or_uninit(self) -> ScalarMaybeUninit<Tag> {
         match self {
             Immediate::Scalar(val) => val,
-            Immediate::ScalarPair(..) => bug!("Got a wide pointer where a scalar was expected"),
+            Immediate::ScalarPair(..) => bug!("Got a scalar pair where a scalar was expected"),
         }
     }
 
@@ -85,7 +89,7 @@ impl<'tcx, Tag: Provenance> Immediate<Tag> {
         match self {
             Immediate::ScalarPair(val1, val2) => Ok((val1.check_init()?, val2.check_init()?)),
             Immediate::Scalar(..) => {
-                bug!("Got a scalar where a wide pointer was expected")
+                bug!("Got a scalar where a scalar pair was expected")
             }
         }
     }
diff --git a/compiler/rustc_mir/src/interpret/traits.rs b/compiler/rustc_mir/src/interpret/traits.rs
index 041be9814a3..a6ba00ec695 100644
--- a/compiler/rustc_mir/src/interpret/traits.rs
+++ b/compiler/rustc_mir/src/interpret/traits.rs
@@ -21,7 +21,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
         &mut self,
         ty: Ty<'tcx>,
         poly_trait_ref: Option<ty::PolyExistentialTraitRef<'tcx>>,
-    ) -> InterpResult<'tcx, Pointer<M::PointerTag>> {
+    ) -> InterpResult<'tcx, Pointer<Option<M::PointerTag>>> {
         trace!("get_vtable(trait_ref={:?})", poly_trait_ref);
 
         let (ty, poly_trait_ref) = self.tcx.erase_regions((ty, poly_trait_ref));
@@ -34,7 +34,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
 
         let vtable_ptr = self.memory.global_base_pointer(Pointer::from(vtable_allocation))?;
 
-        Ok(vtable_ptr)
+        Ok(vtable_ptr.into())
     }
 
     /// Resolves the function at the specified slot in the provided
@@ -126,21 +126,16 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
         &self,
         vtable: Pointer<Option<M::PointerTag>>,
         idx: u64,
-    ) -> InterpResult<'tcx, Pointer<M::PointerTag>> {
+    ) -> InterpResult<'tcx, Pointer<Option<M::PointerTag>>> {
         let pointer_size = self.pointer_size();
 
-        let vtable = self
+        let vtable_slot = vtable.offset(pointer_size * idx, self)?;
+        let new_vtable = self
             .memory
-            .get(
-                vtable,
-                pointer_size * idx.checked_add(1).unwrap(),
-                self.tcx.data_layout.pointer_align.abi,
-            )?
+            .get(vtable_slot, pointer_size, self.tcx.data_layout.pointer_align.abi)?
             .expect("cannot be a ZST");
-        let new_vtable = self
-            .scalar_to_ptr(vtable.read_ptr_sized(pointer_size * idx)?.check_init()?)
-            .into_pointer_or_addr()
-            .expect("should be a pointer");
+
+        let new_vtable = self.scalar_to_ptr(new_vtable.read_ptr_sized(Size::ZERO)?.check_init()?);
 
         Ok(new_vtable)
     }