interpret: expose generate_stacktrace without full InterpCx

This commit is contained in:
Ralf Jung 2022-09-18 19:08:14 +02:00
parent a29f341a8a
commit 9fa3171015

View file

@ -929,11 +929,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
} }
#[must_use] #[must_use]
pub fn generate_stacktrace(&self) -> Vec<FrameInfo<'tcx>> { pub fn generate_stacktrace_from_stack(
stack: &[Frame<'mir, 'tcx, M::Provenance, M::FrameExtra>],
) -> Vec<FrameInfo<'tcx>> {
let mut frames = Vec::new(); let mut frames = Vec::new();
// This deliberately does *not* honor `requires_caller_location` since it is used for much // This deliberately does *not* honor `requires_caller_location` since it is used for much
// more than just panics. // more than just panics.
for frame in self.stack().iter().rev() { for frame in stack.iter().rev() {
let lint_root = frame.current_source_info().and_then(|source_info| { let lint_root = frame.current_source_info().and_then(|source_info| {
match &frame.body.source_scopes[source_info.scope].local_data { match &frame.body.source_scopes[source_info.scope].local_data {
mir::ClearCrossCrate::Set(data) => Some(data.lint_root), mir::ClearCrossCrate::Set(data) => Some(data.lint_root),
@ -947,6 +949,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
trace!("generate stacktrace: {:#?}", frames); trace!("generate stacktrace: {:#?}", frames);
frames frames
} }
#[must_use]
pub fn generate_stacktrace(&self) -> Vec<FrameInfo<'tcx>> {
Self::generate_stacktrace_from_stack(self.stack())
}
} }
#[doc(hidden)] #[doc(hidden)]