fix corner case in `rename` (#3481)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 15 Oct 2019 11:44:07 +0000 (19:44 +0800)
committerGitHub <noreply@github.com>
Tue, 15 Oct 2019 11:44:07 +0000 (19:44 +0800)
fixes #3480

lib/mozilla-ast.js
lib/output.js
lib/scope.js
test/compress/rename.js

index dace808..b6fb29b 100644 (file)
         var def = M.definition();
         return {
             type: "Identifier",
-            name: def ? def.mangled_name || def.name : M.name
+            name: def && def.mangled_name || M.name
         };
     });
 
index af0cdc4..827fa43 100644 (file)
@@ -1355,7 +1355,7 @@ function OutputStream(options) {
     });
     DEFPRINT(AST_Symbol, function(self, output) {
         var def = self.definition();
-        output.print_name(def ? def.mangled_name || def.name : self.name);
+        output.print_name(def && def.mangled_name || self.name);
     });
     DEFPRINT(AST_Hole, noop);
     DEFPRINT(AST_This, function(self, output) {
index 7da982a..01a67b7 100644 (file)
@@ -511,13 +511,14 @@ AST_Toplevel.DEFMETHOD("expand_names", function(options) {
         if (def.global && options.cache) return;
         if (def.unmangleable(options)) return;
         if (options.reserved.has[def.name]) return;
-        var d = def.redefined();
-        def.name = d ? d.name : next_name();
+        var redef = def.redefined();
+        var name = redef ? redef.rename || redef.name : next_name();
+        def.rename = name;
         def.orig.forEach(function(sym) {
-            sym.name = def.name;
+            sym.name = name;
         });
         def.references.forEach(function(sym) {
-            sym.name = def.name;
+            sym.name = name;
         });
     }
 });
index 08429d7..c654e00 100644 (file)
@@ -611,3 +611,131 @@ function_do_catch_ie8: {
     }
     expect_stdout: "0 1"
 }
+
+issue_3480: {
+    rename = true,
+    mangle = {
+        ie8: false,
+        toplevel: false,
+    }
+    input: {
+        var d, a, b, c = "FAIL";
+        (function b() {
+            (function() {
+                try {
+                    c = "PASS";
+                } catch (b) {
+                }
+            })();
+        })();
+        console.log(c);
+    }
+    expect: {
+        var d, a, b, c = "FAIL";
+        (function n() {
+            (function() {
+                try {
+                    c = "PASS";
+                } catch (c) {}
+            })();
+        })();
+        console.log(c);
+    }
+    expect_stdout: "PASS"
+}
+
+issue_3480_ie8: {
+    rename = true,
+    mangle = {
+        ie8: true,
+        toplevel: false,
+    }
+    input: {
+        var d, a, b, c = "FAIL";
+        (function b() {
+            (function() {
+                try {
+                    c = "PASS";
+                } catch (b) {
+                }
+            })();
+        })();
+        console.log(c);
+    }
+    expect: {
+        var d, a, b, c = "FAIL";
+        (function b() {
+            (function() {
+                try {
+                    c = "PASS";
+                } catch (b) {}
+            })();
+        })();
+        console.log(c);
+    }
+    expect_stdout: "PASS"
+}
+
+issue_3480_toplevel: {
+    rename = true,
+    mangle = {
+        ie8: false,
+        toplevel: true,
+    }
+    input: {
+        var d, a, b, c = "FAIL";
+        (function b() {
+            (function() {
+                try {
+                    c = "PASS";
+                } catch (b) {
+                }
+            })();
+        })();
+        console.log(c);
+    }
+    expect: {
+        var c, n, o, t = "FAIL";
+        (function c() {
+            (function() {
+                try {
+                    t = "PASS";
+                } catch (c) {}
+            })();
+        })();
+        console.log(t);
+    }
+    expect_stdout: "PASS"
+}
+
+issue_3480_ie8_toplevel: {
+    rename = true,
+    mangle = {
+        ie8: true,
+        toplevel: true,
+    }
+    input: {
+        var d, a, b, c = "FAIL";
+        (function b() {
+            (function() {
+                try {
+                    c = "PASS";
+                } catch (b) {
+                }
+            })();
+        })();
+        console.log(c);
+    }
+    expect: {
+        var c, n, o, t = "FAIL";
+        (function o() {
+            (function() {
+                try {
+                    t = "PASS";
+                } catch (o) {}
+            })();
+        })();
+        console.log(t);
+    }
+    expect_stdout: "PASS"
+}