diff --git a/lib/compress.js b/lib/compress.js index d8ee2bd3d0..87671d8ec8 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2881,6 +2881,7 @@ merge(Compressor.prototype, { if (!non_converting_binary[this.operator]) depth++; var left = this.left._eval(compressor, cached, depth); if (left === this.left) return this; + if (this.operator == (left ? "||" : "&&")) return left; var right = this.right._eval(compressor, cached, depth); if (right === this.right) return this; var result; @@ -3049,7 +3050,10 @@ merge(Compressor.prototype, { cached.push(node); }); }); - return stat.value ? stat.value._eval(compressor, cached, depth) : undefined; + if (!stat.value) return undefined; + var val = stat.value._eval(compressor, cached, depth); + if (val === stat.value) return this; + return val; } else if (compressor.option("unsafe") && exp instanceof AST_PropAccess) { var key = exp.property; if (key instanceof AST_Node) { diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 98d0b8d6ef..74cb65fff6 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -1876,3 +1876,27 @@ issue_3558: { } expect_stdout: "1 0" } + +issue_3568: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + unsafe: true, + } + input: { + var a = 0; + function f(b) { + return b && b.p; + } + console.log(f(++a + f())); + } + expect: { + var a = 0; + function f(b) { + return b && b.p; + } + console.log(NaN); + } + expect_stdout: "NaN" +}