diff options
author | Vincent Ambo <mail@tazj.in> | 2022-09-03T00·09+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-08T19·54+0000 |
commit | ecbd7c6ca1e8331e7ef7f94bb4a196d78bcc895c (patch) | |
tree | 4c6568b760235d381d7522769ba0ef178891c678 | |
parent | f8575fcd747eb3fe05413611eb97e26981bc9e1b (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
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 4 | ||||
-rw-r--r-- | tvix/eval/src/compiler/scope.rs | 4 |
2 files changed, 3 insertions, 5 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 diff --git a/tvix/eval/src/compiler/scope.rs b/tvix/eval/src/compiler/scope.rs index d691a1ae7228..eb722a2c6972 100644 --- a/tvix/eval/src/compiler/scope.rs +++ b/tvix/eval/src/compiler/scope.rs @@ -128,10 +128,6 @@ pub struct Upvalue { #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)] pub struct LocalIdx(usize); -impl LocalIdx { - pub const ZERO: LocalIdx = LocalIdx(0); -} - /// Represents a scope known during compilation, which can be resolved /// directly to stack indices. /// |