From fac003c64f5512692e67e41a55b21c74a32a3c6b Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 20 Dec 2017 02:48:04 +0800 Subject: [PATCH] avoid `inline` of function with special argument names (#2625) --- lib/compress.js | 2 + test/compress/functions.js | 94 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 4 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index c95e4f84..5aacfd73 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -858,6 +858,7 @@ merge(Compressor.prototype, { || compressor.option("unsafe") && global_names(this.name); }); + var identifier_atom = makePredicate("Infinity NaN undefined"); function is_identifier_atom(node) { return node instanceof AST_Infinity || node instanceof AST_NaN @@ -4015,6 +4016,7 @@ merge(Compressor.prototype, { return arg.__unused || safe_to_inject && !catches[arg.name] + && !identifier_atom(arg.name) && !scope.var_names()[arg.name]; }) && scope; } diff --git a/test/compress/functions.js b/test/compress/functions.js index bd65a11d..4c22652e 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -1092,10 +1092,9 @@ issue_2616: { expect: { var c = "FAIL"; (function() { - (function() { - NaN = [], (true << NaN) - 0/0 || (c = "PASS"); - var NaN; - })(); + !function(NaN) { + (true << NaN) - 0/0 || (c = "PASS"); + }([]); })(); console.log(c); } @@ -1172,3 +1171,90 @@ issue_2620_2: { } expect_stdout: "PASS" } + +issue_2620_3: { + options = { + evaluate: true, + inline: true, + reduce_vars: true, + side_effects: true, + unused: true, + } + input: { + var c = "FAIL"; + (function() { + function f(a, NaN) { + function g() { + switch (a) { + case a: + break; + case c = "PASS", NaN: + break; + } + } + g(); + } + f(0/0); + })(); + console.log(c); + } + expect: { + var c = "FAIL"; + (function() { + (function(a, NaN) { + (function() { + switch (a) { + case a: + break; + case c = "PASS", NaN: + break; + } + })(); + })(NaN); + })(); + console.log(c); + } + expect_stdout: "PASS" +} + +issue_2620_4: { + rename = true, + options = { + evaluate: true, + dead_code: true, + inline: true, + passes: 2, + reduce_vars: true, + side_effects: true, + switches: true, + unused: true, + } + input: { + var c = "FAIL"; + (function() { + function f(a, NaN) { + function g() { + switch (a) { + case a: + break; + case c = "PASS", NaN: + break; + } + } + g(); + } + f(0/0); + })(); + console.log(c); + } + expect: { + var c = "FAIL"; + !function() { + switch (NaN) { + case void (c = "PASS"): + } + }(); + console.log(c); + } + expect_stdout: "PASS" +} -- 2.34.1