fix corner case in merge_vars (#4760)

fixes #4759
This commit is contained in:
Alex Lam S.L
2021-03-10 15:44:49 +00:00
committed by GitHub
parent 58362d5ec7
commit b4944a31a4
2 changed files with 59 additions and 10 deletions

View File

@@ -5271,7 +5271,7 @@ merge(Compressor.prototype, {
var NO_MERGE = makePredicate("arguments await yield"); var NO_MERGE = makePredicate("arguments await yield");
AST_Scope.DEFMETHOD("merge_variables", function(compressor) { AST_Scope.DEFMETHOD("merge_variables", function(compressor) {
if (!compressor.option("merge_vars")) return; if (!compressor.option("merge_vars")) return;
var self = this, segment = {}, root; var in_try, root, segment = {}, self = this;
var first = [], last = [], index = 0; var first = [], last = [], index = 0;
var declarations = new Dictionary(); var declarations = new Dictionary();
var references = Object.create(null); var references = Object.create(null);
@@ -5476,10 +5476,11 @@ merge(Compressor.prototype, {
return true; return true;
} }
if (node instanceof AST_Try) { if (node instanceof AST_Try) {
push(); var save_try = in_try;
segment.block = node; in_try = node;
var save = segment;
walk_body(node, tw); walk_body(node, tw);
pop(); segment = save;
if (node.bcatch) { if (node.bcatch) {
if (node.bcatch.argname) node.bcatch.argname.mark_symbol(function(node) { if (node.bcatch.argname) node.bcatch.argname.mark_symbol(function(node) {
if (node instanceof AST_SymbolCatch) { if (node instanceof AST_SymbolCatch) {
@@ -5488,11 +5489,16 @@ merge(Compressor.prototype, {
if (def = def.redefined()) references[def.id] = false; if (def = def.redefined()) references[def.id] = false;
} }
}, tw); }, tw);
if (node.bfinally || (in_try = save_try)) {
walk_body(node.bcatch, tw);
} else {
push(); push();
if (node.bfinally) segment.block = node.bcatch;
walk_body(node.bcatch, tw); walk_body(node.bcatch, tw);
pop(); pop();
} }
}
in_try = save_try;
segment = save;
if (node.bfinally) node.bfinally.walk(tw); if (node.bfinally) node.bfinally.walk(tw);
return true; return true;
} }
@@ -5599,6 +5605,7 @@ merge(Compressor.prototype, {
} }
function mark(sym, read) { function mark(sym, read) {
if (in_try) push();
var def = sym.definition(), ldef; var def = sym.definition(), ldef;
if (def.id in references) { if (def.id in references) {
var refs = references[def.id]; var refs = references[def.id];

View File

@@ -2620,9 +2620,9 @@ issue_4126_1: {
try { try {
console.log("PASS"); console.log("PASS");
} catch (e) { } catch (e) {
var b = a; var c = a;
} finally { } finally {
var c = b; var c = c;
} }
console.log(c); console.log(c);
} }
@@ -3239,3 +3239,45 @@ issue_4653: {
"0", "0",
] ]
} }
issue_4759: {
options = {
merge_vars: true,
toplevel: true,
}
input: {
var i = 2, a = 1, b, c, d;
while (i--) {
try {
if (1 != b) {
d = [];
null.p;
c = d;
} else {
b = 0;
a = c;
}
} catch (e) {}
b = a;
}
console.log(a);
}
expect: {
var i = 2, a = 1, b, c, d;
while (i--) {
try {
if (1 != b) {
d = [];
null.p;
c = d;
} else {
b = 0;
a = c;
}
} catch (e) {}
b = a;
}
console.log(a);
}
expect_stdout: "undefined"
}