fix(tvix/eval): avoid forcing with-target until absolutely necessary
Change-Id: I00efbbb8b9d3d22f32becf0919c6adf1be8b4b69 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6465 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
bb34665abd
commit
27e69503a7
2 changed files with 11 additions and 5 deletions
|
@ -862,7 +862,6 @@ impl Compiler<'_, '_> {
|
|||
// resolve that directly (thus avoiding duplication on the
|
||||
// stack).
|
||||
self.compile(slot, node.namespace().unwrap());
|
||||
self.emit_force(&node.namespace().unwrap());
|
||||
|
||||
let span = self.span_for(&node.namespace().unwrap());
|
||||
|
||||
|
|
|
@ -635,10 +635,17 @@ impl<'o> VM<'o> {
|
|||
}
|
||||
|
||||
/// Resolve a dynamic identifier through the with-stack at runtime.
|
||||
fn resolve_with(&self, ident: &str) -> EvalResult<Value> {
|
||||
for idx in self.with_stack.iter().rev() {
|
||||
let with = fallible!(self, self.stack[*idx].to_attrs());
|
||||
match with.select(ident) {
|
||||
fn resolve_with(&mut self, ident: &str) -> EvalResult<Value> {
|
||||
// Iterate over the with_stack manually to avoid borrowing
|
||||
// self, which is required for forcing the set.
|
||||
for with_stack_idx in (0..self.with_stack.len()).rev() {
|
||||
let with = self.stack[self.with_stack[with_stack_idx]].clone();
|
||||
|
||||
if let Value::Thunk(thunk) = &with {
|
||||
fallible!(self, thunk.force(self));
|
||||
}
|
||||
|
||||
match fallible!(self, with.to_attrs()).select(ident) {
|
||||
None => continue,
|
||||
Some(val) => return Ok(val.clone()),
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue