From b8477148b64fcdd9b04c6acc5870999f723db8f4 Mon Sep 17 00:00:00 2001 From: numzero Date: Sat, 19 Apr 2025 12:05:17 +0300 Subject: [PATCH] scoping! --- src/twopass.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/twopass.rs b/src/twopass.rs index 37b3ae3..a75ce4a 100644 --- a/src/twopass.rs +++ b/src/twopass.rs @@ -68,6 +68,18 @@ impl Scope { .collect(), } } + + fn lookup(&self, name: &ast::Ident) -> Option { + self.scope.get(name).copied() + } + + fn add_upvalue(&mut self, name: &ast::Ident, up_ident: Ident) -> Ident { + let index = self.upvalues.len(); + self.upvalues.push((name.clone(), up_ident)); + let ident = Ident::Upvalue(index); + self.scope.insert(name.clone(), ident); + ident + } } #[derive(Debug)] @@ -78,16 +90,11 @@ struct BuildContext<'a> { impl BuildContext<'_> { fn request(&self, name: &ast::Ident) -> Option { - let mut scope = self.scope.borrow_mut(); - if let Some(ident) = scope.scope.get(name) { - return Some(*ident); + if let Some(ident) = self.scope.borrow().lookup(name) { + return Some(ident); } if let Some(ident) = self.parent.as_ref()?.request(name) { - let index = scope.upvalues.len(); - scope.upvalues.push((name.clone(), ident)); - let ident = Ident::Upvalue(index); - scope.scope.insert(name.clone(), ident); - return Some(ident); + return Some(self.scope.borrow_mut().add_upvalue(name, ident)); } None }