fix corner case in conditionals (#3244)
This commit is contained in:
@@ -6048,23 +6048,25 @@ merge(Compressor.prototype, {
|
||||
// v
|
||||
// exp = foo ? something : something_else;
|
||||
var seq_tail = consequent.tail_node();
|
||||
var alt_tail = alternative.tail_node();
|
||||
if (seq_tail instanceof AST_Assign
|
||||
&& alt_tail instanceof AST_Assign
|
||||
&& seq_tail.operator == alt_tail.operator
|
||||
&& seq_tail.left.equivalent_to(alt_tail.left)
|
||||
&& (!condition.has_side_effects(compressor)
|
||||
|| seq_tail.operator == "="
|
||||
&& !seq_tail.left.has_side_effects(compressor))) {
|
||||
return make_node(AST_Assign, self, {
|
||||
operator: seq_tail.operator,
|
||||
left: seq_tail.left,
|
||||
right: make_node(AST_Conditional, self, {
|
||||
condition: condition,
|
||||
consequent: pop_lhs(consequent),
|
||||
alternative: pop_lhs(alternative)
|
||||
})
|
||||
});
|
||||
if (seq_tail instanceof AST_Assign) {
|
||||
var is_eq = seq_tail.operator == "=";
|
||||
var alt_tail = is_eq ? alternative.tail_node() : alternative;
|
||||
if ((is_eq || consequent instanceof AST_Assign)
|
||||
&& alt_tail instanceof AST_Assign
|
||||
&& seq_tail.operator == alt_tail.operator
|
||||
&& seq_tail.left.equivalent_to(alt_tail.left)
|
||||
&& (!condition.has_side_effects(compressor)
|
||||
|| is_eq && !seq_tail.left.has_side_effects(compressor))) {
|
||||
return make_node(AST_Assign, self, {
|
||||
operator: seq_tail.operator,
|
||||
left: seq_tail.left,
|
||||
right: make_node(AST_Conditional, self, {
|
||||
condition: condition,
|
||||
consequent: pop_lhs(consequent),
|
||||
alternative: pop_lhs(alternative)
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
// x ? y(a) : y(b) --> y(x ? a : b)
|
||||
var arg_index;
|
||||
|
||||
@@ -1364,3 +1364,23 @@ cond_seq_assign_2: {
|
||||
"42",
|
||||
]
|
||||
}
|
||||
|
||||
cond_seq_assign_3: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
}
|
||||
input: {
|
||||
var c = 0;
|
||||
if (this)
|
||||
c = 1 + c, c = c + 1;
|
||||
else
|
||||
c = 1 + c, c = c + 1;
|
||||
console.log(c);
|
||||
}
|
||||
expect: {
|
||||
var c = 0;
|
||||
this, c = 1 + c, c += 1;
|
||||
console.log(c);
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user