From 008c23613769a34e48129a5671f6ea22a989d171 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 13 Mar 2019 04:28:21 +0800 Subject: [PATCH] fix corner case in `conditionals` (#3329) fixes #3245 fixes #3257 fixes #3260 fixes #3269 fixes #3271 fixes #3278 fixes #3309 fixes #3319 fixes #3321 --- lib/compress.js | 21 ++++++++++++++++++--- test/compress/conditionals.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 33f472ea..61c3a268 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -6051,12 +6051,14 @@ merge(Compressor.prototype, { 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, @@ -6221,6 +6223,19 @@ merge(Compressor.prototype, { } } + 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(); diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index 1c1291fe..d6d47c41 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -1384,3 +1384,34 @@ cond_seq_assign_3: { } 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" +} -- 2.34.1