From: Alex Lam S.L Date: Thu, 17 Sep 2020 13:20:31 +0000 (+0100) Subject: fix corner case in `evaluate` (#4120) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=09d93cc6c80a934daae53dea6a13d96924a0f466;p=UglifyJS.git fix corner case in `evaluate` (#4120) fixes #4119 --- diff --git a/lib/compress.js b/lib/compress.js index 76be4753..f59cc4d4 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3362,6 +3362,7 @@ merge(Compressor.prototype, { cached.forEach(function(node) { delete node._eval; }); + if (cached.unsafe) return this; if (ignore_side_effects) return val; if (!val || val instanceof RegExp) return val; if (typeof val == "function" || typeof val == "object") return this; @@ -3430,6 +3431,10 @@ merge(Compressor.prototype, { var value = node._eval(compressor, ignore_side_effects, cached, depth); if (value === node) return this; modified(lhs); + if (Array.isArray(value)) value.toString = function() { + cached.unsafe = true; + return "[]"; + }; return value; }); def(AST_Sequence, function(compressor, ignore_side_effects, cached, depth) { diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 6d4d084d..5cf3fb1c 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -2908,3 +2908,55 @@ issue_4077: { } expect_stdout: "PASS" } + +issue_4119_1: { + options = { + conditionals: true, + dead_code: true, + evaluate: true, + reduce_vars: true, + toplevel: true, + unsafe: true, + } + input: { + var a, b; + b = a = []; + a[0] += 0; + if (+b + 1) { + console.log("FAIL"); + } else { + console.log("PASS"); + } + } + expect: { + var a, b; + b = a = []; + a[0] += 0; + +b + 1 ? console.log("FAIL") : console.log("PASS"); + } + expect_stdout: "PASS" +} + +issue_4119_2: { + options = { + conditionals: true, + evaluate: true, + reduce_vars: true, + unsafe: true, + } + input: { + var a; + (function(b) { + a[0] += 0; + console.log(+b + 1 ? "FAIL" : "PASS"); + })(a = []); + } + expect: { + var a; + (function(b) { + a[0] += 0; + console.log(+b + 1 ? "FAIL" : "PASS"); + })(a = []); + } + expect_stdout: "PASS" +}