fix corner case in `collapse_vars` (#4587)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 23 Jan 2021 23:05:43 +0000 (23:05 +0000)
committerGitHub <noreply@github.com>
Sat, 23 Jan 2021 23:05:43 +0000 (07:05 +0800)
fixes #4586

lib/compress.js
test/compress/collapse_vars.js

index c6ebb34..f444177 100644 (file)
@@ -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)) {
index 258df6f..963906c 100644 (file)
@@ -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"
+}