patch variable declaractions extracted within `catch` (#2753)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 9 Jan 2018 05:54:35 +0000 (13:54 +0800)
committerGitHub <noreply@github.com>
Tue, 9 Jan 2018 05:54:35 +0000 (13:54 +0800)
fixes #2749

lib/compress.js
test/compress/collapse_vars.js
test/compress/dead-code.js

index 7016365..406a331 100644 (file)
@@ -3774,9 +3774,20 @@ merge(Compressor.prototype, {
     OPT(AST_Try, function(self, compressor){
         tighten_body(self.body, compressor);
         if (self.bcatch && self.bfinally && all(self.bfinally.body, is_empty)) self.bfinally = null;
-        if (all(self.body, is_empty)) {
+        if (compressor.option("dead_code") && all(self.body, is_empty)) {
             var body = [];
-            if (self.bcatch) extract_declarations_from_unreachable_code(compressor, self.bcatch, body);
+            if (self.bcatch) {
+                extract_declarations_from_unreachable_code(compressor, self.bcatch, body);
+                body.forEach(function(stat) {
+                    if (!(stat instanceof AST_Definitions)) return;
+                    stat.definitions.forEach(function(var_def) {
+                        var def = var_def.name.definition().redefined();
+                        if (!def) return;
+                        var_def.name = var_def.name.clone();
+                        var_def.name.thedef = def;
+                    });
+                });
+            }
             if (self.bfinally) body = body.concat(self.bfinally.body);
             return make_node(AST_BlockStatement, self, {
                 body: body
index 0bad06a..12b4923 100644 (file)
@@ -2197,6 +2197,7 @@ toplevel_single_reference: {
 unused_orig: {
     options = {
         collapse_vars: true,
+        dead_code: true,
         passes: 2,
         reduce_funcs: true,
         reduce_vars: true,
index 490cff7..afc8c56 100644 (file)
@@ -833,3 +833,32 @@ issue_2701: {
     }
     expect_stdout: "function"
 }
+
+issue_2749: {
+    options = {
+        dead_code: true,
+        inline: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = 2, c = "PASS";
+        while (a--)
+            (function() {
+                return b ? c = "FAIL" : b = 1;
+                try {
+                } catch (b) {
+                    var b;
+                }
+            })();
+        console.log(c);
+    }
+    expect: {
+        var a = 2, c = "PASS";
+        while (a--)
+            b = void 0, b ? c = "FAIL" : b = 1;
+        var b;
+        console.log(c);
+    }
+    expect_stdout: "PASS"
+}