diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-26T21·21+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-03T21·55+0000 |
commit | 69d8f17a26db50e7b76297dbf588aafc23425c71 (patch) | |
tree | 227759e59cfc419b3cdc8a4b6de38e2301f6b38a /tvix/eval/src/vm.rs | |
parent | e4fadfaaf8b7e821b77ce4dc41b915ff83f8e240 (diff) |
feat(tvix/eval): compile creation of closure objects r/4625
Fully implements the instructions for compiling closure objects (without runtime handling yet). Closure (and thunk) objects are created at runtime by capturing all known upvalues. To represent this, the instructions for creating them need to have a variable number of arguments. Due to that, this commit introduces new variants in OpCode that are not actually operations, but data. If the VM is implemented correctly, the instruction pointer should never point at these. Due to this, the VM will panic if it sees a data operand during an execution run. Change-Id: Ic56b49b3a42736dc437751e76df0e89c8d0619c6 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6291 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval/src/vm.rs')
-rw-r--r-- | tvix/eval/src/vm.rs | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 1c7772f2a7e0..5ebc95e7f15e 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -357,7 +357,7 @@ impl VM { OpCode::OpCall => { let callable = self.pop(); match callable { - Value::Closure(Closure { lambda }) => self.call(lambda, 1), + Value::Closure(Closure { lambda, .. }) => self.call(lambda, 1), Value::Builtin(builtin) => { let arg = self.pop(); let result = builtin.apply(arg)?; @@ -368,6 +368,13 @@ impl VM { } OpCode::OpGetUpvalue(_) => todo!("getting upvalues"), + OpCode::OpClosure(_) => todo!("creating closure objects"), + + // Data-carrying operands should never be executed, + // that is a critical error in the VM. + OpCode::DataLocalIdx(_) | OpCode::DataUpvalueIdx(_) => { + panic!("VM bug: attempted to execute data-carrying operand") + } } #[cfg(feature = "disassembler")] |