fix corner case in collapse_vars (#4360)

fixes #4359
This commit is contained in:
Alex Lam S.L
2020-12-11 16:07:28 +00:00
committed by GitHub
parent 57105b299e
commit 515e93d88a
2 changed files with 35 additions and 4 deletions

View File

@@ -1614,6 +1614,14 @@ merge(Compressor.prototype, {
var scan_lhs = lhs && !side_effects && !is_lhs_read_only(lhs, compressor); var scan_lhs = lhs && !side_effects && !is_lhs_read_only(lhs, compressor);
var scan_rhs = foldable(candidate); var scan_rhs = foldable(candidate);
if (!scan_lhs && !scan_rhs) continue; if (!scan_lhs && !scan_rhs) continue;
var funarg = candidate.name instanceof AST_SymbolFunarg;
var may_throw = return_false;
if (candidate.may_throw(compressor)) {
if (funarg && scope instanceof AST_AsyncFunction) continue;
may_throw = in_try ? function(node) {
return node.has_side_effects(compressor);
} : side_effects_external;
}
var read_toplevel = false; var read_toplevel = false;
var modify_toplevel = false; var modify_toplevel = false;
// Locate symbols which may execute code outside of scanning range // Locate symbols which may execute code outside of scanning range
@@ -1622,10 +1630,6 @@ merge(Compressor.prototype, {
var rvalue = get_rvalue(candidate); var rvalue = get_rvalue(candidate);
if (!side_effects) side_effects = value_has_side_effects(); if (!side_effects) side_effects = value_has_side_effects();
var replace_all = replace_all_symbols(candidate); var replace_all = replace_all_symbols(candidate);
var may_throw = candidate.may_throw(compressor) ? in_try ? function(node) {
return node.has_side_effects(compressor);
} : side_effects_external : return_false;
var funarg = candidate.name instanceof AST_SymbolFunarg;
var hit = funarg; var hit = funarg;
var abort = false; var abort = false;
var replaced = 0; var replaced = 0;

View File

@@ -444,3 +444,30 @@ issue_4349_3: {
expect_stdout: "function" expect_stdout: "function"
node_version: ">=8" node_version: ">=8"
} }
issue_4359: {
options = {
collapse_vars: true,
unused: true,
}
input: {
try {
(async function(a) {
return a;
})(A);
} catch (e) {
console.log("PASS");
}
}
expect: {
try {
(async function(a) {
return a;
})(A);
} catch (e) {
console.log("PASS");
}
}
expect_stdout: "PASS"
node_version: ">=8"
}