avoid `inline` of function with special argument names (#2625)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 19 Dec 2017 18:48:04 +0000 (02:48 +0800)
committerGitHub <noreply@github.com>
Tue, 19 Dec 2017 18:48:04 +0000 (02:48 +0800)
lib/compress.js
test/compress/functions.js

index c95e4f8..5aacfd7 100644 (file)
@@ -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;
         }
index bd65a11..4c22652 100644 (file)
@@ -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"
+}