/// Details of premature program termination.
pub enum TerminationInfo {
Exit(i64),
+ PoppedTrackedPointerTag(Item),
Abort,
}
.expect("invalid MachineStop payload");
match info {
TerminationInfo::Exit(code) => return Some(*code),
+ TerminationInfo::PoppedTrackedPointerTag(item) =>
+ format!("popped tracked tag for item {:?}", item),
TerminationInfo::Abort =>
format!("the evaluated program aborted execution")
}
use rustc::mir::RetagKind;
use crate::{
- InterpResult, HelpersEvalContextExt,
+ InterpResult, HelpersEvalContextExt, TerminationInfo,
MemoryKind, MiriMemoryKind, RangeMap, AllocId, Pointer, Immediate, ImmTy, PlaceTy, MPlaceTy,
};
fn check_protector(item: &Item, tag: Option<Tag>, global: &GlobalState) -> InterpResult<'tcx> {
if let Tag::Tagged(id) = item.tag {
if Some(id) == global.tracked_pointer_tag {
- throw_unsup!(Unsupported(format!("disabling item {:?} for tag {:?}", item, tag)));
+ throw_machine_stop!(TerminationInfo::PoppedTrackedPointerTag(item.clone()));
}
}
if let Some(call) = item.protector {