🚧 wip: improving debugging
parent
a460b5a932
commit
e499d27dfc
51
src/main.rs
51
src/main.rs
|
@ -60,9 +60,56 @@ fn main () {
|
|||
let upvalues = State::upvalues_from_args ([exe_name].into_iter ().chain (args));
|
||||
|
||||
let mut vm = State::new (&chunk, &upvalues);
|
||||
if std::env::var("LUA_DEBUG").is_ok() {
|
||||
if std::env::var("LWVM_DEBUG").is_ok() {
|
||||
vm.debug_print = true;
|
||||
}
|
||||
|
||||
vm.execute_chunk (&breakpoints);
|
||||
let max_iters = 2000;
|
||||
let mut in_break = false;
|
||||
let mut last_input = String::new ();
|
||||
|
||||
for _ in 0..max_iters {
|
||||
if in_break || breakpoints.iter ().any (|bp| vm.at_breakpoint (bp)) {
|
||||
in_break = true;
|
||||
dbg! (&vm.stack);
|
||||
|
||||
let mut input = Default::default ();
|
||||
std::io::stdin ().read_line (&mut input).unwrap ();
|
||||
|
||||
let input = if input == "" {
|
||||
&last_input
|
||||
}
|
||||
else {
|
||||
last_input = input;
|
||||
&last_input
|
||||
};
|
||||
|
||||
match input.as_str ().trim_end () {
|
||||
"c" => in_break = false,
|
||||
"q" => return,
|
||||
"s" => {
|
||||
match vm.step () {
|
||||
None => (),
|
||||
Some (state::StepOutput::ChunkReturned (x)) => {
|
||||
dbg! (x);
|
||||
break;
|
||||
},
|
||||
}
|
||||
continue;
|
||||
},
|
||||
x => { dbg! (x); },
|
||||
}
|
||||
}
|
||||
|
||||
match vm.step () {
|
||||
None => (),
|
||||
Some (state::StepOutput::ChunkReturned (x)) => {
|
||||
dbg! (x);
|
||||
break;
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
dbg! (vm);
|
||||
panic! ("Hit max iterations before block returned");
|
||||
}
|
||||
|
|
17
src/state.rs
17
src/state.rs
|
@ -28,7 +28,7 @@ pub struct Chunk {
|
|||
}
|
||||
|
||||
#[derive (Clone, Debug)]
|
||||
struct StackFrame {
|
||||
pub struct StackFrame {
|
||||
// i32 makes it a little easier to implement jumps
|
||||
// Starts at 0 right after OP_CALL
|
||||
|
||||
|
@ -51,7 +51,7 @@ pub struct State <'a> {
|
|||
registers: Vec <Value>,
|
||||
// Currently only used for native function calls
|
||||
top: usize,
|
||||
stack: Vec <StackFrame>,
|
||||
pub stack: Vec <StackFrame>,
|
||||
|
||||
pub debug_print: bool,
|
||||
step_count: u32,
|
||||
|
@ -98,6 +98,11 @@ impl <'a> State <'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn at_breakpoint (&self, bp: &Breakpoint) -> bool {
|
||||
let frame = self.stack.last ().unwrap ();
|
||||
frame.block_idx == bp.block_idx && frame.program_counter == bp.program_counter
|
||||
}
|
||||
|
||||
pub fn upvalues_from_args <I: Iterator <Item = String>> (args: I) -> Vec <Value>
|
||||
{
|
||||
let arg = args.map (|s| Value::from (s)).enumerate ();
|
||||
|
@ -646,12 +651,8 @@ impl <'a> State <'a> {
|
|||
let max_iters = 2000;
|
||||
|
||||
for _ in 0..max_iters {
|
||||
let frame = self.stack.last ().unwrap ();
|
||||
for bp in breakpoints {
|
||||
if frame.block_idx == bp.block_idx && frame.program_counter == bp.program_counter
|
||||
{
|
||||
dbg! (&self);
|
||||
}
|
||||
if breakpoints.iter ().any (|bp| self.at_breakpoint (bp)) {
|
||||
dbg! (&self);
|
||||
}
|
||||
|
||||
match self.step () {
|
||||
|
|
Loading…
Reference in New Issue