From 701eb3f62bca0b34fd6ff1bb245a787c33af2084 Mon Sep 17 00:00:00 2001 From: Scott Olson Date: Sun, 16 Oct 2016 17:18:56 -0600 Subject: [PATCH] Make locals debug printing smarter. --- src/interpreter/mod.rs | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 4013d17ede3..c600b315eab 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -1389,6 +1389,27 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { } Ok(()) } + + fn dump_locals(&self, limit: usize) { + for (frame_index, frame) in self.stack.iter().enumerate() { + trace!("frame[{}]:", frame_index); + + let locals: Vec<(mir::Local, Value)> = frame.mir.local_decls + .indices() + .filter_map(|i| { + if i == mir::RETURN_POINTER { return None; } + frame.get_local(i).map(|local| (i, local)) + }) + .collect(); + + for &(i, v) in locals.iter().take(limit) { + trace!(" {:?}: {:?}", i, v); + } + if locals.len() > limit { + trace!(" ..."); + } + } + } } impl<'a, 'tcx: 'a> Frame<'a, 'tcx> { @@ -1471,16 +1492,7 @@ pub fn eval_main<'a, 'tcx: 'a>( for _ in 0..step_limit { match ecx.step() { Ok(true) => { - let limit = 5; - for (frame_index, frame) in ecx.stack.iter().enumerate() { - trace!("frame[{}]:", frame_index); - for (i, v) in frame.locals.iter().enumerate().take(limit) { - trace!(" _{}: {:?}", i + 1, v); - } - if frame.locals.len() > limit { - trace!(" ..."); - } - } + ecx.dump_locals(5); } Ok(false) => return, Err(e) => {