use std::collections::HashMap; use std::rc::Rc; use std::cell::RefCell; use super::super::varstack::VectorVarStack; use super::super::objects::{ObjectRef, Code}; use super::instructions::{Instruction, InstructionDecoder}; #[derive(Debug)] pub enum Block { Loop(usize, usize), // begin, end TryExcept(usize, usize), // begin, end ExceptPopGoto(ObjectRef, usize, usize), // If an exception matchs the first arg matches, pop n elements from the stack and set the PC to the second arg } #[derive(Debug)] pub struct Frame { pub object: ObjectRef, pub var_stack: VectorVarStack, pub block_stack: Vec, pub locals: Rc>>, pub instructions: Vec, pub code: Code, pub program_counter: usize, } impl Frame { pub fn new(object: ObjectRef, code: Code, locals: Rc>>) -> Frame { let instructions: Vec = InstructionDecoder::new(code.code.iter()).into_iter().collect(); Frame { object: object, var_stack: VectorVarStack::new(), block_stack: Vec::new(), locals: locals, instructions: instructions, code: code, program_counter: 0, } } }