diff options
-rw-r--r-- | lib/compress.js | 5 | ||||
-rw-r--r-- | test/compress/arguments.js | 26 |
2 files changed, 28 insertions, 3 deletions
diff --git a/lib/compress.js b/lib/compress.js index e05b6f28..2a8ba8a0 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -9572,13 +9572,14 @@ merge(Compressor.prototype, { } } var parent = compressor.parent(); + var assigned = is_lhs(compressor.self(), parent); var def, fn, fn_parent; if (compressor.option("arguments") && expr instanceof AST_SymbolRef && is_arguments(def = expr.definition()) && prop instanceof AST_Number && (fn = expr.scope.resolve()) === find_lambda() - && fn.uses_arguments !== "d") { + && !(assigned && fn.uses_arguments === "d")) { var index = prop.value; if (parent instanceof AST_UnaryPrefix && parent.operator == "delete") { if (!def.deleted) def.deleted = []; @@ -9616,7 +9617,7 @@ merge(Compressor.prototype, { return sym; } } - if (is_lhs(compressor.self(), parent)) return self; + if (assigned) return self; if (compressor.option("sequences") && parent.TYPE != "Call" && !(parent instanceof AST_ForIn && parent.init === self)) { diff --git a/test/compress/arguments.js b/test/compress/arguments.js index 37307ed5..4b09a99a 100644 --- a/test/compress/arguments.js +++ b/test/compress/arguments.js @@ -808,7 +808,7 @@ issue_4200: { expect_stdout: "undefined" } -issue_4291: { +issue_4291_1: { options = { arguments: true, keep_fargs: "strict", @@ -827,3 +827,27 @@ issue_4291: { } expect_stdout: "PASS" } + +issue_4291_2: { + options = { + arguments: true, + keep_fargs: "strict", + } + input: { + var a = function() { + if (arguments[0]) + arguments[1] = "PASS"; + return arguments; + }(42); + console.log(a[1], a[0], a.length); + } + expect: { + var a = function(argument_0) { + if (argument_0) + arguments[1] = "PASS"; + return arguments; + }(42); + console.log(a[1], a[0], a.length); + } + expect_stdout: "PASS 42 1" +} |