about summary refs log tree commit diff
path: root/tvix/eval/src/compiler/mod.rs
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-09-03T00·09+0300
committertazjin <tazjin@tvl.su>2022-09-08T19·54+0000
commitecbd7c6ca1e8331e7ef7f94bb4a196d78bcc895c (patch)
tree4c6568b760235d381d7522769ba0ef178891c678 /tvix/eval/src/compiler/mod.rs
parentf8575fcd747eb3fe05413611eb97e26981bc9e1b (diff)
fix(tvix/eval): ensure that root stack slot actually exists r/4757
Instead of using a sentinel LocalIdx which potentially points to a
value in the locals stack that does not actually exist, set up an
initial uninitialised phantom value representing the result of the
root expression.

Change-Id: I82ea774daab83168020a3850bed57d35ab25c7df
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6424
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/compiler/mod.rs')
-rw-r--r--tvix/eval/src/compiler/mod.rs4
1 files changed, 3 insertions, 1 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs
index 68ff3d48a3df..caf326828fd7 100644
--- a/tvix/eval/src/compiler/mod.rs
+++ b/tvix/eval/src/compiler/mod.rs
@@ -1382,7 +1382,9 @@ pub fn compile<'code>(
         c.context_mut().lambda.chunk.codemap = c.codemap.clone();
     }
 
-    c.compile(LocalIdx::ZERO, expr.clone());
+    let root_span = c.span_for(&expr);
+    let root_slot = c.scope_mut().declare_phantom(root_span);
+    c.compile(root_slot, expr.clone());
 
     // The final operation of any top-level Nix program must always be
     // `OpForce`. A thunk should not be returned to the user in an