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>,
}
// 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
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.
) -> 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)?;
}
) -> 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)?;
}
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)?;
}