AST_Catch shouldn't really inherit from AST_Scope. Fix #363
authorMihai Bazon <mihai@bazon.net>
Thu, 5 Dec 2013 11:30:29 +0000 (13:30 +0200)
committerMihai Bazon <mihai@bazon.net>
Thu, 5 Dec 2013 11:30:29 +0000 (13:30 +0200)
I hereby acknowledge that figure_out_scope has become a mess.

lib/ast.js
lib/scope.js
test/compress/drop-unused.js

index 1a291e3..2f216c2 100644 (file)
@@ -509,7 +509,7 @@ var AST_Catch = DEFNODE("Catch", "argname", {
             walk_body(this, visitor);
         });
     }
-}, AST_Scope);
+}, AST_Block);
 
 var AST_Finally = DEFNODE("Finally", null, {
     $documentation: "A `finally` node; only makes sense as part of a `try` statement"
index ed189d4..950128d 100644 (file)
@@ -82,14 +82,20 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
     var defun = null;
     var nesting = 0;
     var tw = new TreeWalker(function(node, descend){
+        if (options.screw_ie8 && node instanceof AST_Catch) {
+            var save_scope = scope;
+            scope = new AST_Scope(node);
+            scope.init_scope_vars(nesting);
+            scope.parent_scope = save_scope;
+            descend();
+            scope = save_scope;
+            return true;
+        }
         if (node instanceof AST_Scope) {
             node.init_scope_vars(nesting);
             var save_scope = node.parent_scope = scope;
             var save_defun = defun;
-            if (!(node instanceof AST_Catch)) {
-                defun = node;
-            }
-            scope = node;
+            defun = scope = node;
             ++nesting; descend(); --nesting;
             scope = save_scope;
             defun = save_defun;
index 406ce9e..89bf008 100644 (file)
@@ -119,3 +119,47 @@ unused_keep_setter_arg: {
         }
     }
 }
+
+unused_var_in_catch: {
+    options = { unused: true };
+    input: {
+        function foo() {
+            try {
+                foo();
+            } catch(ex) {
+                var x = 10;
+            }
+        }
+    }
+    expect: {
+        function foo() {
+            try {
+                foo();
+            } catch(ex) {}
+        }
+    }
+}
+
+used_var_in_catch: {
+    options = { unused: true };
+    input: {
+        function foo() {
+            try {
+                foo();
+            } catch(ex) {
+                var x = 10;
+            }
+            return x;
+        }
+    }
+    expect: {
+        function foo() {
+            try {
+                foo();
+            } catch(ex) {
+                var x = 10;
+            }
+            return x;
+        }
+    }
+}