aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js19
-rw-r--r--test/compress/conditionals.js2
-rw-r--r--test/compress/transform.js3
3 files changed, 22 insertions, 2 deletions
diff --git a/lib/compress.js b/lib/compress.js
index e83524c5..504d270b 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -5727,6 +5727,18 @@ merge(Compressor.prototype, {
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 == "||"
@@ -5829,6 +5841,13 @@ merge(Compressor.prototype, {
}
}
}
+
+ 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){
diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js
index e37c5556..abb39697 100644
--- a/test/compress/conditionals.js
+++ b/test/compress/conditionals.js
@@ -332,7 +332,7 @@ cond_7: {
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';
diff --git a/test/compress/transform.js b/test/compress/transform.js
index 68d33844..58874cd6 100644
--- a/test/compress/transform.js
+++ b/test/compress/transform.js
@@ -104,6 +104,7 @@ if_return: {
conditionals: true,
if_return: true,
sequences: true,
+ side_effects: true,
}
input: {
function f(w, x, y, z) {
@@ -124,7 +125,7 @@ if_return: {
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;
}
}
}