fix corner case in `collapse_vars` (#3642)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 22 Dec 2019 01:08:56 +0000 (01:08 +0000)
committerGitHub <noreply@github.com>
Sun, 22 Dec 2019 01:08:56 +0000 (01:08 +0000)
fixes #3641

lib/compress.js
test/compress/collapse_vars.js

index 3b40a5d..c5b6756 100644 (file)
@@ -1569,6 +1569,7 @@ merge(Compressor.prototype, {
                 var parent = scanner.parent(level);
                 if (parent instanceof AST_Array) return find_stop_value(parent, level + 1);
                 if (parent instanceof AST_Assign) {
+                    if (may_throw(parent)) return node;
                     if (parent.left instanceof AST_SymbolRef) {
                         var name = parent.left.name;
                         if (lhs.name == name) return node;
@@ -1647,7 +1648,9 @@ merge(Compressor.prototype, {
                 if (is_last_node(node, parent)) return node;
                 if (in_conditional(node, parent)) return node;
                 if (parent instanceof AST_Array) return find_stop_unused(parent, level + 1);
-                if (parent instanceof AST_Assign) return find_stop_unused(parent, level + 1);
+                if (parent instanceof AST_Assign) {
+                    return may_throw(parent) ? node : find_stop_unused(parent, level + 1);
+                }
                 if (parent instanceof AST_Binary) return find_stop_unused(parent, level + 1);
                 if (parent instanceof AST_Call) return find_stop_unused(parent, level + 1);
                 if (parent instanceof AST_Case) return find_stop_unused(parent, level + 1);
index 16cbadf..edb5d57 100644 (file)
@@ -7399,3 +7399,26 @@ issue_3628_2: {
     }
     expect_stdout: "foo bar"
 }
+
+issue_3641: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a, b;
+        try {
+            a = "foo";
+            b = (a += (A.p = 0, "bar")) % 0;
+        } catch (e) {}
+        console.log(a, b);
+    }
+    expect: {
+        var a, b;
+        try {
+            a = "foo";
+            b = (a += (A.p = 0, "bar")) % 0;
+        } catch (e) {}
+        console.log(a, b);
+    }
+    expect_stdout: "foo undefined"
+}