From: Alex Lam S.L Date: Mon, 18 May 2020 00:41:10 +0000 (+0100) Subject: fix corner case in `evaluate` (#3906) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=f9b3198714f9d061531ddafca8385473ecafca2a;p=UglifyJS.git fix corner case in `evaluate` (#3906) fixes #3905 --- diff --git a/lib/compress.js b/lib/compress.js index 02d36d6c..d378e26e 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3570,9 +3570,10 @@ merge(Compressor.prototype, { } var args = eval_args(this.args); if (!args && !ignore_side_effects) return this; - if (!stat.value) return; + var val = stat.value; + if (!val) return; var cached_args = []; - if (args && !all(fn.argnames, function(sym, i) { + if (!args || all(fn.argnames, function(sym, i) { var value = args[i]; var def = sym.definition(); if (def.orig[def.orig.length - 1] !== sym) return false; @@ -3583,15 +3584,15 @@ merge(Compressor.prototype, { cached_args.push(node); }); return true; - }) && !ignore_side_effects) return this; - fn.evaluating = true; - var val = stat.value._eval(compressor, ignore_side_effects, cached, depth); - delete fn.evaluating; + }) || ignore_side_effects) { + fn.evaluating = true; + val = val._eval(compressor, ignore_side_effects, cached, depth); + delete fn.evaluating; + } cached_args.forEach(function(node) { delete node._eval; }); - if (val === stat.value) return this; - return val; + return val === stat.value ? this : 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 3f9f1014..247a3c62 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -2444,3 +2444,22 @@ issue_3903: { } expect_stdout: "PASS" } + +issue_3905: { + options = { + evaluate: true, + passes: 2, + unused: true, + } + input: { + (function(a, a) { + return console.log(a = 0), a && console.log("FAIL"); + })("foo", 42); + } + expect: { + (function(a, a) { + return console.log(a = 0), a && console.log("FAIL"); + })("foo", 42); + } + expect_stdout: "0" +}