From: Mihai Bazon Date: Thu, 5 Dec 2013 11:30:29 +0000 (+0200) Subject: AST_Catch shouldn't really inherit from AST_Scope. Fix #363 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=8f35a363d90e6521e916a8d70f3302d4adc51ae6;p=UglifyJS.git AST_Catch shouldn't really inherit from AST_Scope. Fix #363 I hereby acknowledge that figure_out_scope has become a mess. --- diff --git a/lib/ast.js b/lib/ast.js index 1a291e31..2f216c20 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -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" diff --git a/lib/scope.js b/lib/scope.js index ed189d49..950128d4 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -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; diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index 406ce9e6..89bf0088 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -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; + } + } +}