fix corner case in `awaits` (#5160)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 31 Oct 2021 15:46:55 +0000 (23:46 +0800)
committerGitHub <noreply@github.com>
Sun, 31 Oct 2021 15:46:55 +0000 (23:46 +0800)
fixes #5159

lib/compress.js
test/compress/awaits.js

index 225fc74..d68a045 100644 (file)
@@ -10334,7 +10334,7 @@ merge(Compressor.prototype, {
                     do {
                         node = parent;
                         parent = compressor.parent(level++);
-                        if (parent instanceof AST_Try && member(node, parent.body)) {
+                        if (parent instanceof AST_Try && (parent.bfinally || parent.bcatch) !== node) {
                             drop = false;
                             break;
                         }
index a3b55b1..466abc3 100644 (file)
@@ -2143,3 +2143,72 @@ issue_5157_promise: {
     expect_stdout: "PASS"
     node_version: ">=8"
 }
+
+issue_5159_1: {
+    options = {
+        awaits: true,
+        side_effects: true,
+    }
+    input: {
+        (async function() {
+            try {
+                throw "foo";
+            } catch (e) {
+                return await "bar";
+            } finally {
+                console.log("baz");
+            }
+        })().catch(console.log).then(console.log);
+        console.log("moo");
+    }
+    expect: {
+        (async function() {
+            try {
+                throw "foo";
+            } catch (e) {
+                return await "bar";
+            } finally {
+                console.log("baz");
+            }
+        })().catch(console.log).then(console.log);
+        console.log("moo");
+    }
+    expect_stdout: [
+        "moo",
+        "baz",
+        "bar",
+    ]
+    node_version: ">=8"
+}
+
+issue_5159_2: {
+    options = {
+        awaits: true,
+        side_effects: true,
+    }
+    input: {
+        (async function() {
+            try {
+                throw "foo";
+            } catch (e) {
+                return await "bar";
+            }
+        })().catch(console.log).then(console.log);
+        console.log("baz");
+    }
+    expect: {
+        (async function() {
+            try {
+                throw "foo";
+            } catch (e) {
+                return "bar";
+            }
+        })().catch(console.log).then(console.log);
+        console.log("baz");
+    }
+    expect_stdout: [
+        "baz",
+        "bar",
+    ]
+    node_version: ">=8"
+}