diff options
Diffstat (limited to 'tvix/eval/src/compiler')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 10 | ||||
-rw-r--r-- | tvix/eval/src/compiler/scope.rs | 10 |
2 files changed, 18 insertions, 2 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 2ab76623864b..2985c7e90e0b 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -54,7 +54,7 @@ struct LambdaCtx { impl LambdaCtx { fn new() -> Self { LambdaCtx { - lambda: Lambda::new_anonymous(), + lambda: Lambda::default(), scope: Default::default(), captures_with_stack: false, } @@ -62,7 +62,7 @@ impl LambdaCtx { fn inherit(&self) -> Self { LambdaCtx { - lambda: Lambda::new_anonymous(), + lambda: Lambda::default(), scope: self.scope.inherit(), captures_with_stack: false, } @@ -897,7 +897,13 @@ impl Compiler<'_> { N: ToSpan, F: FnOnce(&mut Compiler, LocalIdx), { + let name = self.scope()[outer_slot].name(); self.new_context(); + + // Set the (optional) name of the current slot on the lambda that is + // being compiled. + self.context_mut().lambda.name = name; + let span = self.span_for(node); let slot = self.scope_mut().declare_phantom(span, false); self.scope_mut().begin_scope(); diff --git a/tvix/eval/src/compiler/scope.rs b/tvix/eval/src/compiler/scope.rs index 9269a3c44c76..83fba6eed73c 100644 --- a/tvix/eval/src/compiler/scope.rs +++ b/tvix/eval/src/compiler/scope.rs @@ -15,6 +15,8 @@ use std::{ ops::Index, }; +use smol_str::SmolStr; + use crate::opcode::{StackIdx, UpvalueIdx}; #[derive(Debug)] @@ -71,6 +73,14 @@ impl Local { } } + /// Retrieve the name of the given local (if available). + pub fn name(&self) -> Option<SmolStr> { + match &self.name { + LocalName::Phantom => None, + LocalName::Ident(name) => Some(SmolStr::new(name)), + } + } + /// Is this local intentionally ignored? (i.e. name starts with `_`) pub fn is_ignored(&self) -> bool { match &self.name { |