diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-27T00·31+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-04T17·40+0000 |
commit | 33cde1422e473770ab0ca30759ece618cb4c3680 (patch) | |
tree | 163268a01d64d0154339354a863cd18412f4f053 /tvix/eval/src/vm.rs | |
parent | 10b0879c009098d3c5f9fe21067ff656a29442a5 (diff) |
feat(tvix/eval): implement upvalue resolution in `with` scopes r/4635
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>
Diffstat (limited to 'tvix/eval/src/vm.rs')
-rw-r--r-- | tvix/eval/src/vm.rs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 4ce3505cdb9a..707d2f4b26b3 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -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") } } |