improve literal return optimization (#1860)
authorkzc <kzc@users.noreply.github.com>
Mon, 1 May 2017 16:10:11 +0000 (12:10 -0400)
committerAlex Lam S.L <alexlamsl@gmail.com>
Mon, 1 May 2017 16:10:11 +0000 (00:10 +0800)
lib/compress.js
test/compress/functions.js
test/compress/issue-1787.js
test/compress/negate-iife.js

index 4e86a30..e5a7af2 100644 (file)
@@ -1780,6 +1780,35 @@ merge(Compressor.prototype, {
         node.DEFMETHOD("has_side_effects", func);
     });
 
+    // determine if expression is constant
+    (function(def){
+        function all(list) {
+            for (var i = list.length; --i >= 0;)
+                if (!list[i].is_constant_expression())
+                    return false;
+            return true;
+        }
+        def(AST_Node, return_false);
+        def(AST_Constant, return_true);
+        def(AST_Unary, function(){
+            return this.expression.is_constant_expression();
+        });
+        def(AST_Binary, function(){
+            return this.left.is_constant_expression() && this.right.is_constant_expression();
+        });
+        def(AST_Array, function(){
+            return all(this.elements);
+        });
+        def(AST_Object, function(){
+            return all(this.properties);
+        });
+        def(AST_ObjectProperty, function(){
+            return this.value.is_constant_expression();
+        });
+    })(function(node, func){
+        node.DEFMETHOD("is_constant_expression", func);
+    });
+
     // tell me if a statement aborts
     function aborts(thing) {
         return thing && thing.aborts();
@@ -3004,7 +3033,7 @@ merge(Compressor.prototype, {
         if (exp instanceof AST_Function) {
             if (exp.body[0] instanceof AST_Return) {
                 var value = exp.body[0].value;
-                if (!value || value.is_constant()) {
+                if (!value || value.is_constant_expression()) {
                     var args = self.args.concat(value || make_node(AST_Undefined, self));
                     return make_sequence(self, args).transform(compressor);
                 }
index 2a2d096..3a560f0 100644 (file)
@@ -145,3 +145,25 @@ issue_1841_2: {
     }
     expect_exact: "42"
 }
+
+function_returning_constant_literal: {
+    options = {
+        reduce_vars: true,
+        unsafe: true,
+        toplevel: true,
+        evaluate: true,
+        cascade: true,
+        unused: true,
+    }
+    input: {
+        function greeter() {
+            return { message: 'Hello there' };
+        }
+        var greeting = greeter();
+        console.log(greeting.message);
+    }
+    expect: {
+        console.log("Hello there");
+    }
+    expect_stdout: "Hello there"
+}
index 43d1f1b..02fa0f9 100644 (file)
@@ -10,10 +10,6 @@ unary_prefix: {
             return x;
         }());
     }
-    expect: {
-        console.log(function() {
-            return -2 / 3;
-        }());
-    }
+    expect_exact: "console.log(-2/3);"
     expect_stdout: true
 }
index 343e8e1..514a15c 100644 (file)
@@ -25,11 +25,9 @@ negate_iife_2: {
         negate_iife: true
     };
     input: {
-        (function(){ return {} })().x = 10; // should not transform this one
-    }
-    expect: {
         (function(){ return {} })().x = 10;
     }
+    expect_exact: "({}).x=10;"
 }
 
 negate_iife_2_side_effects: {
@@ -38,11 +36,9 @@ negate_iife_2_side_effects: {
         side_effects: true,
     }
     input: {
-        (function(){ return {} })().x = 10; // should not transform this one
-    }
-    expect: {
         (function(){ return {} })().x = 10;
     }
+    expect_exact: "({}).x=10;"
 }
 
 negate_iife_3: {