🚧 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 upvalues = State::upvalues_from_args ([exe_name].into_iter ().chain (args));
|
||||||
|
|
||||||
let mut vm = State::new (&chunk, &upvalues);
|
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.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)]
|
#[derive (Clone, Debug)]
|
||||||
struct StackFrame {
|
pub struct StackFrame {
|
||||||
// i32 makes it a little easier to implement jumps
|
// i32 makes it a little easier to implement jumps
|
||||||
// Starts at 0 right after OP_CALL
|
// Starts at 0 right after OP_CALL
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ pub struct State <'a> {
|
||||||
registers: Vec <Value>,
|
registers: Vec <Value>,
|
||||||
// Currently only used for native function calls
|
// Currently only used for native function calls
|
||||||
top: usize,
|
top: usize,
|
||||||
stack: Vec <StackFrame>,
|
pub stack: Vec <StackFrame>,
|
||||||
|
|
||||||
pub debug_print: bool,
|
pub debug_print: bool,
|
||||||
step_count: u32,
|
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>
|
pub fn upvalues_from_args <I: Iterator <Item = String>> (args: I) -> Vec <Value>
|
||||||
{
|
{
|
||||||
let arg = args.map (|s| Value::from (s)).enumerate ();
|
let arg = args.map (|s| Value::from (s)).enumerate ();
|
||||||
|
@ -646,12 +651,8 @@ impl <'a> State <'a> {
|
||||||
let max_iters = 2000;
|
let max_iters = 2000;
|
||||||
|
|
||||||
for _ in 0..max_iters {
|
for _ in 0..max_iters {
|
||||||
let frame = self.stack.last ().unwrap ();
|
if breakpoints.iter ().any (|bp| self.at_breakpoint (bp)) {
|
||||||
for bp in breakpoints {
|
dbg! (&self);
|
||||||
if frame.block_idx == bp.block_idx && frame.program_counter == bp.program_counter
|
|
||||||
{
|
|
||||||
dbg! (&self);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.step () {
|
match self.step () {
|
||||||
|
|
Loading…
Reference in New Issue