From: Alex Lam S.L Date: Fri, 24 Mar 2017 06:30:31 +0000 (+0800) Subject: fix assignment substitution in sequences (#1643) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=f3a1694a4182e1a26d3dd63dd21fcd4b38dafe3a;p=UglifyJS.git fix assignment substitution in sequences (#1643) take side effects of binary boolean operations into account fixes #1639 --- diff --git a/lib/compress.js b/lib/compress.js index e75d7c96..b3edb840 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2934,7 +2934,12 @@ merge(Compressor.prototype, { return car; } if (cdr instanceof AST_Binary && !(cdr instanceof AST_Assign)) { - field = cdr.left.is_constant() ? "right" : "left"; + if (cdr.left.is_constant()) { + if (cdr.operator == "||" || cdr.operator == "&&") break; + field = "right"; + } else { + field = "left"; + } } else if (cdr instanceof AST_Call || cdr instanceof AST_Unary && cdr.operator != "++" && cdr.operator != "--") { field = "expression"; diff --git a/test/compress/issue-1639.js b/test/compress/issue-1639.js new file mode 100644 index 00000000..b6a9647f --- /dev/null +++ b/test/compress/issue-1639.js @@ -0,0 +1,88 @@ + +issue_1639_1: { + options = { + booleans: true, + cascade: true, + conditionals: true, + evaluate: true, + join_vars: true, + loops: true, + sequences: true, + side_effects: true, + } + input: { + var a = 100, b = 10; + + var L1 = 5; + while (--L1 > 0) { + if ((--b), false) { + if (b) { + var ignore = 0; + } + } + } + + console.log(a, b); + } + expect: { + for (var a = 100, b = 10, L1 = 5; --L1 > 0;) + if (--b, !1) var ignore = 0; + console.log(a, b); + } + expect_stdout: true +} + +issue_1639_2: { + options = { + booleans: true, + cascade: true, + conditionals: true, + evaluate: true, + join_vars: true, + sequences: true, + side_effects: true, + } + input: { + var a = 100, b = 10; + + function f19() { + if (++a, false) + if (a) + if (++a); + } + f19(); + + console.log(a, b); + } + expect: { + var a = 100, b = 10; + function f19() { + ++a, 1; + } + f19(), + console.log(a, b); + } + expect_stdout: true +} + +issue_1639_3: { + options = { + booleans: true, + cascade: true, + conditionals: true, + evaluate: true, + sequences: true, + side_effects: true, + } + input: { + var a = 100, b = 10; + a++ && false && a ? 0 : 0; + console.log(a, b); + } + expect: { + var a = 100, b = 10; + a++, + console.log(a, b); + } + expect_stdout: true +}