fix corner case in `merge_vars` (#4158)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 28 Sep 2020 06:09:55 +0000 (07:09 +0100)
committerGitHub <noreply@github.com>
Mon, 28 Sep 2020 06:09:55 +0000 (14:09 +0800)
fixes #4157

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

index 25a993f..360bbe7 100644 (file)
@@ -4448,15 +4448,16 @@ merge(Compressor.prototype, {
                 push();
                 segment.block = node;
                 walk_body(node, tw);
+                pop();
                 if (node.bcatch) {
                     var def = node.bcatch.argname.definition();
                     references[def.id] = false;
                     if (def = def.redefined()) references[def.id] = false;
-                    pop();
                     push();
+                    if (node.bfinally) segment.block = node.bcatch;
                     walk_body(node.bcatch, tw);
+                    pop();
                 }
-                pop();
                 if (node.bfinally) node.bfinally.walk(tw);
                 return true;
             }
index 7eb3f13..5f4b660 100644 (file)
@@ -2617,9 +2617,9 @@ issue_4126_1: {
             try {
                 console.log("PASS");
             } catch (e) {
-                var c = a;
+                var b = a;
             } finally {
-                var c = c;
+                var c = b;
             }
             console.log(c);
         }
@@ -2860,3 +2860,71 @@ issue_4155: {
         "function",
     ]
 }
+
+issue_4157_1: {
+    options = {
+        dead_code: true,
+        loops: true,
+        merge_vars: true,
+    }
+    input: {
+        (function() {
+            try {
+                for (var a = "FAIL"; a; a++)
+                    return;
+                var b = 0;
+            } finally {
+                console.log(b);
+            }
+        })();
+    }
+    expect: {
+        (function() {
+            try {
+                var a = "FAIL";
+                if (a)
+                    return;
+                var b = 0;
+            } finally {
+                console.log(b);
+            }
+        })();
+    }
+    expect_stdout: "undefined"
+}
+
+issue_4157_2: {
+    options = {
+        dead_code: true,
+        loops: true,
+        merge_vars: true,
+    }
+    input: {
+        (function() {
+            try {
+                throw "FAIL";
+            } catch (e) {
+                for (var a = e; a; a++)
+                    return;
+                var b = 0;
+            } finally {
+                console.log(b);
+            }
+        })();
+    }
+    expect: {
+        (function() {
+            try {
+                throw "FAIL";
+            } catch (e) {
+                var a = e;
+                if (a)
+                    return;
+                var b = 0;
+            } finally {
+                console.log(b);
+            }
+        })();
+    }
+    expect_stdout: "undefined"
+}