handle variable declaration within catch blocks (#1546)

accounts for IE8- scoping
This commit is contained in:
Alex Lam S.L
2017-03-05 13:13:44 +08:00
committed by GitHub
parent b33e7f88e6
commit b70591be1a
5 changed files with 69 additions and 6 deletions

View 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, {

View 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);

View 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);

View 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,

View 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);
}
}
}