handle variable declaration within catch blocks (#1546)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 5 Mar 2017 05:13:44 +0000 (13:13 +0800)
committerGitHub <noreply@github.com>
Sun, 5 Mar 2017 05:13:44 +0000 (13:13 +0800)
accounts for IE8- scoping

lib/ast.js
lib/compress.js
lib/scope.js
test/compress/reduce_vars.js
test/compress/screw-ie8.js

index f3df78f..1f16330 100644 (file)
@@ -812,9 +812,6 @@ var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
 
 var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
     $documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
-    $propdoc: {
-        init: "[AST_Node*/S] array of initializers for this declaration."
-    }
 }, AST_Symbol);
 
 var AST_SymbolVar = DEFNODE("SymbolVar", null, {
index f2269a2..1a54c75 100644 (file)
@@ -223,6 +223,7 @@ merge(Compressor.prototype, {
 
     AST_Node.DEFMETHOD("reset_opt_flags", function(compressor, rescan){
         var reduce_vars = rescan && compressor.option("reduce_vars");
+        var ie8 = !compressor.option("screw_ie8");
         var safe_ids = [];
         push();
         var suppressor = new TreeWalker(function(node) {
@@ -232,7 +233,7 @@ merge(Compressor.prototype, {
                 d.fixed = false;
             }
         });
-        var tw = new TreeWalker(function(node){
+        var tw = new TreeWalker(function(node, descend){
             if (!(node instanceof AST_Directive || node instanceof AST_Constant)) {
                 node._squeezed = false;
                 node._optimized = false;
@@ -247,6 +248,9 @@ merge(Compressor.prototype, {
                         d.fixed = false;
                     }
                 }
+                if (ie8 && node instanceof AST_SymbolCatch) {
+                    node.definition().fixed = false;
+                }
                 if (node instanceof AST_VarDef) {
                     var d = node.name.definition();
                     if (d.fixed === undefined) {
@@ -301,6 +305,12 @@ merge(Compressor.prototype, {
                     pop();
                     return true;
                 }
+                if (node instanceof AST_Catch) {
+                    push();
+                    descend();
+                    pop();
+                    return true;
+                }
             }
         });
         this.walk(tw);
index b00fcb4..f23c8fe 100644 (file)
@@ -154,8 +154,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
         }
         else if (node instanceof AST_SymbolVar
                  || node instanceof AST_SymbolConst) {
-            var def = defun.def_variable(node);
-            def.init = tw.parent().value;
+            defun.def_variable(node);
         }
         else if (node instanceof AST_SymbolCatch) {
             scope.def_variable(node);
index 557631b..70e915d 100644 (file)
@@ -605,6 +605,29 @@ inner_var_for_in_2: {
     }
 }
 
+inner_var_catch: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+    }
+    input: {
+        try {
+            a();
+        } catch (e) {
+            var b = 1;
+        }
+        console.log(b);
+    }
+    expect: {
+        try {
+            a();
+        } catch (e) {
+            var b = 1;
+        }
+        console.log(b);
+    }
+}
+
 issue_1533_1: {
     options = {
         collapse_vars: true,
index 51379b1..36eb4d3 100644 (file)
@@ -148,3 +148,37 @@ dont_screw_try_catch_undefined: {
         }
     }
 }
+
+reduce_vars: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        screw_ie8: false,
+        unused: true,
+    }
+    mangle = {
+        screw_ie8: false,
+    }
+    input: {
+        function f() {
+            var a;
+            try {
+                x();
+            } catch (a) {
+                y();
+            }
+            alert(a);
+        }
+    }
+    expect: {
+        function f() {
+            var t;
+            try {
+                x();
+            } catch (t) {
+                y();
+            }
+            alert(t);
+        }
+    }
+}