fix corner cases with asynchronous generators (#4642)

fixes #4641
This commit is contained in:
Alex Lam S.L 2021-02-10 15:41:00 +00:00 committed by GitHub
parent f5659f292b
commit 083679bcad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 2 deletions

View File

@ -1307,6 +1307,10 @@ merge(Compressor.prototype, {
return found; return found;
}); });
function in_async_generator(scope) {
return scope instanceof AST_AsyncGeneratorDefun || scope instanceof AST_AsyncGeneratorFunction;
}
function find_scope(compressor) { function find_scope(compressor) {
var level = 0, node; var level = 0, node;
while (node = compressor.parent(level++)) { while (node = compressor.parent(level++)) {
@ -2987,7 +2991,9 @@ merge(Compressor.prototype, {
var stat = statements[i]; var stat = statements[i];
if (prev) { if (prev) {
if (stat instanceof AST_Exit) { if (stat instanceof AST_Exit) {
if (stat.value || !in_async_generator(scope)) {
stat.value = cons_seq(stat.value || make_node(AST_Undefined, stat)).transform(compressor); stat.value = cons_seq(stat.value || make_node(AST_Undefined, stat)).transform(compressor);
}
} else if (stat instanceof AST_For) { } else if (stat instanceof AST_For) {
if (!(stat.init instanceof AST_Definitions)) { if (!(stat.init instanceof AST_Definitions)) {
var abort = false; var abort = false;
@ -11045,7 +11051,10 @@ merge(Compressor.prototype, {
}); });
OPT(AST_Return, function(self, compressor) { OPT(AST_Return, function(self, compressor) {
if (self.value && is_undefined(self.value, compressor)) { if (compressor.option("side_effects")
&& self.value
&& is_undefined(self.value, compressor)
&& !in_async_generator(compressor.find_parent(AST_Scope))) {
self.value = null; self.value = null;
} }
return self; return self;

View File

@ -5879,6 +5879,7 @@ collapse_rhs_this: {
collapse_rhs_undefined: { collapse_rhs_undefined: {
options = { options = {
collapse_vars: true, collapse_vars: true,
side_effects: true,
} }
input: { input: {
var a, b; var a, b;

View File

@ -2460,6 +2460,7 @@ delay_def: {
evaluate: true, evaluate: true,
reduce_funcs: true, reduce_funcs: true,
reduce_vars: true, reduce_vars: true,
side_effects: true,
unused: true, unused: true,
} }
input: { input: {

View File

@ -889,3 +889,64 @@ issue_4639_2: {
expect_stdout: "undefined" expect_stdout: "undefined"
node_version: ">=4" node_version: ">=4"
} }
issue_4641_1: {
options = {
sequences: true,
}
input: {
console.log(typeof async function*() {
try {
console.log("foo");
return;
} finally {
console.log("bar");
}
}().next().then);
}
expect: {
console.log(typeof async function*() {
try {
console.log("foo");
return;
} finally {
console.log("bar");
}
}().next().then);
}
expect_stdout: [
"foo",
"bar",
"function",
]
node_version: ">=10"
}
issue_4641_2: {
options = {
side_effects: true,
}
input: {
console.log(typeof async function*() {
try {
return void "FAIL";
} finally {
console.log("PASS");
}
}().next().then);
}
expect: {
console.log(typeof async function*() {
try {
return void 0;
} finally {
console.log("PASS");
}
}().next().then);
}
expect_stdout: [
"function",
"PASS",
]
node_version: ">=10"
}