feat(value): less clone
This commit is contained in:
@@ -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 => {
|
||||
|
||||
Reference in New Issue
Block a user