From: Alex Lam S.L Date: Fri, 1 Jan 2021 04:56:13 +0000 (+0000) Subject: fix corner case in `reduce_vars` (#4490) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=2dbafbb4ee9c5cb82665299ee9343c80e96daad4;p=UglifyJS.git fix corner case in `reduce_vars` (#4490) fixes #4489 --- diff --git a/lib/compress.js b/lib/compress.js index 6c26e8a9..bd98c306 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -9427,8 +9427,7 @@ merge(Compressor.prototype, { } })); } else { - value = fixed.optimize(compressor); - if (value === fixed) value = value.transform(new TreeTransformer(function(node, descend) { + value = fixed.optimize(compressor).transform(new TreeTransformer(function(node, descend) { if (node instanceof AST_Scope) return node; node = node.clone(); descend(node, this); diff --git a/test/compress/hoist_vars.js b/test/compress/hoist_vars.js index 173aaeaf..82f8ede6 100644 --- a/test/compress/hoist_vars.js +++ b/test/compress/hoist_vars.js @@ -158,3 +158,22 @@ issue_4487: { } expect_stdout: "undefined" } + +issue_4489: { + options = { + collapse_vars: true, + evaluate: true, + hoist_vars: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + A = 0; + var o = !0 || null; + for (var k in o); + } + expect: { + for (var k in !(A = 0)); + } +} diff --git a/test/reduce.js b/test/reduce.js index 120868fe..e45cfa5d 100644 --- a/test/reduce.js +++ b/test/reduce.js @@ -322,7 +322,16 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options) } else if (node instanceof U.AST_Object) { // first property's value - var expr = node.properties[0] instanceof U.AST_ObjectKeyVal && node.properties[0].value; + var expr = node.properties[0]; + if (expr instanceof U.AST_ObjectKeyVal) { + expr = expr.value; + } else if (expr instanceof U.AST_Spread) { + expr = expr.expression; + } else if (expr && expr.key instanceof U.AST_Node) { + expr = expr.key; + } else { + expr = null; + } if (expr) { node.start._permute++; CHANGED = true; @@ -351,11 +360,6 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options) } } } - else if (node instanceof U.AST_Spread) { - node.start._permute++; - CHANGED = true; - return node.expression; - } else if (node instanceof U.AST_Switch) { var expr = [ node.expression, // switch expression