]> git.lizzy.rs Git - rust.git/commitdiff
make ENFORCE_VALIDITY a function
authorRalf Jung <post@ralfj.de>
Thu, 11 Oct 2018 06:48:15 +0000 (08:48 +0200)
committerRalf Jung <post@ralfj.de>
Sat, 13 Oct 2018 07:09:03 +0000 (09:09 +0200)
miri needs this extra flexibility

src/librustc_mir/const_eval.rs
src/librustc_mir/interpret/eval_context.rs
src/librustc_mir/interpret/machine.rs
src/librustc_mir/interpret/place.rs

index 1ce32f8c0a858f501b95596b1b702dfe23ff0a3b..2cfd058831f054da31b36d3ac8b66ee24df658cc 100644 (file)
@@ -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>,
index bc613358152be2e46a5e4ecf416a79af4f0bbe44..85a8376134aa472cd80115ca9d5fa5b0766e9af5 100644 (file)
@@ -524,7 +524,7 @@ pub(super) fn pop_stack_frame(&mut self) -> EvalResult<'tcx> {
         }
         // 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
index a444f0bafd23c1f3d7d7b24de03ead89bb79923f..560698f3f57a22249661ac13f568ec6a4a5b0100 100644 (file)
@@ -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.
index 923f0dc4c291a8d305e3d215330d8892c45333cd..e4055947b6421ffaee8b4b3438b2003da87ce19b 100644 (file)
@@ -607,7 +607,7 @@ pub fn write_value(
     ) -> 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 @@ pub fn copy_op(
     ) -> 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 @@ pub fn copy_op_transmute(
             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)?;
         }