fix corner cases in awaits (#5303)

This commit is contained in:
Alex Lam S.L
2022-01-17 08:22:26 +00:00
committed by GitHub
parent 35d7f316ef
commit b636e97e3b
2 changed files with 171 additions and 12 deletions

View File

@@ -8055,8 +8055,16 @@ Compressor.prototype.compress = function(node) {
if (!compressor.option("awaits")) return this;
var exp = this.expression;
if (!is_primitive(compressor, exp)) return this;
if (exp instanceof AST_UnaryPrefix && exp.operator == "!") exp = exp.expression;
var dropped = exp.drop_side_effect_free(compressor);
if (dropped === exp) return this;
if (!dropped) {
dropped = make_node(AST_Number, exp, { value: 0 });
} else if (!is_primitive(compressor, dropped)) {
dropped = dropped.negate(compressor);
}
var node = this.clone();
node.expression = exp.drop_side_effect_free(compressor) || make_node(AST_Number, this, { value: 0 });
node.expression = dropped;
return node;
});
def(AST_Binary, function(compressor, first_in_statement) {
@@ -8400,7 +8408,8 @@ Compressor.prototype.compress = function(node) {
if (compressor.option("awaits") && end > 0 && last instanceof AST_Await && last.expression.is_constant()) {
expressions = expressions.slice(0, -1);
end--;
last.expression = expressions[end];
var expr = expressions[end];
last.expression = is_primitive(compressor, expr) ? expr : expr.negate(compressor);
expressions[end] = last;
}
var assign, cond, lhs;
@@ -10728,13 +10737,7 @@ Compressor.prototype.compress = function(node) {
if (compressor.option("side_effects")) {
var exp = self.expression;
if (exp instanceof AST_Await) return exp.optimize(compressor);
if (exp instanceof AST_UnaryPrefix) {
if (exp.expression instanceof AST_Await) return exp.optimize(compressor);
if (exp.operator == "void") return make_node(AST_UnaryPrefix, self, {
operator: "void",
expression: make_node(AST_Await, self, { expression: exp.expression }),
}).optimize(compressor);
}
if (exp instanceof AST_UnaryPrefix && exp.expression instanceof AST_Await) return exp.optimize(compressor);
for (var level = 0, node = self, parent; parent = compressor.parent(level++); node = parent) {
if (is_arrow(parent)) {
if (parent.value === node) return exp.optimize(compressor);