diff --git a/lib/compress.js b/lib/compress.js index d5dc723f..308a711b 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5414,7 +5414,6 @@ Compressor.prototype.compress = function(node) { def(AST_Node, return_true); def(AST_Constant, return_false); - def(AST_Destructured, return_true); def(AST_EmptyStatement, return_false); def(AST_Lambda, return_false); def(AST_ObjectIdentity, return_false); @@ -5448,6 +5447,9 @@ Compressor.prototype.compress = function(node) { } return this.left.may_throw(compressor); }); + def(AST_Await, function(compressor) { + return this.expression.may_throw(compressor); + }); def(AST_Binary, function(compressor) { return this.left.may_throw(compressor) || this.right.may_throw(compressor) @@ -5484,6 +5486,12 @@ Compressor.prototype.compress = function(node) { return !this.optional && this.expression.may_throw_on_access(compressor) || this.expression.may_throw(compressor); }); + def(AST_ForEnumeration, function(compressor) { + if (this.init.may_throw(compressor)) return true; + var obj = this.object.tail_node(); + if (!(obj instanceof AST_Array || obj.is_string(compressor))) return true; + return this.body.may_throw(compressor); + }); def(AST_If, function(compressor) { return this.condition.may_throw(compressor) || this.body && this.body.may_throw(compressor) @@ -12931,7 +12939,11 @@ Compressor.prototype.compress = function(node) { defined.set("arguments", true); } var async = is_async(fn); - if (async && !(compressor.option("awaits") && is_async(scope))) return; + if (async) { + if (!compressor.option("awaits")) return; + if (!is_async(scope)) return; + if (call.may_throw(compressor)) return; + } var names = scope.var_names(); if (in_loop) in_loop = []; if (!fn.variables.all(function(def, name) { diff --git a/test/compress/awaits.js b/test/compress/awaits.js index 9dd9be2b..96750dc0 100644 --- a/test/compress/awaits.js +++ b/test/compress/awaits.js @@ -2605,3 +2605,59 @@ issue_5250: { ] node_version: ">=8" } + +issue_5258_1: { + options = { + awaits: true, + inline: true, + } + input: { + (async function() { + (async function() { + throw "FAIL"; + })(); + return "PASS"; + })().catch(console.log).then(console.log); + } + expect: { + (async function() { + (async function() { + throw "FAIL"; + })(); + return "PASS"; + })().catch(console.log).then(console.log); + } + expect_stdout: "PASS" + node_version: ">=8" +} + +issue_5258_2: { + options = { + awaits: true, + inline: true, + } + input: { + function f() { + throw "FAIL"; + } + (async function() { + (async function() { + f(); + })(); + return "PASS"; + })().catch(console.log).then(console.log); + } + expect: { + function f() { + throw "FAIL"; + } + (async function() { + (async function() { + f(); + })(); + return "PASS"; + })().catch(console.log).then(console.log); + } + expect_stdout: "PASS" + node_version: ">=8" +}