aboutsummaryrefslogtreecommitdiff
path: root/lib/scope.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/scope.js')
-rw-r--r--lib/scope.js18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/scope.js b/lib/scope.js
index 0c35b0dd..4660c787 100644
--- a/lib/scope.js
+++ b/lib/scope.js
@@ -265,10 +265,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
}
if (!sym) {
sym = self.def_global(node);
- } else if (name == "arguments"
- && sym.orig[0] instanceof AST_SymbolFunarg
- && !(sym.orig[1] instanceof AST_SymbolFunarg)
- && !(sym.scope instanceof AST_Arrow)) {
+ } else if (name == "arguments" && is_arguments(sym)) {
var parent = tw.parent();
if (parent instanceof AST_Assign && parent.left === node
|| parent instanceof AST_Unary && unary_side_effects[parent.operator]) {
@@ -297,6 +294,13 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
node.reference(options);
return true;
}
+ if (node instanceof AST_VarDef) {
+ if (node.value && node.name.name == "arguments") {
+ var sym = node.name.scope.resolve().find_variable("arguments");
+ if (sym && is_arguments(sym)) sym.scope.uses_arguments = 3;
+ }
+ return;
+ }
});
self.walk(tw);
@@ -322,6 +326,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
}
}));
+ function is_arguments(sym) {
+ return sym.orig[0] instanceof AST_SymbolFunarg
+ && !(sym.orig[1] instanceof AST_SymbolFunarg || sym.orig[2] instanceof AST_SymbolFunarg)
+ && !(sym.scope instanceof AST_Arrow);
+ }
+
function redefine(node, scope) {
var name = node.name;
var old_def = node.thedef;