Optimize conditionals where the consequent and alternative are both booleans and...
authorTal Ater <tal@talater.com>
Sat, 13 Sep 2014 15:59:19 +0000 (18:59 +0300)
committerRichard van Velzen <rvanvelzen1@gmail.com>
Tue, 13 Jan 2015 17:27:21 +0000 (18:27 +0100)
lib/compress.js
test/compress/conditionals.js

index 72e4d92..ae20d48 100644 (file)
@@ -2386,6 +2386,20 @@ merge(Compressor.prototype, {
 
             }
         }
+        // x=y?true:false --> x=!!y
+        if (consequent instanceof AST_True
+            && alternative instanceof AST_False) {
+            self.condition = self.condition.negate(compressor);
+            return make_node(AST_UnaryPrefix, self.condition, {
+                operator: "!",
+                expression: self.condition
+            });
+        }
+        // x=y?false:true --> x=!y
+        if (consequent instanceof AST_False
+            && alternative instanceof AST_True) {
+            return self.condition.negate(compressor)
+        }
         return self;
     });
 
index 2212f85..9af1630 100644 (file)
@@ -312,3 +312,57 @@ cond_7_1: {
         x = (y, 2);
     }
 }
+
+cond_8: {
+    options = {
+        conditionals: true,
+        evaluate    : true
+    };
+    input: {
+        // compress these
+        a = condition ? true : false;
+
+        a = !condition ? true : false;
+
+        a = condition() ? true : false;
+
+        if (condition) {
+            a = true;
+        } else {
+            a = false;
+        }
+
+        a = condition ? false : true;
+
+        a = !condition ? false : true;
+
+        a = condition() ? false : true;
+
+        if (condition) {
+            a = false;
+        } else {
+            a = true;
+        }
+
+        // don't compress these
+        a = condition ? 1 : false;
+
+        a = !condition ? true : 0;
+
+        a = condition ? 1 : 0;
+
+    }
+    expect: {
+        a = !!condition;
+        a = !condition;
+        a = !!condition();
+        a = !!condition;
+        a = !condition;
+        a = !!condition;
+        a = !condition();
+        a = !condition;
+        a = condition ? 1 : false;
+        a = condition ? 0 : true;
+        a = condition ? 1 : 0;
+    }
+}
\ No newline at end of file