aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js6
-rw-r--r--test/compress/evaluate.js24
2 files changed, 29 insertions, 1 deletions
diff --git a/lib/compress.js b/lib/compress.js
index d8ee2bd3..87671d8e 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 98d0b8d6..74cb65ff 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"
+}