fix corner case in `inline` (#5270)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 7 Jan 2022 05:22:16 +0000 (05:22 +0000)
committerGitHub <noreply@github.com>
Fri, 7 Jan 2022 05:22:16 +0000 (13:22 +0800)
fixes #5269

lib/compress.js
test/compress/ie.js

index a7ceaf3..09b725b 100644 (file)
@@ -13048,6 +13048,7 @@ Compressor.prototype.compress = function(node) {
                     return true;
                 })) return;
                 var sym = def.orig[0];
+                if (sym instanceof AST_SymbolCatch) return;
                 var ref = make_node(AST_SymbolRef, sym, flatten_var(sym));
                 ref.definition().references.push(ref);
                 body.push(make_node(AST_SimpleStatement, sym, {
index c275c88..284a8cc 100644 (file)
@@ -3192,3 +3192,219 @@ issue_5081_property_access_ie: {
     }
     expect_stdout: "PASS"
 }
+
+issue_5269_1: {
+    options = {
+        ie: false,
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        "use strict";
+        do {
+            (function() {
+                try {
+                    throw "PASS";
+                } catch (e) {
+                    console.log(e);
+                }
+            })();
+        } while (!console);
+    }
+    expect: {
+        "use strict";
+        do {
+            try {
+                throw "PASS";
+            } catch (e) {
+                console.log(e);
+            }
+        } while (!console);
+    }
+    expect_stdout: "PASS"
+}
+
+issue_5269_1_ie: {
+    options = {
+        ie: true,
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        "use strict";
+        do {
+            (function() {
+                try {
+                    throw "PASS";
+                } catch (e) {
+                    console.log(e);
+                }
+            })();
+        } while (!console);
+    }
+    expect: {
+        "use strict";
+        do {
+            try {
+                throw "PASS";
+            } catch (e) {
+                console.log(e);
+            }
+        } while (!console);
+    }
+    expect_stdout: "PASS"
+}
+
+issue_5269_2: {
+    options = {
+        ie: false,
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        for (var i = 0; i < 2; i++)
+            (function() {
+                console.log(e);
+                try {
+                    console;
+                } catch (e) {
+                    var e = "FAIL 1";
+                }
+                e = "FAIL 2";
+                console;
+            })();
+    }
+    expect: {
+        for (var i = 0; i < 2; i++) {
+            e = void 0;
+            console.log(e);
+            try {
+                console;
+            } catch (e) {
+                var e = "FAIL 1";
+            }
+            e = "FAIL 2";
+            console;
+        }
+    }
+    expect_stdout: [
+        "undefined",
+        "undefined",
+    ]
+}
+
+issue_5269_2_ie: {
+    options = {
+        ie: true,
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        for (var i = 0; i < 2; i++)
+            (function() {
+                console.log(e);
+                try {
+                    console;
+                } catch (e) {
+                    var e = "FAIL 1";
+                }
+                e = "FAIL 2";
+                console;
+            })();
+    }
+    expect: {
+        for (var i = 0; i < 2; i++) {
+            e = void 0;
+            console.log(e);
+            try {
+                console;
+            } catch (e) {
+                var e = "FAIL 1";
+            }
+            e = "FAIL 2";
+            console;
+        }
+    }
+    expect_stdout: [
+        "undefined",
+        "undefined",
+    ]
+}
+
+issue_5269_3: {
+    options = {
+        ie: false,
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        e = "foo";
+        for (var i = 0; i < 2; i++)
+            (function() {
+                console.log(e);
+                try {
+                    console;
+                } catch (e) {
+                    e = "FAIL";
+                }
+                e = "bar";
+                console;
+            })();
+    }
+    expect: {
+        e = "foo";
+        for (var i = 0; i < 2; i++) {
+            console.log(e);
+            try {
+                console;
+            } catch (e) {
+                e = "FAIL";
+            }
+            e = "bar";
+            console;
+        }
+    }
+    expect_stdout: [
+        "foo",
+        "bar",
+    ]
+}
+
+issue_5269_3_ie: {
+    options = {
+        ie: true,
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        e = "foo";
+        for (var i = 0; i < 2; i++)
+            (function() {
+                console.log(e);
+                try {
+                    console;
+                } catch (e) {
+                    e = "FAIL";
+                }
+                e = "bar";
+                console;
+            })();
+    }
+    expect: {
+        e = "foo";
+        for (var i = 0; i < 2; i++) {
+            console.log(e);
+            try {
+                console;
+            } catch (e) {
+                e = "FAIL";
+            }
+            e = "bar";
+            console;
+        }
+    }
+    expect_stdout: [
+        "foo",
+        "bar",
+    ]
+}