From: Richard van Velzen Date: Wed, 11 Feb 2015 20:05:49 +0000 (+0100) Subject: Fix invalid removal of left side in && and || compression X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=992b6b9fcce47ca67ecb14675f10b172ce7a99b5;p=UglifyJS.git Fix invalid removal of left side in && and || compression See #637. This does not produce the optimal result, but it does prevent the removal of non-side-effect-free code. --- diff --git a/lib/compress.js b/lib/compress.js index 27285984..b77b5ff3 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2110,6 +2110,12 @@ merge(Compressor.prototype, { var rr = self.right.evaluate(compressor); if ((ll.length > 1 && !ll[1]) || (rr.length > 1 && !rr[1])) { compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start); + if (self.left.has_side_effects(compressor)) { + return make_node(AST_Seq, self, { + car: self.left, + cdr: make_node(AST_False) + }).optimize(compressor); + } return make_node(AST_False, self); } if (ll.length > 1 && ll[1]) { @@ -2124,6 +2130,12 @@ merge(Compressor.prototype, { var rr = self.right.evaluate(compressor); if ((ll.length > 1 && ll[1]) || (rr.length > 1 && rr[1])) { compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start); + if (self.left.has_side_effects(compressor)) { + return make_node(AST_Seq, self, { + car: self.left, + cdr: make_node(AST_True) + }).optimize(compressor); + } return make_node(AST_True, self); } if (ll.length > 1 && !ll[1]) { diff --git a/test/compress/issue-637.js b/test/compress/issue-637.js new file mode 100644 index 00000000..45fd2481 --- /dev/null +++ b/test/compress/issue-637.js @@ -0,0 +1,22 @@ +wrongly_optimized: { + options = { + conditionals: true, + booleans: true, + evaluate: true + }; + input: { + function func() { + foo(); + } + if (func() || true) { + bar(); + } + } + expect: { + function func() { + foo(); + } + // TODO: optimize to `func(), bar()` + (func(), 0) || bar(); + } +}