From 83b124f0d652e618c6e3f0f57667c8a4a1224217 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Fri, 14 Oct 2016 18:04:39 +0200 Subject: [PATCH 1/2] fix uses_arguments handling (broken since 6605d1578351) Using the symbol declaration tracking of UglifyJS doesn't make sense here anyway, `arguments` always comes from something in the current scope. fixes #1299 --- lib/scope.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index fb583291..4943b568 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -204,6 +204,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ } } var sym = node.scope.find_variable(name); + if (node.scope instanceof AST_Lambda && name == "arguments") { + node.scope.uses_arguments = true; + } if (!sym) { var g; if (globals.has(name)) { @@ -215,9 +218,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ globals.set(name, g); } sym = g; - if (func && name == "arguments") { - func.uses_arguments = true; - } } node.thedef = sym; if (parent instanceof AST_Unary && (parent.operator === '++' || parent.operator === '--') From 8614c7b814cbfddc7bd996ef19d4a43d0092f981 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Fri, 14 Oct 2016 19:23:34 +0200 Subject: [PATCH 2/2] add mocha test for issue #1299 (uses_arguments) --- test/mocha/arguments.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/mocha/arguments.js b/test/mocha/arguments.js index 089826fc..73993a73 100644 --- a/test/mocha/arguments.js +++ b/test/mocha/arguments.js @@ -19,4 +19,12 @@ describe("arguments", function() { 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); + }); }); \ No newline at end of file