From: Alex Lam S.L Date: Sat, 23 Jan 2021 23:05:43 +0000 (+0000) Subject: fix corner case in `collapse_vars` (#4587) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=ef9f7ca3e7c7f71df440645f782b3a7da4646d9b;p=UglifyJS.git fix corner case in `collapse_vars` (#4587) fixes #4586 --- diff --git a/lib/compress.js b/lib/compress.js index c6ebb34c..f4441775 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2345,6 +2345,7 @@ merge(Compressor.prototype, { if (expr.operator == "=" && lhs instanceof AST_SymbolRef && (def = lhs.definition()).references[0] === lhs + && !(scope.uses_arguments && is_funarg(def)) && !compressor.exposed(def)) { var referenced = def.references.length - def.replaced; if (referenced > 1) mangleable_var(expr.right); @@ -2357,6 +2358,7 @@ merge(Compressor.prototype, { var def = expr.name.definition(); if (def.const_redefs) return; if (!member(expr.name, def.orig)) return; + if (scope.uses_arguments && is_funarg(def)) return; var declared = def.orig.length - def.eliminated - (declare_only[def.name] || 0); var referenced = def.references.length - def.replaced - (assignments[def.name] || 0); if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg)) { diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 258df6f7..963906c5 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -8705,3 +8705,48 @@ collapse_or_assign: { } expect_stdout: "PASS" } + +issue_4586_1: { + options = { + collapse_vars: true, + } + input: { + var a = 42; + (function f(b) { + var b = a; + if (b === arguments[0]) + console.log("PASS"); + })(console); + } + expect: { + var a = 42; + (function f(b) { + var b = a; + if (b === arguments[0]) + console.log("PASS"); + })(console); + } + expect_stdout: "PASS" +} + +issue_4586_2: { + options = { + collapse_vars: true, + } + input: { + var a = 42; + (function f(b) { + b = a; + if (b === arguments[0]) + console.log("PASS"); + })(console); + } + expect: { + var a = 42; + (function f(b) { + if ((b = a) === arguments[0]) + console.log("PASS"); + })(console); + } + expect_stdout: "PASS" +}