fix corner case in `collapse_vars` (#3582)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 13 Nov 2019 08:45:16 +0000 (16:45 +0800)
committerGitHub <noreply@github.com>
Wed, 13 Nov 2019 08:45:16 +0000 (16:45 +0800)
fixes #3581

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

index 2bf120b..de07080 100644 (file)
@@ -1090,7 +1090,7 @@ merge(Compressor.prototype, {
                     scope = node;
                     break;
                 } else if (node instanceof AST_Try) {
-                    in_try = true;
+                    in_try = node;
                 }
             } while (node = compressor.parent(level++));
         }
@@ -1321,6 +1321,10 @@ merge(Compressor.prototype, {
             function is_last_node(node, parent) {
                 if (node instanceof AST_Call) return true;
                 if (node instanceof AST_Exit) {
+                    if (in_try) {
+                        if (in_try.bfinally) return true;
+                        if (in_try.bcatch && node instanceof AST_Throw) return true;
+                    }
                     return side_effects || lhs instanceof AST_PropAccess || may_modify(lhs);
                 }
                 if (node instanceof AST_Function) {
index e67425a..2e82cc9 100644 (file)
@@ -6468,3 +6468,63 @@ issue_3573: {
     }
     expect_stdout: "1"
 }
+
+issue_3581_1: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a = "PASS", b = "FAIL";
+        try {
+            b = "PASS";
+            if (a) throw 0;
+            b = 1 + b;
+            a = "FAIL";
+        } catch (e) {}
+        console.log(a, b);
+    }
+    expect: {
+        var a = "PASS", b = "FAIL";
+        try {
+            b = "PASS";
+            if (a) throw 0;
+            b = 1 + b;
+            a = "FAIL";
+        } catch (e) {}
+        console.log(a, b);
+    }
+    expect_stdout: "PASS PASS"
+}
+
+issue_3581_2: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        (function() {
+            var a = "PASS", b = "FAIL";
+            try {
+                b = "PASS";
+                if (a) return;
+                b = 1 + b;
+                a = "FAIL";
+            } finally {
+                console.log(a, b);
+            }
+        })();
+    }
+    expect: {
+        (function() {
+            var a = "PASS", b = "FAIL";
+            try {
+                b = "PASS";
+                if (a) return;
+                b = 1 + b;
+                a = "FAIL";
+            } finally {
+                console.log(a, b);
+            }
+        })();
+    }
+    expect_stdout: "PASS PASS"
+}