fix `collapse_vars` on nested exception (#2955)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 25 Feb 2018 07:39:00 +0000 (15:39 +0800)
committerGitHub <noreply@github.com>
Sun, 25 Feb 2018 07:39:00 +0000 (15:39 +0800)
fixes #2954

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

index 78aee56..2d0a03a 100644 (file)
@@ -914,7 +914,7 @@ merge(Compressor.prototype, {
 
     function tighten_body(statements, compressor) {
         var scope = compressor.find_parent(AST_Scope);
-        var in_loop = is_in_loop();
+        var in_loop = is_in_node(AST_IterationStatement);
         var CHANGED, max_iter = 10;
         do {
             CHANGED = false;
@@ -937,9 +937,10 @@ merge(Compressor.prototype, {
             }
         } while (CHANGED && max_iter-- > 0);
 
-        function is_in_loop() {
+        function is_in_node(type) {
+            if (compressor.self() instanceof type) return true;
             for (var node, level = 0; node = compressor.parent(level); level++) {
-                if (node instanceof AST_IterationStatement) return true;
+                if (node instanceof type) return true;
                 if (node instanceof AST_Scope) break;
             }
             return false;
@@ -957,7 +958,7 @@ merge(Compressor.prototype, {
             if (scope.uses_eval || scope.uses_with) return statements;
             var args;
             var candidates = [];
-            var in_try = compressor.self() instanceof AST_Try;
+            var in_try = is_in_node(AST_Try);
             var stat_index = statements.length;
             var scanner = new TreeTransformer(function(node, descend) {
                 if (abort) return node;
index 688f54c..ecf6424 100644 (file)
@@ -4665,3 +4665,38 @@ issue_2931: {
     }
     expect_stdout: "undefined"
 }
+
+issue_2954: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a = "PASS", b;
+        try {
+            do {
+                b = function() {
+                    throw 0;
+                }();
+                a = "FAIL";
+                b && b.c;
+            } while (0);
+        } catch (e) {
+        }
+        console.log(a);
+    }
+    expect: {
+        var a = "PASS", b;
+        try {
+            do {
+                b = function() {
+                    throw 0;
+                }();
+                a = "FAIL";
+                b && b.c;
+            } while (0);
+        } catch (e) {
+        }
+        console.log(a);
+    }
+    expect_stdout: "PASS"
+}