fix(tvix/eval): correctly resolve dynamic upvalues one scope up
This does not yet correctly resolve them if they are more than one scope up, however. Change-Id: I6687073c60aee0282f2b6ffc98b34c1e96a60f20 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6319 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
e46a2ce3ef
commit
a5e22c532b
5 changed files with 29 additions and 6 deletions
|
|
@ -992,12 +992,6 @@ impl Compiler {
|
|||
LocalPosition::Unknown => { /* continue below */ }
|
||||
};
|
||||
|
||||
// Determine whether the upvalue is a dynamic variable in the
|
||||
// enclosing context.
|
||||
if self.contexts[ctx_idx - 1].scope.has_with() {
|
||||
return Some(self.add_upvalue(ctx_idx, Upvalue::Dynamic(SmolStr::new(name))));
|
||||
}
|
||||
|
||||
// If the upvalue comes from even further up, we need to
|
||||
// recurse to make sure that the upvalues are created at each
|
||||
// level.
|
||||
|
|
@ -1005,6 +999,13 @@ impl Compiler {
|
|||
return Some(self.add_upvalue(ctx_idx, Upvalue::Upvalue(idx)));
|
||||
}
|
||||
|
||||
// If the resolution of a statically known upvalue failed,
|
||||
// attempt to resolve a dynamic one (i.e. search for enclosing
|
||||
// `with` blocks and make that resolution dynamic).
|
||||
if self.contexts[ctx_idx - 1].scope.has_with() {
|
||||
return Some(self.add_upvalue(ctx_idx, Upvalue::Dynamic(SmolStr::new(name))));
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue