ignore print!
, turn panic!
into a EvalError
This commit is contained in:
parent
6aed897c70
commit
250f66562c
@ -56,6 +56,7 @@ pub enum EvalError<'tcx> {
|
|||||||
ExpectedConcreteFunction(Function<'tcx>),
|
ExpectedConcreteFunction(Function<'tcx>),
|
||||||
ExpectedDropGlue(Function<'tcx>),
|
ExpectedDropGlue(Function<'tcx>),
|
||||||
ManuallyCalledDropGlue,
|
ManuallyCalledDropGlue,
|
||||||
|
Panic,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type EvalResult<'tcx, T = ()> = Result<T, EvalError<'tcx>>;
|
pub type EvalResult<'tcx, T = ()> = Result<T, EvalError<'tcx>>;
|
||||||
@ -134,6 +135,8 @@ fn description(&self) -> &str {
|
|||||||
"tried to use non-drop-glue function as drop glue",
|
"tried to use non-drop-glue function as drop glue",
|
||||||
EvalError::ManuallyCalledDropGlue =>
|
EvalError::ManuallyCalledDropGlue =>
|
||||||
"tried to manually invoke drop glue",
|
"tried to manually invoke drop glue",
|
||||||
|
EvalError::Panic =>
|
||||||
|
"the evaluated program panicked",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,7 +292,25 @@ fn eval_fn_call(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mir = self.load_mir(resolved_def_id)?;
|
let mir = match self.load_mir(resolved_def_id) {
|
||||||
|
Ok(mir) => mir,
|
||||||
|
Err(EvalError::NoMirFor(path)) => {
|
||||||
|
match &path[..] {
|
||||||
|
// let's just ignore all output for now
|
||||||
|
"std::io::_print" => {
|
||||||
|
self.goto_block(destination.unwrap().1);
|
||||||
|
return Ok(());
|
||||||
|
},
|
||||||
|
"std::thread::Builder::new" => return Err(EvalError::Unimplemented("miri does not support threading".to_owned())),
|
||||||
|
"std::env::args" => return Err(EvalError::Unimplemented("miri does not support program arguments".to_owned())),
|
||||||
|
"std::panicking::rust_panic_with_hook" |
|
||||||
|
"std::rt::begin_panic_fmt" => return Err(EvalError::Panic),
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
return Err(EvalError::NoMirFor(path));
|
||||||
|
},
|
||||||
|
Err(other) => return Err(other),
|
||||||
|
};
|
||||||
let (return_lvalue, return_to_block) = match destination {
|
let (return_lvalue, return_to_block) = match destination {
|
||||||
Some((lvalue, block)) => (lvalue, StackPopCleanup::Goto(block)),
|
Some((lvalue, block)) => (lvalue, StackPopCleanup::Goto(block)),
|
||||||
None => {
|
None => {
|
||||||
|
Loading…
Reference in New Issue
Block a user