fix corner case in reduce_vars (#3667)

fixes #3666
This commit is contained in:
Alex Lam S.L
2020-01-03 19:28:47 +08:00
committed by GitHub
parent 746f5f6c62
commit fdc10086da
2 changed files with 50 additions and 15 deletions

View File

@@ -6797,24 +6797,28 @@ merge(Compressor.prototype, {
var def = self.definition(); var def = self.definition();
var fixed = self.fixed_value(); var fixed = self.fixed_value();
var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor)); var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor));
if (single_use && fixed instanceof AST_Lambda) { if (single_use) {
if (def.scope !== self.scope if (fixed instanceof AST_Lambda) {
&& (!compressor.option("reduce_funcs") || def.escaped.depth == 1 || fixed.inlined)) { if (def.scope !== self.scope
single_use = false; && (!compressor.option("reduce_funcs") || def.escaped.depth == 1 || fixed.inlined)) {
} else if (recursive_ref(compressor, def)) { single_use = false;
single_use = false; } else if (recursive_ref(compressor, def)) {
} else if (def.scope !== self.scope || def.orig[0] instanceof AST_SymbolFunarg) { single_use = false;
single_use = fixed.is_constant_expression(self.scope); } else if (def.scope !== self.scope || def.orig[0] instanceof AST_SymbolFunarg) {
if (single_use == "f") { single_use = fixed.is_constant_expression(self.scope);
var scope = self.scope; if (single_use == "f") {
do if (scope instanceof AST_Defun || scope instanceof AST_Function) { var scope = self.scope;
scope.inlined = true; do if (scope instanceof AST_Defun || scope instanceof AST_Function) {
} while (scope = scope.parent_scope); scope.inlined = true;
} while (scope = scope.parent_scope);
}
} }
if (single_use) fixed.parent_scope = self.scope;
} else if (!fixed || !fixed.is_constant_expression()) {
single_use = false;
} }
if (single_use) fixed.parent_scope = self.scope;
} }
if (single_use && fixed) { if (single_use) {
def.single_use = false; def.single_use = false;
fixed._squeezed = true; fixed._squeezed = true;
fixed.single_use = true; fixed.single_use = true;

View File

@@ -6847,3 +6847,34 @@ issue_3631_2: {
} }
expect_stdout: "undefined" expect_stdout: "undefined"
} }
issue_3666: {
options = {
collapse_vars: true,
passes: 2,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
try {
var a = "FAIL";
} finally {
for (;!a;)
var c = a++;
var a = "PASS", b = c = "PASS";
}
console.log(a, b);
}
expect: {
try {
var a = "FAIL";
} finally {
for (;!a;)
a++;
var b = a = "PASS";
}
console.log(a, b);
}
expect_stdout: "PASS PASS"
}