|
|
@ -70,6 +70,11 @@ where |
|
|
|
function_chunks: Vec<Chunk>,
|
|
|
|
error_handler: &mut ErrorHandler,
|
|
|
|
) -> bool {
|
|
|
|
// Allocate space for variables
|
|
|
|
for _ in 0..chunk.num_variables {
|
|
|
|
self.push(ExprValue::Integer(0))
|
|
|
|
}
|
|
|
|
|
|
|
|
self.ip = 0;
|
|
|
|
self.cur_chunk = 0;
|
|
|
|
self.chunks = vec![chunk];
|
|
|
@ -119,7 +124,7 @@ where |
|
|
|
}
|
|
|
|
OpCode::Input => {
|
|
|
|
let var_id = self.read_byte() as usize;
|
|
|
|
self.stack[self.offset + var_id] = ExprValue::String(self.stdio.read_line());
|
|
|
|
self.stack[var_id] = ExprValue::String(self.stdio.read_line());
|
|
|
|
}
|
|
|
|
OpCode::Literal8 => {
|
|
|
|
let byte = self.read_byte();
|
|
|
@ -263,9 +268,6 @@ where |
|
|
|
let var_id = self.read_byte() as usize;
|
|
|
|
self.push(self.stack[self.offset + var_id].clone());
|
|
|
|
}
|
|
|
|
OpCode::NewVar => {
|
|
|
|
self.push(ExprValue::Integer(0));
|
|
|
|
}
|
|
|
|
OpCode::SetVar => {
|
|
|
|
let var_id = self.read_byte() as usize;
|
|
|
|
self.stack[self.offset + var_id] = self.pop();
|
|
|
@ -377,6 +379,11 @@ where |
|
|
|
.push(CallFrame::new(old_chunk, self.ip, self.offset));
|
|
|
|
self.offset = self.stack.len() - self.arity();
|
|
|
|
self.ip = 0; // Reset IP
|
|
|
|
|
|
|
|
// Allocate space on stack for variables
|
|
|
|
for _ in 0..self.chunks[self.cur_chunk].num_variables {
|
|
|
|
self.push(ExprValue::Integer(0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
OpCode::Ret => {
|
|
|
|
if self.call_stack.is_empty() {
|
|
|
|