From ce7e220de42de0aaf41783ff0ea3c776930b1841 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 30 Aug 2018 15:59:05 +0800 Subject: [PATCH] fix corner case in `conditionals` (#3244) --- lib/compress.js | 36 ++++++++++++++++++----------------- test/compress/conditionals.js | 20 +++++++++++++++++++ 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" +} -- 2.34.1