about summary refs log tree commit diff
path: root/tvix/eval/src/compiler
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-09-06T14·12+0300
committertazjin <tazjin@tvl.su>2022-09-11T12·04+0000
commit12acb1e2374ac0f5480cfbb262f2171d6df2918b (patch)
treed8386d3eeff92e2bfb7ff93d19806dfcf7b8f8bb /tvix/eval/src/compiler
parent9da99af86045b59867e6082ca99d602308553006 (diff)
refactor(tvix/eval): add `initialised` arg to declare_phantom r/4795
There are more upcomming uses of declare_phantom where this will come
in handy to avoid some code bloat.

Change-Id: I75cad8caf14511c519ab2f56e87e99bcbf0a082e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6467
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
Diffstat (limited to 'tvix/eval/src/compiler')
-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,
         });