diff options
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 3 | ||||
-rw-r--r-- | tvix/eval/src/opcode.rs | 2 |
2 files changed, 3 insertions, 2 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index d02c0e69c5ca..68ff3d48a3df 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -969,6 +969,7 @@ impl Compiler<'_> { /// Emit the data instructions that the runtime needs to correctly /// assemble the provided upvalues array. fn emit_upvalue_data(&mut self, slot: LocalIdx, upvalues: Vec<Upvalue>) { + let this_stack_slot = self.scope().stack_index(slot); for upvalue in upvalues { match upvalue.kind { UpvalueKind::Local(idx) => { @@ -978,7 +979,7 @@ impl Compiler<'_> { // closure, the upvalue resolution must be // deferred until the scope is fully initialised // and can be finalised. - if slot < idx { + if this_stack_slot < stack_idx { self.push_op(OpCode::DataDeferredLocal(stack_idx), &upvalue.node); self.scope_mut().mark_needs_finaliser(slot); } else { diff --git a/tvix/eval/src/opcode.rs b/tvix/eval/src/opcode.rs index b009686736bc..871111883ba4 100644 --- a/tvix/eval/src/opcode.rs +++ b/tvix/eval/src/opcode.rs @@ -13,7 +13,7 @@ pub struct CodeIdx(pub usize); /// Index of a value in the runtime stack. #[repr(transparent)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)] pub struct StackIdx(pub usize); /// Index of an upvalue within a closure's upvalue list. |