From: Alex Lam S.L Date: Mon, 12 Jun 2017 17:40:14 +0000 (+0800) Subject: fix variable accounting in `inline` (#2085) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=2bdc8802ddd913a8b3b921426e898fc2f2257265;p=UglifyJS.git fix variable accounting in `inline` (#2085) fixes #2084 --- diff --git a/lib/compress.js b/lib/compress.js index 5f2ac2b0..4d768781 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3171,16 +3171,16 @@ merge(Compressor.prototype, { && !exp.uses_arguments && !exp.uses_eval && !self.has_pure_annotation(compressor)) { - var body; + var value; if (stat instanceof AST_Return) { - body = stat.value.clone(true); + value = stat.value.clone(true); } else if (stat instanceof AST_SimpleStatement) { - body = []; - merge_sequence(body, stat.body.clone(true)); - merge_sequence(body, make_node(AST_Undefined, self)); - body = make_sequence(self, body); + value = make_node(AST_UnaryPrefix, stat, { + operator: "void", + expression: stat.body.clone(true) + }); } - if (body) { + if (value) { var fn = exp.clone(); fn.argnames = []; fn.body = []; @@ -3200,17 +3200,25 @@ merge(Compressor.prototype, { })); } fn.body.push(make_node(AST_Return, self, { - value: body + value: value })); - body = fn.transform(compressor).body; + var body = fn.transform(compressor).body; if (body.length == 0) return make_node(AST_Undefined, self); if (body.length == 1 && body[0] instanceof AST_Return) { - if (!body[0].value) return make_node(AST_Undefined, self); - body = best_of(compressor, body[0].value, self); + value = body[0].value; + if (!value) return make_node(AST_Undefined, self); + value.walk(new TreeWalker(function(node) { + if (value === self) return true; + if (node instanceof AST_SymbolRef && exp.variables.has(node.name)) { + value = self; + return true; + } + })); + if (value !== self) value = best_of(compressor, value, self); } else { - body = self; + value = self; } - if (body !== self) return body; + if (value !== self) return value; } } if (compressor.option("side_effects") && all(exp.body, is_empty)) { diff --git a/test/compress/functions.js b/test/compress/functions.js index 180bb11a..1359670e 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -297,3 +297,42 @@ webkit: { expect_exact: "console.log((function(){1+1}).a=1);" expect_stdout: "1" } + +issue_2084: { + options = { + collapse_vars: true, + conditionals: true, + evaluate: true, + inline: true, + passes: 2, + reduce_vars: true, + sequences: true, + side_effects: true, + unused: true, + } + input: { + var c = 0; + !function() { + !function(c) { + c = 1 + c; + var c = 0; + function f14(a_1) { + if (c = 1 + c, 0 !== 23..toString()) + c = 1 + c, a_1 && (a_1[0] = 0); + } + f14(); + }(-1); + }(); + console.log(c); + } + expect: { + var c = 0; + !function(c) { + c = 1 + c, + c = 1 + (c = 0), + 0 !== 23..toString() && (c = 1 + c); + }(-1), + console.log(c); + } + expect_stdout: "0" +} diff --git a/test/compress/issue-281.js b/test/compress/issue-281.js index 7a6c03bc..9b8c8bfd 100644 --- a/test/compress/issue-281.js +++ b/test/compress/issue-281.js @@ -151,7 +151,7 @@ negate_iife_4: { })(); } expect: { - t ? console.log(true) : console.log(false), console.log("something"), void 0; + t ? console.log(true) : console.log(false), void console.log("something"); } } @@ -174,7 +174,7 @@ negate_iife_5: { })(); } expect: { - t ? foo(true) : bar(false), console.log("something"), void 0; + t ? foo(true) : bar(false), void console.log("something"); } } @@ -197,7 +197,7 @@ negate_iife_5_off: { })(); } expect: { - t ? foo(true) : bar(false), console.log("something"), void 0; + t ? foo(true) : bar(false), void console.log("something"); } } @@ -214,7 +214,7 @@ issue_1254_negate_iife_true: { }; })()(); } - expect_exact: 'console.log("test"),void 0;' + expect_exact: 'void console.log("test");' expect_stdout: true } @@ -231,7 +231,7 @@ issue_1254_negate_iife_nested: { }; })()()()()(); } - expect_exact: '(console.log("test"),void 0)()()();' + expect_exact: '(void console.log("test"))()()();' } negate_iife_issue_1073: { @@ -382,7 +382,7 @@ wrap_iife: { }; })()(); } - expect_exact: 'console.log("test"),void 0;' + expect_exact: 'void console.log("test");' } wrap_iife_in_expression: { @@ -416,7 +416,7 @@ wrap_iife_in_return_call: { })(); })()(); } - expect_exact: '(console.log("test"),void 0)();' + expect_exact: '(void console.log("test"))();' } pure_annotation: {