fix assignment substitution in sequences (#1643)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 24 Mar 2017 06:30:31 +0000 (14:30 +0800)
committerGitHub <noreply@github.com>
Fri, 24 Mar 2017 06:30:31 +0000 (14:30 +0800)
take side effects of binary boolean operations into account

fixes #1639

lib/compress.js
test/compress/issue-1639.js [new file with mode: 0644]

index e75d7c9..b3edb84 100644 (file)
@@ -2934,7 +2934,12 @@ merge(Compressor.prototype, {
                         return car;
                     }
                     if (cdr instanceof AST_Binary && !(cdr instanceof AST_Assign)) {
-                        field = cdr.left.is_constant() ? "right" : "left";
+                        if (cdr.left.is_constant()) {
+                            if (cdr.operator == "||" || cdr.operator == "&&") break;
+                            field = "right";
+                        } else {
+                            field = "left";
+                        }
                     } else if (cdr instanceof AST_Call
                         || cdr instanceof AST_Unary && cdr.operator != "++" && cdr.operator != "--") {
                         field = "expression";
diff --git a/test/compress/issue-1639.js b/test/compress/issue-1639.js
new file mode 100644 (file)
index 0000000..b6a9647
--- /dev/null
@@ -0,0 +1,88 @@
+
+issue_1639_1: {
+    options = {
+        booleans: true,
+        cascade: true,
+        conditionals: true,
+        evaluate: true,
+        join_vars: true,
+        loops: true,
+        sequences: true,
+        side_effects: true,
+    }
+    input: {
+        var a = 100, b = 10;
+
+        var L1 = 5;
+        while (--L1 > 0) {
+            if ((--b), false) {
+                if (b) {
+                    var ignore = 0;
+                }
+            }
+        }
+
+        console.log(a, b);
+    }
+    expect: {
+        for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
+            if (--b, !1) var ignore = 0;
+        console.log(a, b);
+    }
+    expect_stdout: true
+}
+
+issue_1639_2: {
+    options = {
+        booleans: true,
+        cascade: true,
+        conditionals: true,
+        evaluate: true,
+        join_vars: true,
+        sequences: true,
+        side_effects: true,
+    }
+    input: {
+        var a = 100, b = 10;
+
+        function f19() {
+            if (++a, false)
+                if (a)
+                    if (++a);
+        }
+        f19();
+
+        console.log(a, b);
+    }
+    expect: {
+        var a = 100, b = 10;
+        function f19() {
+            ++a, 1;
+        }
+        f19(),
+        console.log(a, b);
+    }
+    expect_stdout: true
+}
+
+issue_1639_3: {
+    options = {
+        booleans: true,
+        cascade: true,
+        conditionals: true,
+        evaluate: true,
+        sequences: true,
+        side_effects: true,
+    }
+    input: {
+        var a = 100, b = 10;
+        a++ && false && a ? 0 : 0;
+        console.log(a, b);
+    }
+    expect: {
+        var a = 100, b = 10;
+        a++,
+        console.log(a, b);
+    }
+    expect_stdout: true
+}