feat: ref

This commit is contained in:
2025-05-11 00:32:44 +08:00
parent 561b9bf36a
commit f52687bc1e
5 changed files with 62 additions and 55 deletions

View File

@@ -37,12 +37,12 @@ impl VM {
VM { thunks, funcs }
}
pub fn get_thunk(&self, idx: usize) -> Thunk {
self.thunks[idx].clone()
pub fn get_thunk(&self, idx: usize) -> &Thunk {
&self.thunks[idx]
}
pub fn get_func(&self, idx: usize) -> Func {
self.funcs[idx].clone()
pub fn get_func(&self, idx: usize) -> &Func {
&self.funcs[idx]
}
pub fn eval(&self, opcodes: OpCodes, env: Arc<Env>) -> Result<Value> {
@@ -101,9 +101,8 @@ impl VM {
stack.push(func.call(self, args)?)?;
}
OpCode::Func { idx } => {
let mut func = self.get_func(idx);
func.env = Some(env.captured());
stack.push(Value::Func(func))?;
self.get_func(idx).env.get_or_init(|| env.captured());
stack.push(Value::Func(idx))?;
}
OpCode::UnOp { op } => {
use UnOp::*;