From fc24278b0a8aaf46e3866ede225d6e780b778d31 Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:43:49 +0300 Subject: [PATCH] refactor: change how function scope keeps track of arguments --- .../compilation/scope/FunctionScope.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/java/me/topchetoeu/jscript/compilation/scope/FunctionScope.java b/src/java/me/topchetoeu/jscript/compilation/scope/FunctionScope.java index 691ca0e..5741a63 100644 --- a/src/java/me/topchetoeu/jscript/compilation/scope/FunctionScope.java +++ b/src/java/me/topchetoeu/jscript/compilation/scope/FunctionScope.java @@ -9,8 +9,6 @@ public class FunctionScope extends Scope { private final VariableList specials = new VariableList(); private final VariableList locals = new VariableList(specials); private HashMap childToParent = new HashMap<>(); - public final String selfName; - public final VariableDescriptor selfVar; private void removeCapture(String name) { var res = captures.remove(name); @@ -29,12 +27,19 @@ public class FunctionScope extends Scope { else if (parent == null) throw new RuntimeException("Strict variables may be defined only in local scopes"); else return parent.defineStrict(name, readonly, loc); } + public VariableDescriptor defineArg(String name, Location loc) { + return specials.add(name, false); + } + public boolean hasArg(String name) { + return specials.has(name); + } - @Override public VariableDescriptor get(String name, boolean capture) { - if (specials.has(name)) return specials.get(name); - if (locals.has(name)) return locals.get(name); - if (captures.has(name)) return captures.get(name); - if (selfName != null && selfName.equals(name)) return selfVar; + public VariableDescriptor get(String name, boolean capture, boolean skipSelf) { + if (!skipSelf) { + if (specials.has(name)) return specials.get(name); + if (locals.has(name)) return locals.get(name); + if (captures.has(name)) return captures.get(name); + } var parentVar = parent.get(name, true); if (parentVar == null) return null; @@ -46,6 +51,10 @@ public class FunctionScope extends Scope { return childVar; } + @Override public VariableDescriptor get(String name, boolean capture) { + return get(name, capture, false); + } + @Override public boolean has(String name) { if (specials.has(name)) return true; if (locals.has(name)) return true; @@ -89,22 +98,10 @@ public class FunctionScope extends Scope { return res; } - public FunctionScope(String selfName, String[] args) { + public FunctionScope() { super(); - this.selfName = selfName; - - if (selfName != null) this.selfVar = VariableDescriptor.of(selfName, true, -1); - else this.selfVar = null; - - for (var arg : args) specials.add(arg, false); } - public FunctionScope(String selfName, String[] args, Scope parent) { + public FunctionScope(Scope parent) { super(parent); - this.selfName = selfName; - - if (selfName != null) this.selfVar = VariableDescriptor.of(selfName, true, -1); - else this.selfVar = null; - - for (var arg : args) specials.add(arg, false); } }