aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2018-08-30 15:59:05 +0800
committerGitHub <noreply@github.com>2018-08-30 15:59:05 +0800
commitce7e220de42de0aaf41783ff0ea3c776930b1841 (patch)
treea8cecbb0a9fa83cb5e177630485a4848de2b9572
parent2bdaca10ae05136843d8e99da50925091a593373 (diff)
downloadtracifyjs-ce7e220de42de0aaf41783ff0ea3c776930b1841.tar.gz
tracifyjs-ce7e220de42de0aaf41783ff0ea3c776930b1841.zip
fix corner case in `conditionals` (#3244)
-rw-r--r--lib/compress.js36
-rw-r--r--test/compress/conditionals.js20
2 files changed, 39 insertions, 17 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 53ed4afc..df33a5c3 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -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;
diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js
index 35505c87..1c1291fe 100644
--- a/test/compress/conditionals.js
+++ b/test/compress/conditionals.js
@@ -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"
+}