59 lines
1.2 KiB
Rust
59 lines
1.2 KiB
Rust
use crate::{obj::prelude::*, vm::op::Op};
|
|
use std::{collections::BTreeMap, rc::Rc};
|
|
|
|
pub struct Frame {
|
|
stack: Vec<DynRef>,
|
|
ip: usize,
|
|
return_value: Option<DynRef>,
|
|
locals: BTreeMap<NameId, DynRef>,
|
|
ops: Rc<Vec<Op>>,
|
|
}
|
|
|
|
impl Frame {
|
|
pub fn new(ops: Rc<Vec<Op>>) -> 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<DynRef> {
|
|
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<DynRef> {
|
|
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<DynRef> {
|
|
self.locals.get(&name).copied()
|
|
}
|
|
|
|
pub fn set_local(&mut self, sym: NameId, obj_ref: DynRef) -> Option<DynRef> {
|
|
self.locals.insert(sym, obj_ref)
|
|
}
|
|
|
|
pub fn ops(&self) -> &Rc<Vec<Op>> {
|
|
&self.ops
|
|
}
|
|
}
|