about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2018-10-11 08:48:15 +0200
committerRalf Jung <post@ralfj.de>2018-10-13 09:09:03 +0200
commit69576fcdee00b7e820c2faee258e24bb50db266a (patch)
treebbe1dd1085ec36f30cf8beef81d984e4538546ca
parent3272c9845cb6fcd8c15bcd0cb4c229de42f583c7 (diff)
downloadrust-69576fcdee00b7e820c2faee258e24bb50db266a.tar.gz
rust-69576fcdee00b7e820c2faee258e24bb50db266a.zip
make ENFORCE_VALIDITY a function
miri needs this extra flexibility
-rw-r--r--src/librustc_mir/const_eval.rs6
-rw-r--r--src/librustc_mir/interpret/eval_context.rs2
-rw-r--r--src/librustc_mir/interpret/machine.rs2
-rw-r--r--src/librustc_mir/interpret/place.rs6
4 files changed, 10 insertions, 6 deletions
diff --git a/src/librustc_mir/const_eval.rs b/src/librustc_mir/const_eval.rs
index 1ce32f8c0a8..2cfd058831f 100644
--- a/src/librustc_mir/const_eval.rs
+++ b/src/librustc_mir/const_eval.rs
@@ -343,7 +343,11 @@ impl<'a, 'mir, 'tcx> interpret::Machine<'a, 'mir, 'tcx>
     type MemoryMap = FxHashMap<AllocId, (MemoryKind<!>, Allocation<()>)>;
 
     const STATIC_KIND: Option<!> = None; // no copying of statics allowed
-    const ENFORCE_VALIDITY: bool = false; // for now, we don't
+
+    #[inline(always)]
+    fn enforce_validity(_ecx: &EvalContext<'a, 'mir, 'tcx, Self>) -> bool {
+        false // for now, we don't enforce validity
+    }
 
     fn find_fn(
         ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index bc613358152..85a8376134a 100644
--- a/src/librustc_mir/interpret/eval_context.rs
+++ b/src/librustc_mir/interpret/eval_context.rs
@@ -524,7 +524,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tc
         }
         // Validate the return value.
         if let Some(return_place) = frame.return_place {
-            if M::ENFORCE_VALIDITY {
+            if M::enforce_validity(self) {
                 // Data got changed, better make sure it matches the type!
                 // It is still possible that the return place held invalid data while
                 // the function is running, but that's okay because nobody could have
diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs
index a444f0bafd2..560698f3f57 100644
--- a/src/librustc_mir/interpret/machine.rs
+++ b/src/librustc_mir/interpret/machine.rs
@@ -86,7 +86,7 @@ pub trait Machine<'a, 'mir, 'tcx>: Sized {
     const STATIC_KIND: Option<Self::MemoryKinds>;
 
     /// Whether to enforce the validity invariant
-    const ENFORCE_VALIDITY: bool;
+    fn enforce_validity(ecx: &EvalContext<'a, 'mir, 'tcx, Self>) -> bool;
 
     /// Called before a basic block terminator is executed.
     /// You can use this to detect endlessly running programs.
diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs
index 923f0dc4c29..e4055947b64 100644
--- a/src/librustc_mir/interpret/place.rs
+++ b/src/librustc_mir/interpret/place.rs
@@ -607,7 +607,7 @@ where
     ) -> EvalResult<'tcx> {
         self.write_value_no_validate(src_val, dest)?;
 
-        if M::ENFORCE_VALIDITY {
+        if M::enforce_validity(self) {
             // Data got changed, better make sure it matches the type!
             self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?;
         }
@@ -729,7 +729,7 @@ where
     ) -> EvalResult<'tcx> {
         self.copy_op_no_validate(src, dest)?;
 
-        if M::ENFORCE_VALIDITY {
+        if M::enforce_validity(self) {
             // Data got changed, better make sure it matches the type!
             self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?;
         }
@@ -807,7 +807,7 @@ where
             PlaceTy::from(MPlaceTy { mplace: *dest, layout: src.layout }),
         )?;
 
-        if M::ENFORCE_VALIDITY {
+        if M::enforce_validity(self) {
             // Data got changed, better make sure it matches the type!
             self.validate_operand(dest.into(), &mut vec![], None, /*const_mode*/false)?;
         }