diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-24T19·37+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-03T00·47+0000 |
commit | 265393301e2b59659a0a5db15e42bc668d0c7c68 (patch) | |
tree | 99e84f2f9a2d509d9d4a4e47e5141a911931daa1 /tvix/eval/src/compiler/mod.rs | |
parent | 6ce2c666c32a3ecb5512a5b186896ae1a1f84838 (diff) |
refactor(tvix/eval): move resolve_local to Scope struct r/4606
This is a more sensible place for this function to live and makes upvalue resolution easier down the line. Change-Id: I48ee39bdcdb4f96a16a327f7015aff60db5b15fb Reviewed-on: https://cl.tvl.fyi/c/depot/+/6270 Reviewed-by: grfn <grfn@gws.fyi> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/compiler/mod.rs')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 3160c68c6e3c..7b92b8a099c2 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -114,6 +114,18 @@ impl Scope { self.poisoned_tokens .retain(|_, poisoned_at| *poisoned_at != depth); } + + /// Resolve the stack index of a statically known local. + fn resolve_local(&mut self, name: &str) -> Option<usize> { + for (idx, local) in self.locals.iter_mut().enumerate().rev() { + if !local.phantom && local.name == name { + local.used = true; + return Some(idx); + } + } + + None + } } /// Represents the lambda currently being compiled. @@ -500,7 +512,10 @@ impl Compiler { count += 1; self.emit_literal_ident(&ident); - match self.resolve_local(ident.ident_token().unwrap().text()) { + match self + .scope_mut() + .resolve_local(ident.ident_token().unwrap().text()) + { Some(idx) => self.chunk().push_op(OpCode::OpGetLocal(idx)), None => { self.emit_error( @@ -674,6 +689,7 @@ impl Compiler { // has precedence over dynamic bindings, and // the inherit is useless. if self + .scope_mut() .resolve_local(ident.ident_token().unwrap().text()) .is_some() { @@ -751,7 +767,7 @@ impl Compiler { } } - match self.resolve_local(ident.text()) { + match self.scope_mut().resolve_local(ident.text()) { Some(idx) => self.chunk().push_op(OpCode::OpGetLocal(idx)), None => { if self.scope().with_stack.is_empty() { @@ -952,19 +968,6 @@ impl Compiler { }); } - fn resolve_local(&mut self, name: &str) -> Option<usize> { - let scope = self.scope_mut(); - - for (idx, local) in scope.locals.iter_mut().enumerate().rev() { - if !local.phantom && local.name == name { - local.used = true; - return Some(idx); - } - } - - None - } - fn emit_warning(&mut self, node: rnix::SyntaxNode, kind: WarningKind) { self.warnings.push(EvalWarning { node, kind }) } |