diff --git a/lib/compress.js b/lib/compress.js index 29914940..b94b5040 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -13553,7 +13553,6 @@ Compressor.prototype.compress = function(node) { if (fn.body[0] instanceof AST_Directive) return; if (fn.contains_this()) return; if (!scope) scope = find_scope(compressor); - if (in_async_generator(scope)) return; var defined = new Dictionary(); defined.set("NaN", true); while (!(scope instanceof AST_Scope)) { @@ -13624,7 +13623,7 @@ Compressor.prototype.compress = function(node) { })); return !abort; }; - } else if (in_await && !is_async(fn)) { + } else if (in_await && !is_async(fn) || in_async_generator(scope)) { verify_body = function(stat) { var abort = false; var find_return = new TreeWalker(function(node) { @@ -13735,7 +13734,7 @@ Compressor.prototype.compress = function(node) { node.value = make_node(AST_Await, call, { expression: value }); }); body.push(make_node(AST_Return, call, { - value: make_node(AST_Undefined, call).transform(compressor), + value: in_async_generator(scope) ? make_node(AST_Undefined, call).transform(compressor) : null, })); } return inlined; diff --git a/test/compress/arrows.js b/test/compress/arrows.js index a9efd79c..b0c820b3 100644 --- a/test/compress/arrows.js +++ b/test/compress/arrows.js @@ -1024,7 +1024,6 @@ issue_5414_1: { arrows: true, if_return: true, inline: true, - side_effects: true, toplevel: true, } input: { diff --git a/test/compress/awaits.js b/test/compress/awaits.js index 04016c9c..5fee9e02 100644 --- a/test/compress/awaits.js +++ b/test/compress/awaits.js @@ -415,7 +415,6 @@ inline_block: { awaits: true, if_return: true, inline: true, - side_effects: true, } input: { console.log("foo"); @@ -451,7 +450,6 @@ inline_block_async: { awaits: true, if_return: true, inline: true, - side_effects: true, } input: { console.log("foo"); diff --git a/test/compress/classes.js b/test/compress/classes.js index 860293b3..cc4d0327 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -1815,7 +1815,6 @@ issue_4725_2: { options = { if_return: true, inline: true, - side_effects: true, } input: { "use strict"; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index d28fe175..b16450d7 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -9611,7 +9611,6 @@ inline_throw: { collapse_vars: true, inline: true, keep_fargs: false, - side_effects: true, unused: true, } input: { @@ -9631,6 +9630,7 @@ inline_throw: { try { (function(a) { throw a; + return; })("PASS"); } catch (e) { console.log(e); diff --git a/test/compress/const.js b/test/compress/const.js index d7d38cc8..a8837500 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -1287,7 +1287,6 @@ issue_4261_2: { inline: true, reduce_funcs: true, reduce_vars: true, - side_effects: true, toplevel: true, unused: true, } diff --git a/test/compress/default-values.js b/test/compress/default-values.js index 5f149d45..50bfd958 100644 --- a/test/compress/default-values.js +++ b/test/compress/default-values.js @@ -1930,7 +1930,6 @@ issue_5057_4: { var b = "FAIL 2"; (function(a = console.log("FAIL 1")) {})(b); console.log(a); - 0; })("PASS"); } expect_stdout: "PASS" diff --git a/test/compress/functions.js b/test/compress/functions.js index 62b22a52..10a4b1f5 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -607,7 +607,6 @@ empty_body: { inline_binary_and: { options = { inline: true, - side_effects: true, } input: { console.log(function() { @@ -627,9 +626,10 @@ inline_binary_and: { return "bar"; }()) { while (console.log("baz")); + return void "moo"; return; } else - return; + return void 0; }()); } expect_stdout: [ @@ -1121,7 +1121,6 @@ inline_return_binary: { inline_return_conditional: { options = { inline: true, - side_effects: true, } input: { console.log(function() { @@ -2296,7 +2295,6 @@ duplicate_argnames_4: { options = { if_return: true, inline: true, - side_effects: true, } input: { (function() { @@ -5547,7 +5545,6 @@ issue_3833_2: { inline: true, keep_fargs: false, reduce_vars: true, - side_effects: true, toplevel: true, unused: true, } @@ -5613,7 +5610,6 @@ issue_3836_2: { options = { if_return: true, inline: true, - side_effects: true, } input: { (function() { @@ -5871,7 +5867,6 @@ statement_var_inline: { options = { inline: true, join_vars: true, - side_effects: true, unused: true, } input: { @@ -6162,7 +6157,6 @@ issue_4261: { inline: true, reduce_funcs: true, reduce_vars: true, - side_effects: true, toplevel: true, unused: true, } @@ -6455,7 +6449,6 @@ issue_4659_1: { if_return: true, inline: true, reduce_vars: true, - side_effects: true, } input: { var a = 0; @@ -6493,7 +6486,6 @@ issue_4659_2: { if_return: true, inline: true, reduce_vars: true, - side_effects: true, } input: { var a = 0; @@ -6518,7 +6510,7 @@ issue_4659_2: { function f() { return a++; } - f && a++; + void (f && a++); (function() { var a = console && a; })(); @@ -6533,7 +6525,6 @@ issue_4659_3: { if_return: true, inline: true, reduce_vars: true, - side_effects: true, unused: true, } input: { @@ -6740,7 +6731,6 @@ issue_4725_2: { options = { if_return: true, inline: true, - side_effects: true, } input: { var o = { @@ -7725,7 +7715,6 @@ issue_5239: { functions: true, inline: true, reduce_vars: true, - side_effects: true, unused: true, } input: { @@ -7741,6 +7730,7 @@ issue_5239: { var f = void 0; var a = 42, f = function() {}; while (console.log(f.p || a++)); + return; })(); } expect_stdout: "42" @@ -7843,7 +7833,7 @@ issue_5249_1: { var a = "FAIL 1"; else if (a) { while (console.log("FAIL 2")); - return void 0; + return; } else return void 0; throw "FAIL 3"; @@ -8006,7 +7996,6 @@ issue_5264_1: { (function(arguments) { console.log(arguments); while (console.log("foo")); - 0; })("bar"); return arguments; }("baz")[0]); @@ -8125,7 +8114,6 @@ issue_5290: { issue_5296: { options = { inline: true, - side_effects: true, } input: { var a = "PASS"; @@ -8388,7 +8376,6 @@ issue_5409: { inline: true, merge_vars: true, reduce_vars: true, - side_effects: true, unused: true, } input: { @@ -8406,6 +8393,7 @@ issue_5409: { a = void 0; console.log(a && a); while (!console); + return; })(); } expect_stdout: "undefined" diff --git a/test/compress/spreads.js b/test/compress/spreads.js index 21d99473..82658dfe 100644 --- a/test/compress/spreads.js +++ b/test/compress/spreads.js @@ -188,7 +188,6 @@ do_inline_3: { options = { if_return: true, inline: true, - side_effects: true, } input: { (function() { diff --git a/test/compress/yields.js b/test/compress/yields.js index c2061d40..10f76940 100644 --- a/test/compress/yields.js +++ b/test/compress/yields.js @@ -836,10 +836,8 @@ inline_nested_async: { inline_nested_block: { options = { - dead_code: true, if_return: true, inline: true, - side_effects: true, yields: true, } input: { @@ -859,6 +857,7 @@ inline_nested_block: { var a = function*() { for (var a of [ "foo", "bar" ]) yield a; + "FAIL"; }(), b; do { b = a.next(); @@ -1468,6 +1467,80 @@ issue_5385_2: { node_version: ">=10" } +issue_5385_3: { + options = { + inline: true, + } + input: { + (async function*() { + return function() { + try { + throw console.log("foo"); + } catch (e) { + return console.log("bar"); + } + }(); + })().next(); + console.log("moo"); + } + expect: { + (async function*() { + try { + throw console.log("foo"); + } catch (e) { + return console.log("bar"); + } + return void 0; + })().next(); + console.log("moo"); + } + expect_stdout: [ + "foo", + "bar", + "moo", + ] + node_version: ">=10" +} + +issue_5385_4: { + options = { + awaits: true, + inline: true, + } + input: { + (async function*() { + return async function() { + try { + return { + then(resolve) { + resolve(console.log("FAIL")); + }, + }; + } finally { + return "PASS"; + } + }(); + })().next().then(o => console.log(o.value, o.done)); + } + expect: { + (async function*() { + return async function() { + try { + return { + then(resolve) { + resolve(console.log("FAIL")); + }, + }; + } finally { + return "PASS"; + } + }(); + })().next().then(o => console.log(o.value, o.done)); + } + expect_stdout: "PASS true" + node_version: ">=10" +} + issue_5425: { options = { assignments: true,