drop `side_effects`-free `return` values (#2965)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 28 Feb 2018 11:59:19 +0000 (19:59 +0800)
committerGitHub <noreply@github.com>
Wed, 28 Feb 2018 11:59:19 +0000 (19:59 +0800)
lib/compress.js
test/compress/collapse_vars.js

index ed09487..9adef60 100644 (file)
@@ -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;
index d4ab444..9a6e5a5 100644 (file)
@@ -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;
         }();
     }