fix corner case in `merge_vars` (#4256)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 1 Nov 2020 06:34:07 +0000 (06:34 +0000)
committerGitHub <noreply@github.com>
Sun, 1 Nov 2020 06:34:07 +0000 (14:34 +0800)
fixes #4255

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

index 8eb3619..0e8b495 100644 (file)
@@ -4542,7 +4542,7 @@ merge(Compressor.prototype, {
             }
             if (node instanceof AST_LabeledStatement) {
                 push();
-                segment.block = node.body;
+                segment.block = node;
                 node.body.walk(tw);
                 pop();
                 return true;
@@ -4737,7 +4737,12 @@ merge(Compressor.prototype, {
 
         function insert(target) {
             var stack = [];
-            while (!HOP(segment, "block") || segment.block !== target) {
+            while (true) {
+                if (HOP(segment, "block")) {
+                    var block = segment.block;
+                    if (block instanceof AST_LabeledStatement) block = block.body;
+                    if (block === target) break;
+                }
                 stack.push(segment);
                 pop();
             }
index b61b486..ec0410f 100644 (file)
@@ -3124,3 +3124,25 @@ issue_4253: {
     }
     expect_stdout: "undefined"
 }
+
+issue_4255: {
+    options = {
+        dead_code: true,
+        loops: true,
+        merge_vars: true,
+        toplevel: true,
+    }
+    input: {
+        L: for (var a = 2; --a;)
+            for (var b = 0; console.log(b); --b)
+                break L;
+    }
+    expect: {
+        L: for (var a = 2; --a;) {
+            var b = 0;
+            if (console.log(b))
+                break L;
+        }
+    }
+    expect_stdout: "0"
+}