diff options
| author | Ralf Jung <post@ralfj.de> | 2018-10-11 08:48:15 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-10-13 09:09:03 +0200 |
| commit | 69576fcdee00b7e820c2faee258e24bb50db266a (patch) | |
| tree | bbe1dd1085ec36f30cf8beef81d984e4538546ca | |
| parent | 3272c9845cb6fcd8c15bcd0cb4c229de42f583c7 (diff) | |
| download | rust-69576fcdee00b7e820c2faee258e24bb50db266a.tar.gz rust-69576fcdee00b7e820c2faee258e24bb50db266a.zip | |
make ENFORCE_VALIDITY a function
miri needs this extra flexibility
| -rw-r--r-- | src/librustc_mir/const_eval.rs | 6 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/machine.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/place.rs | 6 |
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)?; } |
