From 73e6b2550bf0cc08e4bc95ac1e1d3b8b650c5bf8 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 13 Mar 2021 20:39:30 +0000 Subject: [PATCH] fix corner cases with `yield` (#4771) fixes #4769 --- lib/compress.js | 5 +++-- test/compress/yields.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 31e89ab405..3830f0db78 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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); } } diff --git a/test/compress/yields.js b/test/compress/yields.js index dc3dacf540..06f46c9d4a 100644 --- a/test/compress/yields.js +++ b/test/compress/yields.js @@ -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" +}