fix corner case in `ie8` (#3824)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 26 Apr 2020 22:44:53 +0000 (23:44 +0100)
committerGitHub <noreply@github.com>
Sun, 26 Apr 2020 22:44:53 +0000 (06:44 +0800)
fixes #3823

lib/compress.js
test/compress/ie8.js

index 67884a1..a42095c 100644 (file)
@@ -4906,20 +4906,39 @@ merge(Compressor.prototype, {
             var consequent = this.consequent.drop_side_effect_free(compressor);
             var alternative = this.alternative.drop_side_effect_free(compressor);
             if (consequent === this.consequent && alternative === this.alternative) return this;
-            if (!consequent) return alternative ? make_node(AST_Binary, this, {
-                operator: "||",
-                left: this.condition,
-                right: alternative
-            }) : this.condition.drop_side_effect_free(compressor);
-            if (!alternative) return make_node(AST_Binary, this, {
-                operator: "&&",
-                left: this.condition,
-                right: consequent
-            });
-            var node = this.clone();
-            node.consequent = consequent;
-            node.alternative = alternative;
-            return node;
+            var exprs;
+            if (compressor.option("ie8")) {
+                exprs = [];
+                if (consequent instanceof AST_Function) {
+                    exprs.push(consequent);
+                    consequent = null;
+                }
+                if (alternative instanceof AST_Function) {
+                    exprs.push(alternative);
+                    alternative = null;
+                }
+            }
+            var node;
+            if (!consequent) {
+                node = alternative ? make_node(AST_Binary, this, {
+                    operator: "||",
+                    left: this.condition,
+                    right: alternative
+                }) : this.condition.drop_side_effect_free(compressor);
+            } else if (!alternative) {
+                node = make_node(AST_Binary, this, {
+                    operator: "&&",
+                    left: this.condition,
+                    right: consequent
+                });
+            } else {
+                node = this.clone();
+                node.consequent = consequent;
+                node.alternative = alternative;
+            }
+            if (!compressor.option("ie8")) return node;
+            if (node) exprs.push(node);
+            return make_sequence(this, exprs);
         });
         def(AST_Constant, return_null);
         def(AST_Dot, function(compressor, first_in_statement) {
index 4dfa7c6..8f81b01 100644 (file)
@@ -2420,3 +2420,28 @@ issue_3750: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3823: {
+    options = {
+        ie8: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        for (var i = 0; i < 1; i++) {
+            var a = a ? function f() {
+                f;
+            } : 0;
+            console.log("PASS", typeof f);
+        }
+    }
+    expect: {
+        for (var i = 0; i < 1; i++) {
+            (function f() {
+                f;
+            });
+            console.log("PASS", typeof f);
+        }
+    }
+    expect_stdout: "PASS undefined"
+}