evaluate AST_SymbolRef as parameter
authoralexlamsl <alexlamsl@gmail.com>
Sat, 18 Feb 2017 11:22:24 +0000 (19:22 +0800)
committeralexlamsl <alexlamsl@gmail.com>
Tue, 21 Feb 2017 05:29:58 +0000 (13:29 +0800)
fix invalid boolean conversion now exposed in `make_node_from_constant()`

closes #1477

lib/compress.js
test/compress/evaluate.js

index 72afe92..a60ba1a 100644 (file)
@@ -234,7 +234,7 @@ merge(Compressor.prototype, {
           case "string":
             return make_node(AST_String, orig, {
                 value: val
-            }).optimize(compressor);
+            });
           case "number":
             if (isNaN(val)) {
                 return make_node(AST_NaN, orig);
@@ -247,17 +247,17 @@ merge(Compressor.prototype, {
                 });
             }
 
-            return make_node(AST_Number, orig, { value: val }).optimize(compressor);
+            return make_node(AST_Number, orig, { value: val });
           case "boolean":
-            return make_node(val ? AST_True : AST_False, orig).optimize(compressor);
+            return make_node(val ? AST_True : AST_False, orig).transform(compressor);
           case "undefined":
-            return make_node(AST_Undefined, orig).optimize(compressor);
+            return make_node(AST_Undefined, orig).transform(compressor);
           default:
             if (val === null) {
-                return make_node(AST_Null, orig, { value: null }).optimize(compressor);
+                return make_node(AST_Null, orig, { value: null });
             }
             if (val instanceof RegExp) {
-                return make_node(AST_RegExp, orig, { value: val }).optimize(compressor);
+                return make_node(AST_RegExp, orig, { value: val });
             }
             throw new Error(string_template("Can't handle constant of type: {type}", {
                 type: typeof val
@@ -2179,6 +2179,9 @@ merge(Compressor.prototype, {
     });
 
     OPT(AST_Call, function(self, compressor){
+        self.args = self.args.map(function(arg) {
+            return arg.evaluate(compressor)[0];
+        });
         if (compressor.option("unsafe")) {
             var exp = self.expression;
             if (exp instanceof AST_SymbolRef && exp.undeclared()) {
index 0ff157d..f88bc53 100644 (file)
@@ -598,3 +598,50 @@ unsafe_prototype_function: {
         var h = "" + ({toString: 0});
     }
 }
+
+call_args: {
+    options = {
+        evaluate: true,
+    }
+    input: {
+        const a = 1;
+        console.log(a);
+        +function(a) {
+            return a;
+        }(a);
+    }
+    expect: {
+        const a = 1;
+        console.log(1);
+        +function(a) {
+            return a;
+        }(1);
+    }
+}
+
+in_boolean_context: {
+    options = {
+        booleans: true,
+        evaluate: true,
+    }
+    input: {
+        !42;
+        !"foo";
+        ![1, 2];
+        !/foo/;
+        !b(42);
+        !b("foo");
+        !b([1, 2]);
+        !b(/foo/);
+    }
+    expect: {
+        !1;
+        !1;
+        !1;
+        !1;
+        !b(42);
+        !b("foo");
+        !b([1, 2]);
+        !b(/foo/);
+    }
+}