feat(tvix/eval): implement upvalue resolution in with scopes
These need to be handled specially by the runtime if the compiler determines that a given local must be resolved via `with`. Note that this implementation has a bug: It currently allows `with` inside of nested lambdas to shadow statically known identifiers. This will be cleaned up in the next commit. Change-Id: If196b99cbd1a0f2dbb4a40a0e88cdb09a009c6b9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6299 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
10b0879c00
commit
33cde1422e
7 changed files with 47 additions and 2 deletions
|
|
@ -379,6 +379,11 @@ impl VM {
|
|||
.push(self.frame().closure.upvalues[upv_idx].clone());
|
||||
}
|
||||
|
||||
OpCode::DataDynamicIdx(ident_idx) => {
|
||||
let ident = self.chunk().constant(ident_idx).as_str()?;
|
||||
closure.upvalues.push(self.resolve_with(ident)?);
|
||||
}
|
||||
|
||||
_ => panic!("compiler error: missing closure operand"),
|
||||
}
|
||||
}
|
||||
|
|
@ -388,7 +393,7 @@ impl VM {
|
|||
|
||||
// Data-carrying operands should never be executed,
|
||||
// that is a critical error in the VM.
|
||||
OpCode::DataLocalIdx(_) | OpCode::DataUpvalueIdx(_) => {
|
||||
OpCode::DataLocalIdx(_) | OpCode::DataUpvalueIdx(_) | OpCode::DataDynamicIdx(_) => {
|
||||
panic!("VM bug: attempted to execute data-carrying operand")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue