diff --git a/src/frame.rs b/src/frame.rs index 889c0c6..884a337 100644 --- a/src/frame.rs +++ b/src/frame.rs @@ -1,18 +1,20 @@ -use Result; use stack::Stack; +use Result; #[derive(Debug)] pub struct Frame { + pub base: usize, pub stack: Stack, pub locals: Vec, } impl Frame { - pub fn new(num_locals: usize) -> Frame { - if cfg!(feature="debug:frame") { - println!("Initializing frame of len {}", num_locals); + pub fn new(num_locals: usize, base: usize) -> Frame { + if cfg!(feature = "debug:frame") { + println!("Initializing frame of len {}", num_locals); } Frame { + base, stack: Stack::new(), locals: vec![0; num_locals], } @@ -40,4 +42,4 @@ impl Frame { self.locals[offset] = val; Ok(()) } -} \ No newline at end of file +} diff --git a/src/machine.rs b/src/machine.rs index 7138a13..b49cb8a 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -41,7 +41,7 @@ impl Machine { halted: false, pool, block, - frame: vec![Frame::new(ANTI_BS_SIZE)], + frame: vec![Frame::new(ANTI_BS_SIZE, 0)], stream_in: Box::new(::std::io::stdin()), stream_out: Arc::new(Mutex::new(::std::io::stdout())), diff --git a/src/ops.rs b/src/ops.rs index 7ae7a33..36ad400 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -235,13 +235,13 @@ fn iinc(machine: &mut Machine) -> Result<()> { fn invokevirtual(machine: &mut Machine) -> Result<()> { let method_index = machine.block.read_u16()?; - let invoke_addr = machine.pool.get(method_index as usize)?; + let invoke_addr = machine.pool.get(method_index as usize)? as usize; let return_addr = machine.get_program_counter(); - machine.block.seek(invoke_addr as usize)?; + machine.block.seek(invoke_addr)?; let arg_count = machine.block.read_u16()?; let var_count = machine.block.read_u16()?; - let mut newframe = Frame::new((arg_count + var_count) as usize); + let mut newframe = Frame::new((arg_count + var_count) as usize, invoke_addr); // Lifetime for cur_stack {