preserve side effects in switch expression (#1694)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 26 Mar 2017 18:32:46 +0000 (02:32 +0800)
committerGitHub <noreply@github.com>
Sun, 26 Mar 2017 18:32:46 +0000 (02:32 +0800)
fixes #1690

lib/compress.js
test/compress/switch.js

index 8350ba2..9ed368c 100644 (file)
@@ -2560,10 +2560,9 @@ merge(Compressor.prototype, {
                 fallthrough = !aborts(exact_match);
             }
             while (i < len) extract_declarations_from_unreachable_code(compressor, self.body[i++], decl);
-            if (body.length == 0) return make_node(AST_BlockStatement, self, {
-                body: decl
-            }).optimize(compressor);
-            body[0].body = decl.concat(body[0].body);
+            if (body.length > 0) {
+                body[0].body = decl.concat(body[0].body);
+            }
             self.body = body;
         }
         while (branch = self.body[self.body.length - 1]) {
@@ -2575,9 +2574,11 @@ merge(Compressor.prototype, {
                     && branch.expression.has_side_effects(compressor)) break;
             self.body.pop();
         }
-        if (compressor.option("conditionals") && self.body.length == 0) {
-            return make_node(AST_SimpleStatement, self, {
-                body: self.expression
+        if (decl && self.body.length == 0) {
+            return make_node(AST_BlockStatement, self, {
+                body: decl.concat(make_node(AST_SimpleStatement, self.expression, {
+                    body: self.expression
+                }))
             }).optimize(compressor);
         }
         if (body && body.length == 1 && (body[0] === exact_match || body[0] === default_branch)) {
index 2025d91..654a838 100644 (file)
@@ -553,3 +553,29 @@ issue_1680_2: {
     }
     expect_stdout: true
 }
+
+issue_1690_1: {
+    options = {
+        dead_code: true,
+    }
+    input: {
+        switch (console.log("PASS")) {}
+    }
+    expect: {
+        console.log("PASS");
+    }
+    expect_stdout: "PASS"
+}
+
+issue_1690_2: {
+    options = {
+        dead_code: false,
+    }
+    input: {
+        switch (console.log("PASS")) {}
+    }
+    expect: {
+        switch (console.log("PASS")) {}
+    }
+    expect_stdout: "PASS"
+}