fix corner case in `evaluate` & `reduce_vars` (#4423)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 19 Dec 2020 21:47:15 +0000 (21:47 +0000)
committerGitHub <noreply@github.com>
Sat, 19 Dec 2020 21:47:15 +0000 (05:47 +0800)
fixes #4422

lib/compress.js
test/compress/evaluate.js

index d99310e..7c1c3b4 100644 (file)
@@ -595,7 +595,14 @@ merge(Compressor.prototype, {
             var expr = node.expression;
             if (!(expr instanceof AST_SymbolRef)) return;
             var def = expr.definition();
-            if (is_arguments(def) && node.property instanceof AST_Number) def.reassigned = true;
+            if (!is_arguments(def)) return;
+            var key = node.property;
+            if (key.is_constant()) key = key.value;
+            if (!(key instanceof AST_Node) && !/^[1-9]*[0-9]$/.test(key)) return;
+            def.reassigned = true;
+            (key instanceof AST_Node ? def.scope.argnames : [ def.scope.argnames[key] ]).forEach(function(argname) {
+                if (argname instanceof AST_SymbolFunarg) argname.definition().fixed = false;
+            });
         }
 
         function scan_declaration(tw, lhs, fixed, visit) {
index 8ef1a46..7466d63 100644 (file)
@@ -3094,3 +3094,26 @@ issue_4393: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4422: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        console.log(function f(a) {
+            a = "FAIL 1";
+            arguments[0] = "PASS";
+            return a;
+        }("FAIL 2"));
+    }
+    expect: {
+        console.log(function(a) {
+            a = "FAIL 1";
+            arguments[0] = "PASS";
+            return a;
+        }("FAIL 2"));
+    }
+    expect_stdout: "PASS"
+}