From: Alex Lam S.L Date: Sun, 5 Mar 2017 05:13:44 +0000 (+0800) Subject: handle variable declaration within catch blocks (#1546) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=b70591be1a603d3c1728e6563691c3a192023d3f;p=UglifyJS.git handle variable declaration within catch blocks (#1546) accounts for IE8- scoping --- diff --git a/lib/ast.js b/lib/ast.js index f3df78fe..1f163304 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -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, { diff --git a/lib/compress.js b/lib/compress.js index f2269a2f..1a54c75e 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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); diff --git a/lib/scope.js b/lib/scope.js index b00fcb4a..f23c8fe2 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -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); diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index 557631bd..70e915d3 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -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, diff --git a/test/compress/screw-ie8.js b/test/compress/screw-ie8.js index 51379b15..36eb4d3a 100644 --- a/test/compress/screw-ie8.js +++ b/test/compress/screw-ie8.js @@ -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); + } + } +}