feat: no clone in JIT
IMPORTANT: should not drop or create values in JIT anymore
This commit is contained in:
@@ -6,7 +6,7 @@ use derive_more::Constructor;
|
||||
use itertools::Itertools;
|
||||
|
||||
use crate::error::Result;
|
||||
use crate::vm::{VmEnv, VM};
|
||||
use crate::vm::{VM, VmEnv};
|
||||
|
||||
use super::super::public as p;
|
||||
use super::Value;
|
||||
@@ -42,9 +42,9 @@ impl<'jit: 'vm, 'vm> AttrSet<'jit, 'vm> {
|
||||
}
|
||||
|
||||
pub fn select(&self, sym: usize) -> Option<Value<'jit, 'vm>> {
|
||||
self.data.get(&sym).cloned().map(|val| match val {
|
||||
self.data.get(&sym).map(|val| match val {
|
||||
Value::Builtins(x) => Value::AttrSet(x.upgrade().unwrap()),
|
||||
val => val,
|
||||
val => val.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -53,8 +53,10 @@ impl<'jit: 'vm, 'vm> AttrSet<'jit, 'vm> {
|
||||
}
|
||||
|
||||
pub fn capture(&mut self, env: &Rc<VmEnv<'jit, 'vm>>) {
|
||||
self.data.iter().for_each(|(_, v)| if let Value::Thunk(ref thunk) = v.clone() {
|
||||
thunk.capture(env.clone());
|
||||
self.data.iter().for_each(|(_, v)| {
|
||||
if let Value::Thunk(ref thunk) = v.clone() {
|
||||
thunk.capture(Rc::clone(env));
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -77,11 +79,7 @@ impl<'jit: 'vm, 'vm> AttrSet<'jit, 'vm> {
|
||||
}
|
||||
|
||||
pub fn force_deep(&mut self, vm: &'vm VM<'jit>) -> Result<()> {
|
||||
let mut map: Vec<_> = self
|
||||
.data
|
||||
.iter()
|
||||
.map(|(k, v)| (*k, v.clone()))
|
||||
.collect();
|
||||
let mut map: Vec<_> = self.data.iter().map(|(k, v)| (*k, v.clone())).collect();
|
||||
for (_, v) in map.iter_mut() {
|
||||
v.force_deep(vm)?;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user