about summary refs log tree commit diff
path: root/tvix/eval/src
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-08-24T19·37+0300
committertazjin <tazjin@tvl.su>2022-09-03T00·47+0000
commit265393301e2b59659a0a5db15e42bc668d0c7c68 (patch)
tree99e84f2f9a2d509d9d4a4e47e5141a911931daa1 /tvix/eval/src
parent6ce2c666c32a3ecb5512a5b186896ae1a1f84838 (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')
-rw-r--r--tvix/eval/src/compiler/mod.rs33
1 files changed, 18 insertions, 15 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs
index 3160c68c6e..7b92b8a099 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 })
     }