fix: PartialFunc
This commit is contained in:
@@ -48,7 +48,9 @@ impl Engine {
|
||||
for SccNode { members, .. } in graph.into_iter() {
|
||||
if members.len() == 1 {
|
||||
for member in members.into_iter() {
|
||||
let val = self.thunks[member].clone().eval(self, &mut env)?;
|
||||
let engine = unsafe { &mut *(self as *mut Self) };
|
||||
let mut val = self.thunks[member].eval(engine, &mut env)?;
|
||||
val.force(engine, &mut env)?;
|
||||
env.insert_cache(member, val);
|
||||
}
|
||||
} else {
|
||||
@@ -61,6 +63,7 @@ impl Engine {
|
||||
}
|
||||
env.lookup_cache(last, |_| unreachable!()).map(|mut val| {
|
||||
Ok(val
|
||||
.force(self, &mut env)?
|
||||
.to_public(self, &mut HashSet::new()))
|
||||
})?
|
||||
}
|
||||
@@ -71,19 +74,27 @@ impl Engine {
|
||||
}
|
||||
|
||||
pub fn eval_func_deps(&mut self, idx: usize, env: &mut Env) -> Result<()> {
|
||||
for dep in self.func_deps[idx - self.func_offset].clone() {
|
||||
match dep {
|
||||
for dep in
|
||||
unsafe { &*(&self.func_deps[idx - self.func_offset] as *const HashSet<Dep>) }.iter()
|
||||
{
|
||||
match *dep {
|
||||
Dep::Arg(idx) => {
|
||||
if let i::Value::Thunk(idx) = env.lookup_arg(idx) {
|
||||
let self_mut = unsafe { &mut *(self as *mut Self) };
|
||||
let val = self.thunks[idx].eval(self_mut, env)?;
|
||||
env.insert_cache(idx, val)
|
||||
env.insert_cache_lazy(idx, |env| {
|
||||
let engine = unsafe { &mut *(self as *mut Self) };
|
||||
let mut val = self.thunks[idx].eval(engine, env)?;
|
||||
val.force(engine, env)?;
|
||||
val.ok()
|
||||
})?;
|
||||
}
|
||||
}
|
||||
Dep::Thunk(idx) => {
|
||||
let self_mut = unsafe { &mut *(self as *mut Self) };
|
||||
let val = self.thunks[idx].eval(self_mut, env)?;
|
||||
env.insert_cache(idx, val)
|
||||
env.insert_cache_lazy(idx, |env| {
|
||||
let engine = unsafe { &mut *(self as *mut Self) };
|
||||
let mut val = self.thunks[idx].eval(engine, env)?;
|
||||
val.force(engine, env)?;
|
||||
val.ok()
|
||||
})?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user