diff options
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 11 | ||||
-rw-r--r-- | tvix/eval/src/compiler/scope.rs | 6 |
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, }); |