From 73e98dcda48be52f2c045038554b2cfe184a9a5a Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 28 Feb 2018 19:59:19 +0800 Subject: [PATCH] drop `side_effects`-free `return` values (#2965) --- lib/compress.js | 10 +++++- test/compress/collapse_vars.js | 56 +++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index ed094874..9adef60e 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3644,7 +3644,15 @@ merge(Compressor.prototype, { if (this.expression instanceof AST_Function && (!this.expression.name || !this.expression.name.definition().references.length)) { var node = this.clone(); - node.expression.process_expression(false, compressor); + var exp = node.expression; + exp.process_expression(false, compressor); + exp.walk(new TreeWalker(function(node) { + if (node instanceof AST_Return && node.value) { + node.value = node.value.drop_side_effect_free(compressor); + return true; + } + if (node instanceof AST_Scope && node !== exp) return true; + })); return node; } return this; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index d4ab444e..9a6e5a57 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -3124,7 +3124,7 @@ issue_2425_3: { expect_stdout: "15" } -issue_2437: { +issue_2437_1: { options = { collapse_vars: true, conditionals: true, @@ -3140,7 +3140,7 @@ issue_2437: { } input: { function foo() { - bar(); + return bar(); } function bar() { if (xhrDesc) { @@ -3157,10 +3157,10 @@ issue_2437: { return result; } } - foo(); + console.log(foo()); } expect: { - !function() { + console.log(function() { if (xhrDesc) { var result = !!(req = new XMLHttpRequest()).onreadystatechange; return Object.defineProperty(XMLHttpRequest.prototype, "onreadystatechange", xhrDesc || {}), @@ -3169,6 +3169,54 @@ issue_2437: { var req, detectFunc = function() {}; (req = new XMLHttpRequest()).onreadystatechange = detectFunc; result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc; + return req.onreadystatechange = null, result; + }()); + } +} + +issue_2437_2: { + options = { + collapse_vars: true, + conditionals: true, + inline: true, + join_vars: true, + passes: 2, + reduce_funcs: true, + reduce_vars: true, + side_effects: true, + sequences: true, + toplevel: true, + unused: true, + } + input: { + function foo() { + bar(); + } + function bar() { + if (xhrDesc) { + var req = new XMLHttpRequest(); + var result = !!req.onreadystatechange; + Object.defineProperty(XMLHttpRequest.prototype, 'onreadystatechange', xhrDesc || {}); + return result; + } else { + var req = new XMLHttpRequest(); + var detectFunc = function () {}; + req.onreadystatechange = detectFunc; + var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc; + req.onreadystatechange = null; + return result; + } + } + foo(); + } + expect: { + !function() { + if (xhrDesc) + return (req = new XMLHttpRequest()).onreadystatechange, + Object.defineProperty(XMLHttpRequest.prototype, "onreadystatechange", xhrDesc || {}); + var req; + (req = new XMLHttpRequest).onreadystatechange = function(){}, + req[SYMBOL_FAKE_ONREADYSTATECHANGE_1], req.onreadystatechange = null; }(); } -- 2.34.1