diff options
Diffstat (limited to 'tvix/eval/src/compiler/mod.rs')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 458c7b432899..1df44bdfde37 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -678,6 +678,7 @@ impl Compiler { } // Second pass to place the values in the correct stack slots. + let indices: Vec<usize> = entries.iter().map(|(idx, _)| *idx).collect(); for (idx, value) in entries.into_iter() { self.compile(Some(idx), value); @@ -686,6 +687,13 @@ impl Compiler { self.mark_initialised(idx); } + // Third pass to emit finaliser instructions if necessary. + for idx in indices { + if self.scope().locals[idx].needs_finaliser { + self.chunk().push_op(OpCode::OpFinalise(StackIdx(idx))); + } + } + // Deal with the body, then clean up the locals afterwards. self.compile(None, node.body().unwrap()); self.end_scope(); |