diff options
| author | Ralf Jung <post@ralfj.de> | 2018-10-29 16:34:54 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-10-29 16:34:58 +0100 |
| commit | 2a5eae3ac78a63196c119c8ca5f8f0bd99227971 (patch) | |
| tree | e89eb4606564c128ae95a53bea63dd2805709569 | |
| parent | 3545dae6a35eb675c3cf6e312ef9a5724d721020 (diff) | |
| download | rust-2a5eae3ac78a63196c119c8ca5f8f0bd99227971.tar.gz rust-2a5eae3ac78a63196c119c8ca5f8f0bd99227971.zip | |
provide mutable borrows when hooking memory write access
| -rw-r--r-- | src/librustc_mir/interpret/machine.rs | 26 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/memory.rs | 6 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/mod.rs | 2 |
3 files changed, 16 insertions, 18 deletions
diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs index 5a5002dece5..7aeadfa408a 100644 --- a/src/librustc_mir/interpret/machine.rs +++ b/src/librustc_mir/interpret/machine.rs @@ -24,13 +24,6 @@ use super::{ EvalContext, PlaceTy, OpTy, Pointer, MemPlace, MemoryKind, }; -/// Classifying memory accesses -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum MemoryAccess { - Read, - Write, -} - /// Whether this kind of memory is allowed to leak pub trait MayLeak: Copy { fn may_leak(self) -> bool; @@ -181,17 +174,22 @@ pub trait Machine<'a, 'mir, 'tcx>: Sized { dest: PlaceTy<'tcx, Self::PointerTag>, ) -> EvalResult<'tcx>; - /// Hook for performing extra checks on a memory access. - /// - /// Takes read-only access to the allocation so we can keep all the memory read - /// operations take `&self`. Use a `RefCell` in `AllocExtra` if you - /// need to mutate. + /// Hook for performing extra checks on a memory read access. #[inline] - fn memory_accessed( + fn memory_read( _alloc: &Allocation<Self::PointerTag, Self::AllocExtra>, _ptr: Pointer<Self::PointerTag>, _size: Size, - _access: MemoryAccess, + ) -> EvalResult<'tcx> { + Ok(()) + } + + /// Hook for performing extra checks on a memory write access. + #[inline] + fn memory_written( + _alloc: &mut Allocation<Self::PointerTag, Self::AllocExtra>, + _ptr: Pointer<Self::PointerTag>, + _size: Size, ) -> EvalResult<'tcx> { Ok(()) } diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 689a29cff6e..91f3813e2b1 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -30,7 +30,7 @@ use syntax::ast::Mutability; use super::{ Pointer, AllocId, Allocation, ConstValue, GlobalId, EvalResult, Scalar, EvalErrorKind, AllocType, PointerArithmetic, - Machine, MemoryAccess, AllocMap, MayLeak, ScalarMaybeUndef, ErrorHandled, + Machine, AllocMap, MayLeak, ScalarMaybeUndef, ErrorHandled, }; #[derive(Debug, PartialEq, Eq, Copy, Clone, Hash)] @@ -644,7 +644,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> { } let alloc = self.get(ptr.alloc_id)?; - M::memory_accessed(alloc, ptr, size, MemoryAccess::Read)?; + M::memory_read(alloc, ptr, size)?; assert_eq!(ptr.offset.bytes() as usize as u64, ptr.offset.bytes()); assert_eq!(size.bytes() as usize as u64, size.bytes()); @@ -690,7 +690,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> { self.clear_relocations(ptr, size)?; let alloc = self.get_mut(ptr.alloc_id)?; - M::memory_accessed(alloc, ptr, size, MemoryAccess::Write)?; + M::memory_written(alloc, ptr, size)?; assert_eq!(ptr.offset.bytes() as usize as u64, ptr.offset.bytes()); assert_eq!(size.bytes() as usize as u64, size.bytes()); diff --git a/src/librustc_mir/interpret/mod.rs b/src/librustc_mir/interpret/mod.rs index 55037a99e01..5620ea4cee2 100644 --- a/src/librustc_mir/interpret/mod.rs +++ b/src/librustc_mir/interpret/mod.rs @@ -34,7 +34,7 @@ pub use self::place::{Place, PlaceTy, MemPlace, MPlaceTy}; pub use self::memory::{Memory, MemoryKind}; -pub use self::machine::{Machine, AllocMap, MemoryAccess, MayLeak}; +pub use self::machine::{Machine, AllocMap, MayLeak}; pub use self::operand::{ScalarMaybeUndef, Value, ValTy, Operand, OpTy}; |
