fix corner case in `merge_vars` (#4258)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 1 Nov 2020 17:01:00 +0000 (17:01 +0000)
committerGitHub <noreply@github.com>
Sun, 1 Nov 2020 17:01:00 +0000 (01:01 +0800)
fixes #4257

lib/compress.js
test/compress/merge_vars.js

index 0e8b495..0c49d49 100644 (file)
@@ -4502,7 +4502,7 @@ merge(Compressor.prototype, {
                 segment.loop = true;
                 var save = segment;
                 node.body.walk(tw);
-                if (segment.loop == "c") segment = save;
+                if (segment.inserted === node) segment = save;
                 node.condition.walk(tw);
                 pop();
                 return true;
@@ -4543,7 +4543,9 @@ merge(Compressor.prototype, {
             if (node instanceof AST_LabeledStatement) {
                 push();
                 segment.block = node;
+                var save = segment;
                 node.body.walk(tw);
+                if (segment.inserted === node) segment = save;
                 pop();
                 return true;
             }
@@ -4580,7 +4582,9 @@ merge(Compressor.prototype, {
                 node.body.forEach(function(branch) {
                     push();
                     segment.block = node;
+                    var save = segment;
                     walk_body(branch, tw);
+                    if (segment.inserted === node) segment = save;
                     pop();
                 });
                 return true;
@@ -4746,7 +4750,7 @@ merge(Compressor.prototype, {
                 stack.push(segment);
                 pop();
             }
-            segment.loop = "c";
+            segment.inserted = segment.block;
             push();
             while (stack.length) {
                 var seg = stack.pop();
index ec0410f..1841e3d 100644 (file)
@@ -3146,3 +3146,40 @@ issue_4255: {
     }
     expect_stdout: "0"
 }
+
+issue_4257: {
+    options = {
+        merge_vars: true,
+        toplevel: true,
+    }
+    input: {
+        var a = 0;
+        for (var i = 0; i < 2; i++)
+            switch (--a) {
+              case 0:
+                var b = 0;
+                break;
+              case 0:
+              default:
+                var c = 1 + (0 | (b && A));
+                console.log(c);
+            }
+    }
+    expect: {
+        var a = 0;
+        for (var i = 0; i < 2; i++)
+            switch (--a) {
+              case 0:
+                var b = 0;
+                break;
+              case 0:
+              default:
+                var c = 1 + (0 | (b && A));
+                console.log(c);
+            }
+    }
+    expect_stdout: [
+        "1",
+        "1",
+    ]
+}