This repository has been archived on 2020-09-15. You can view files and clone it, but cannot push or open issues or pull requests.
Files
not-python-old.2020-08-27/src/vm/frame.rs

63 lines
1.2 KiB
Rust
Raw Normal View History

use crate::{
obj::prelude::*,
vm::op::Op,
};
use std::rc::Rc;
pub struct Frame {
stack: Vec<DynRef>,
ip: usize,
return_value: Option<DynRef>,
locals: Ns,
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, sym: Sym) -> Option<DynRef> {
self.locals.get(&sym).copied()
}
pub fn set_local(&mut self, sym: Sym, obj_ref: DynRef) -> Option<DynRef> {
self.locals.insert(sym, obj_ref)
}
pub fn ops(&self) -> &Rc<Vec<Op>> {
&self.ops
}
}