fix uses_arguments handling (broken since 6605d15783)

Using the symbol declaration tracking of UglifyJS doesn't make sense here
anyway, `arguments` always comes from something in the current scope.

fixes #1299
This commit is contained in:
Jann Horn
2016-10-14 18:04:39 +02:00
committed by Richard van Velzen
parent e51c6ba380
commit 266ddd9639
2 changed files with 11 additions and 3 deletions

View File

@@ -204,6 +204,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
} }
} }
var sym = node.scope.find_variable(name); var sym = node.scope.find_variable(name);
if (node.scope instanceof AST_Lambda && name == "arguments") {
node.scope.uses_arguments = true;
}
if (!sym) { if (!sym) {
var g; var g;
if (globals.has(name)) { if (globals.has(name)) {
@@ -215,9 +218,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
globals.set(name, g); globals.set(name, g);
} }
sym = g; sym = g;
if (func && name == "arguments") {
func.uses_arguments = true;
}
} }
node.thedef = sym; node.thedef = sym;
if (parent instanceof AST_Unary && (parent.operator === '++' || parent.operator === '--') if (parent instanceof AST_Unary && (parent.operator === '++' || parent.operator === '--')

View File

@@ -19,4 +19,12 @@ describe("arguments", function() {
value // Select function as scope value // Select function as scope
); );
}); });
it("Should recognize when a function uses arguments", function() {
var ast = UglifyJS.parse("function a(){function b(){function c(){}; return arguments[0];}}");
ast.figure_out_scope();
assert.strictEqual(ast.body[0].uses_arguments, false);
assert.strictEqual(ast.body[0].body[0].uses_arguments, true);
assert.strictEqual(ast.body[0].body[0].body[0].uses_arguments, false);
});
}); });