fix corner cases with `yield` (#4771)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 13 Mar 2021 20:39:30 +0000 (20:39 +0000)
committerGitHub <noreply@github.com>
Sat, 13 Mar 2021 20:39:30 +0000 (04:39 +0800)
fixes #4769

lib/compress.js
test/compress/yields.js

index 31e89ab..3830f0d 100644 (file)
@@ -8735,7 +8735,7 @@ merge(Compressor.prototype, {
         var can_inline = can_drop && compressor.option("inline") && !self.is_expr_pure(compressor);
         if (can_inline && stat instanceof AST_Return) {
             var value = stat.value;
-            if (exp === fn && (!value || value.is_constant_expression() && safe_from_await_yield(value))) {
+            if (exp === fn && (!value || value.is_constant_expression()) && safe_from_await_yield(fn)) {
                 return make_sequence(self, convert_args(value)).optimize(compressor);
             }
         }
@@ -8803,7 +8803,8 @@ merge(Compressor.prototype, {
                 && can_drop
                 && all(fn.body, is_empty)
                 && (fn === exp ? fn_name_unused(fn, compressor) : !has_default && !has_destructured && !fn.rest)
-                && !(is_arrow(fn) && fn.value)) {
+                && !(is_arrow(fn) && fn.value)
+                && safe_from_await_yield(fn)) {
                 return make_sequence(self, convert_args()).optimize(compressor);
             }
         }
index dc3dacf..06f46c9 100644 (file)
@@ -950,3 +950,43 @@ issue_4641_2: {
     ]
     node_version: ">=10"
 }
+
+issue_4769_1: {
+    options = {
+        side_effects: true,
+    }
+    input: {
+        console.log(function*() {
+            (function({} = yield => {}) {})();
+        }().next().done);
+    }
+    expect: {
+        console.log(function*() {
+            (function({} = yield => {}) {})();
+        }().next().done);
+    }
+    expect_stdout: "true"
+    node_version: ">=6"
+}
+
+issue_4769_2: {
+    options = {
+        inline: true,
+    }
+    input: {
+        console.log(function*() {
+            return function({} = yield => {}) {
+                return "PASS";
+            }();
+        }().next().value);
+    }
+    expect: {
+        console.log(function*() {
+            return function({} = yield => {}) {
+                return "PASS";
+            }();
+        }().next().value);
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}