diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-26T23·15+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-03T21·55+0000 |
commit | 0f06d0ca333d879f914fb6f8e0803a9d5acd3d03 (patch) | |
tree | a173232ffa93b0dbf4eeb90b586590943f7ac889 /tvix/eval | |
parent | 3d8888a13e20954f608dc0622ca04fe9abd10149 (diff) |
feat(tvix/eval): implement OpGetUpvalue in the VM r/4628
This resolves an upvalue at runtime by pushing it on the stack from the closure's upvalue vector. Change-Id: Ic3e7a7ecd9f7032f679114a1995e5bbf83062fcf Reviewed-on: https://cl.tvl.fyi/c/depot/+/6294 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/src/vm.rs | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 1429169efc13..58345ca7cc27 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -6,7 +6,7 @@ use std::rc::Rc; use crate::{ chunk::Chunk, errors::{ErrorKind, EvalResult}, - opcode::{Count, JumpOffset, OpCode, StackIdx}, + opcode::{Count, JumpOffset, OpCode, StackIdx, UpvalueIdx}, value::{Closure, Lambda, NixAttrs, NixList, Value}, }; @@ -320,8 +320,7 @@ impl VM { OpCode::OpGetLocal(StackIdx(local_idx)) => { let idx = self.frame().stack_offset + local_idx; - let value = self.stack[idx].clone(); - self.push(value) + self.push(self.stack[idx].clone()); } OpCode::OpPushWith(StackIdx(idx)) => self.with_stack.push(idx), @@ -367,8 +366,11 @@ impl VM { }; } - OpCode::OpGetUpvalue(_) => todo!("getting upvalues"), OpCode::OpClosure(_) => todo!("creating closure objects"), + OpCode::OpGetUpvalue(UpvalueIdx(upv_idx)) => { + let value = self.frame().closure.upvalues[upv_idx].clone(); + self.push(value); + } // Data-carrying operands should never be executed, // that is a critical error in the VM. |