use crate::{obj::prelude::*, vm::op::Op}; use std::{collections::BTreeMap, rc::Rc}; pub struct Frame { stack: Vec, ip: usize, return_value: Option, locals: BTreeMap, ops: Rc>, } impl Frame { pub fn new(ops: Rc>) -> Self { Frame { stack: Default::default(), ip: 0, return_value: None, locals: Default::default(), ops, } } pub fn push(&mut self, obj_ref: DynRef) { self.stack.push(obj_ref) } pub fn pop(&mut self) -> Option { self.stack.pop() } pub fn ip(&self) -> usize { self.ip } pub fn set_ip(&mut self, ip: usize) { self.ip = ip; } pub fn return_value(&self) -> Option { self.return_value } pub fn set_return_value(&mut self, obj_ref: DynRef) { self.return_value = Some(obj_ref); } pub fn get_local(&self, name: NameId) -> Option { self.locals.get(&name).copied() } pub fn set_local(&mut self, sym: NameId, obj_ref: DynRef) -> Option { self.locals.insert(sym, obj_ref) } pub fn ops(&self) -> &Rc> { &self.ops } }