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)
+ if ((is_eq || consequent === seq_tail)
&& 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))) {
+ && (is_eq && !seq_tail.left.has_side_effects(compressor)
+ || !condition.has_side_effects(compressor)
+ && can_shift_lhs_of_tail(consequent)
+ && can_shift_lhs_of_tail(alternative))) {
return make_node(AST_Assign, self, {
operator: seq_tail.operator,
left: seq_tail.left,
}
}
+ function can_shift_lhs_of_tail(node) {
+ if (node === node.tail_node()) return true;
+ var exprs = node.expressions;
+ for (var i = exprs.length - 1; --i >= 0;) {
+ var expr = exprs[i];
+ if (!(expr instanceof AST_Assign) && expr.has_side_effects(compressor)
+ || expr.operator != "="
+ || expr.left.has_side_effects(compressor)
+ || expr.right.has_side_effects(compressor)) return false;
+ }
+ return true;
+ }
+
function pop_lhs(node) {
if (!(node instanceof AST_Sequence)) return node.right;
var exprs = node.expressions.slice();
}
expect_stdout: "2"
}
+
+issue_3271: {
+ options = {
+ conditionals: true,
+ }
+ input: {
+ function f(a) {
+ var i = 0, b = [];
+ if (a) {
+ b[i++] = 4,
+ b[i++] = 1;
+ } else {
+ b[i++] = 3,
+ b[i++] = 2,
+ b[i++] = 1;
+ }
+ return b;
+ }
+ console.log(f(0).pop(), f(1).pop());
+ }
+ expect: {
+ function f(a) {
+ var i = 0, b = [];
+ a ? b[i++] = 4 : (b[i++] = 3, b[i++] = 2),
+ b[i++] = 1;
+ return b;
+ }
+ console.log(f(0).pop(), f(1).pop());
+ }
+ expect_stdout: "1 1"
+}