consequent
]).optimize(compressor);
}
+ // x ? (y, w) : (z, w) --> x ? y : z, w
+ if ((consequent instanceof AST_Sequence || alternative instanceof AST_Sequence)
+ && consequent.tail_node().equivalent_to(alternative.tail_node())) {
+ return make_sequence(self, [
+ make_node(AST_Conditional, self, {
+ condition: self.condition,
+ consequent: pop_seq(consequent),
+ alternative: pop_seq(alternative)
+ }),
+ consequent.tail_node()
+ ]).optimize(compressor);
+ }
// x ? y || z : z --> x && y || z
if (consequent instanceof AST_Binary
&& consequent.operator == "||"
}
}
}
+
+ function pop_seq(node) {
+ if (!(node instanceof AST_Sequence)) return make_node(AST_Number, node, {
+ value: 0
+ });
+ return make_sequence(node, node.expressions.slice(0, -1));
+ }
});
OPT(AST_Boolean, function(self, compressor){
x = 'foo';
x = 'foo';
x = (condition(), 20);
- x = z ? 'fuji' : (condition(), 'fuji');
+ x = (z || condition(), 'fuji');
x = (condition(), 'foobar');
x = y ? a : b;
x = y ? 'foo' : 'fo';
conditionals: true,
if_return: true,
sequences: true,
+ side_effects: true,
}
input: {
function f(w, x, y, z) {
if (w) {
if (y) return;
} else if (z) return;
- return x == y || (x && w(), y && z(), !0);
+ return x == y || (x && w(), y && z()), !0;
}
}
}