From: Alex Lam S.L Date: Fri, 8 Nov 2019 16:53:15 +0000 (+0800) Subject: fix corner case in `conditionals` (#3577) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=5045e140b18485132b533c4ee52a18f97f3bf6f9;p=UglifyJS.git fix corner case in `conditionals` (#3577) fixes #3576 --- diff --git a/lib/compress.js b/lib/compress.js index 43ee1126..26d17295 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -6673,7 +6673,7 @@ merge(Compressor.prototype, { && alt_tail instanceof AST_Assign && seq_tail.operator == alt_tail.operator && seq_tail.left.equivalent_to(alt_tail.left) - && (is_eq && !seq_tail.left.has_side_effects(compressor) + && (is_eq && seq_tail.left instanceof AST_SymbolRef || !condition.has_side_effects(compressor) && can_shift_lhs_of_tail(consequent) && can_shift_lhs_of_tail(alternative))) { @@ -6842,16 +6842,9 @@ 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; + return node === node.tail_node() || all(node.expressions.slice(0, -1), function(expr) { + return !expr.has_side_effects(compressor); + }); } function pop_lhs(node) { diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index 27536b9f..3e7a0927 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -1489,3 +1489,29 @@ angularjs_chain: { } } } + +issue_3576: { + options = { + conditionals: true, + evaluate: true, + pure_getters: "strict", + reduce_vars: true, + } + input: { + var c = "FAIL"; + (function(a) { + (a = -1) ? (a && (a.a = 0)) : (a && (a.a = 0)); + a && a[c = "PASS"]++; + })(); + console.log(c); + } + expect: { + var c = "FAIL"; + (function(a) { + a = -1, a, a.a = 0; + a, a[c = "PASS"]++; + })(); + console.log(c); + } + expect_stdout: "PASS" +}