feat(value): less clone

This commit is contained in:
2025-05-17 15:18:16 +08:00
parent 85f06a30cd
commit 8480e0891b
10 changed files with 154 additions and 127 deletions

View File

@@ -1,5 +1,5 @@
use std::cell::RefCell;
use std::collections::HashMap;
use std::collections::{HashMap, HashSet};
use std::pin::Pin;
use std::rc::Rc;
@@ -34,9 +34,9 @@ pub fn run(prog: Program, jit: Pin<Box<JITContext<'_>>>) -> Result<p::Value> {
jit
);
let env = env(&vm);
let temp = vm.eval(prog.top_level.into_iter(), env)?;
let temp = temp.to_public(&vm);
Ok(temp)
let mut seen = HashSet::new();
let value = vm.eval(prog.top_level.into_iter(), env)?.to_public(&vm, &mut seen);
Ok(value)
}
#[derive(Constructor)]
@@ -99,7 +99,7 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
OpCode::Illegal => panic!("illegal opcode"),
OpCode::Const { idx } => stack.push(Value::Const(self.consts[idx].clone()))?,
OpCode::LoadThunk { idx } => {
stack.push(Value::Thunk(Thunk::new(self.get_thunk(idx))))?
stack.push(Value::Thunk(Thunk::new(self.get_thunk(idx)).into()))?
}
OpCode::CaptureEnv => {
match stack.tos()? {
@@ -132,7 +132,7 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
}
OpCode::Func { idx } => {
let func = self.get_func(idx);
stack.push(Value::Func(Func::new(func, env.clone(), None)))?;
stack.push(Value::Func(Func::new(func, env.clone(), None).into()))?;
}
OpCode::UnOp { op } => {
use UnOp::*;
@@ -171,17 +171,17 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
todo!()
}
OpCode::List => {
stack.push(Value::List(List::empty()))?;
stack.push(Value::List(List::empty().into()))?;
}
OpCode::PushElem => {
let elem = stack.pop();
stack.tos_mut()?.push(elem);
}
OpCode::AttrSet => {
stack.push(Value::AttrSet(AttrSet::empty()))?;
stack.push(Value::AttrSet(AttrSet::empty().into()))?;
}
OpCode::FinalizeRec => {
env.enter(stack.tos()?.clone().unwrap_attr_set().into_inner());
env.enter(stack.tos()?.clone().unwrap_attr_set().as_inner().clone());
stack
.tos_mut()?
.as_mut()
@@ -200,7 +200,7 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
stack.tos_mut()?.push_attr(sym, val);
}
OpCode::Select { sym } => {
stack.tos_mut()?.force(self)?.select(sym)?;
stack.tos_mut()?.force(self)?.select(sym, self)?;
}
OpCode::SelectOrDefault { sym } => {
let default = stack.pop();
@@ -214,7 +214,7 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
val.force(self)?;
val.coerce_to_string();
let sym = self.new_sym(val.unwrap_const().unwrap_string());
stack.tos_mut()?.force(self)?.select(sym)?;
stack.tos_mut()?.force(self)?.select(sym, self)?;
}
OpCode::SelectDynamicOrDefault => {
let default = stack.pop();
@@ -243,7 +243,8 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
)?;
}
OpCode::EnterEnv => match stack.pop() {
Value::AttrSet(attrs) => env.enter(attrs.into_inner()),
Value::AttrSet(attrs) => env.enter(attrs.as_inner().clone()),
_ => unreachable!(),
},
OpCode::LeaveEnv => {