about summary refs log tree commit diff
path: root/tvix/eval
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/eval')
-rw-r--r--tvix/eval/src/compiler/mod.rs11
-rw-r--r--tvix/eval/src/compiler/scope.rs6
2 files changed, 8 insertions, 9 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs
index 89b90f967268..e119c866bc49 100644
--- a/tvix/eval/src/compiler/mod.rs
+++ b/tvix/eval/src/compiler/mod.rs
@@ -870,8 +870,7 @@ impl Compiler<'_, '_> {
         // directly accessible. As it must be accounted for to
         // calculate correct offsets, what we call a "phantom" local
         // is declared here.
-        let local_idx = self.scope_mut().declare_phantom(span);
-        self.scope_mut().mark_initialised(local_idx);
+        let local_idx = self.scope_mut().declare_phantom(span, true);
         let with_idx = self.scope().stack_index(local_idx);
 
         self.scope_mut().push_with();
@@ -918,7 +917,7 @@ impl Compiler<'_, '_> {
         let span = self.span_for(&pattern);
         let set_idx = match pattern.pat_bind() {
             Some(name) => self.declare_local(&name, name.ident().unwrap().to_string()),
-            None => self.scope_mut().declare_phantom(span),
+            None => self.scope_mut().declare_phantom(span, true),
         };
 
         // At call time, the attribute set is already at the top of
@@ -983,7 +982,7 @@ impl Compiler<'_, '_> {
     fn compile_lambda(&mut self, outer_slot: LocalIdx, node: ast::Lambda) {
         self.new_context();
         let span = self.span_for(&node);
-        let slot = self.scope_mut().declare_phantom(span);
+        let slot = self.scope_mut().declare_phantom(span, false);
         self.begin_scope();
 
         // Compile the function itself
@@ -1057,7 +1056,7 @@ impl Compiler<'_, '_> {
     {
         self.new_context();
         let span = self.span_for(node);
-        let slot = self.scope_mut().declare_phantom(span);
+        let slot = self.scope_mut().declare_phantom(span, false);
         self.begin_scope();
         content(self, node, slot);
         self.cleanup_scope(node);
@@ -1487,7 +1486,7 @@ pub fn compile(
     };
 
     let root_span = c.span_for(&expr);
-    let root_slot = c.scope_mut().declare_phantom(root_span);
+    let root_slot = c.scope_mut().declare_phantom(root_span, false);
     c.compile(root_slot, expr.clone());
 
     // The final operation of any top-level Nix program must always be
diff --git a/tvix/eval/src/compiler/scope.rs b/tvix/eval/src/compiler/scope.rs
index 7c1e65265e1d..ca8512d409c8 100644
--- a/tvix/eval/src/compiler/scope.rs
+++ b/tvix/eval/src/compiler/scope.rs
@@ -234,13 +234,13 @@ impl Scope {
     /// Declare a local variable that occupies a stack slot and should
     /// be accounted for, but is not directly accessible by users
     /// (e.g. attribute sets used for `with`).
-    pub fn declare_phantom(&mut self, span: codemap::Span) -> LocalIdx {
+    pub fn declare_phantom(&mut self, span: codemap::Span, initialised: bool) -> LocalIdx {
         let idx = self.locals.len();
         self.locals.push(Local {
-            name: LocalName::Phantom,
+            initialised,
             span,
+            name: LocalName::Phantom,
             depth: self.scope_depth,
-            initialised: false,
             needs_finaliser: false,
             used: true,
         });