fix corner case in side_effects (#4752)

fixes #4751
This commit is contained in:
Alex Lam S.L
2021-03-07 20:19:51 +00:00
committed by GitHub
parent 31e7d25cad
commit f52b0e7c31
9 changed files with 277 additions and 45 deletions

View File

@@ -4797,15 +4797,9 @@ merge(Compressor.prototype, {
|| this.right.has_side_effects(compressor);
});
def(AST_Binary, function(compressor) {
var lhs = this.left;
if (lhs.has_side_effects(compressor)) return true;
var rhs = this.right;
var op = this.operator;
if (!rhs.has_side_effects(compressor)) return op == "in" && !is_object(rhs);
if (op == "&&" && rhs instanceof AST_PropAccess && lhs.equivalent_to(rhs.expression)) {
return rhs instanceof AST_Sub && rhs.property.has_side_effects(compressor);
}
return true;
return this.left.has_side_effects(compressor)
|| this.right.has_side_effects(compressor)
|| this.operator == "in" && !is_object(this.right);
});
def(AST_Block, function(compressor) {
return any(this.body, compressor);
@@ -7220,17 +7214,6 @@ merge(Compressor.prototype, {
if (!rhs) return left.drop_side_effect_free(compressor, first_in_statement);
if (lazy_op[op] && rhs.has_side_effects(compressor)) {
var node = this;
if (op == "&&"
&& rhs instanceof AST_PropAccess
&& left.equivalent_to(rhs.expression)
&& !left.has_side_effects(compressor)) {
var prop = rhs instanceof AST_Sub
&& rhs.property.drop_side_effect_free(compressor, first_in_statement);
if (!prop) return left.drop_side_effect_free(compressor, first_in_statement);
node = node.clone();
node.right = prop;
return node.drop_side_effect_free(compressor, first_in_statement);
}
if (rhs !== right) {
node = node.clone();
node.right = rhs.drop_side_effect_free(compressor);
@@ -7242,13 +7225,12 @@ merge(Compressor.prototype, {
right: node.right,
});
return first_in_statement ? best_of_statement(node, negated) : best_of_expression(node, negated);
} else {
var lhs = left.drop_side_effect_free(compressor, first_in_statement);
if (!lhs) return rhs;
rhs = rhs.drop_side_effect_free(compressor);
if (!rhs) return lhs;
return make_sequence(this, [ lhs, rhs ]);
}
var lhs = left.drop_side_effect_free(compressor, first_in_statement);
if (!lhs) return rhs;
rhs = rhs.drop_side_effect_free(compressor);
if (!rhs) return lhs;
return make_sequence(this, [ lhs, rhs ]);
});
def(AST_Call, function(compressor, first_in_statement) {
var self = this;