Fix compression of conditionals
authorMihai Bazon <mihai.bazon@gmail.com>
Mon, 13 Apr 2015 14:29:48 +0000 (17:29 +0300)
committerMihai Bazon <mihai.bazon@gmail.com>
Mon, 13 Apr 2015 14:29:48 +0000 (17:29 +0300)
Don't move the condition on the right side of an assignment when
the left side may have side effects.

Fix #677

lib/compress.js
test/compress/conditionals.js

index 41e4f17..fa89c32 100644 (file)
@@ -2343,6 +2343,7 @@ merge(Compressor.prototype, {
             && alternative instanceof AST_Assign
             && consequent.operator == alternative.operator
             && consequent.left.equivalent_to(alternative.left)
+            && !consequent.left.has_side_effects(compressor)
            ) {
             /*
              * Stuff like this:
index e5a3922..299097b 100644 (file)
@@ -86,7 +86,9 @@ ifs_4: {
             x(foo)[10].bar.baz = something_else();
     }
     expect: {
-        x(foo)[10].bar.baz = (foo && bar) ? something() : something_else();
+        foo && bar
+            ? x(foo)[10].bar.baz = something()
+            : x(foo)[10].bar.baz = something_else();
     }
 }
 
@@ -133,6 +135,7 @@ ifs_6: {
         comparisons: true
     };
     input: {
+        var x;
         if (!foo && !bar && !baz && !boo) {
             x = 10;
         } else {
@@ -140,6 +143,7 @@ ifs_6: {
         }
     }
     expect: {
+        var x;
         x = foo || bar || baz || boo ? 20 : 10;
     }
 }
@@ -165,6 +169,7 @@ cond_2: {
         conditionals: true
     };
     input: {
+        var x;
         if (some_condition()) {
             x = new FooBar(1);
         } else {
@@ -172,6 +177,7 @@ cond_2: {
         }
     }
     expect: {
+        var x;
         x = new FooBar(some_condition() ? 1 : 2);
     }
 }
@@ -303,6 +309,7 @@ cond_7_1: {
         evaluate    : true
     };
     input: {
+        var x;
         // access to global should be assumed to have side effects
         if (y) {
             x = 1+1;
@@ -311,6 +318,7 @@ cond_7_1: {
         }
     }
     expect: {
+        var x;
         x = (y, 2);
     }
 }
@@ -321,6 +329,7 @@ cond_8: {
         evaluate    : true
     };
     input: {
+        var a;
         // compress these
         a = condition ? true : false;
 
@@ -355,6 +364,7 @@ cond_8: {
 
     }
     expect: {
+        var a;
         a = !!condition;
         a = !condition;
         a = !!condition();
@@ -367,4 +377,4 @@ cond_8: {
         a = condition ? 0 : true;
         a = condition ? 1 : 0;
     }
-}
\ No newline at end of file
+}