fix corner case in hoist_vars (#4860)

fixes #4859
This commit is contained in:
Alex Lam S.L
2021-04-21 22:47:21 +01:00
committed by GitHub
parent c58e174647
commit 3c161a6662
3 changed files with 37 additions and 10 deletions

View File

@@ -6942,9 +6942,7 @@ merge(Compressor.prototype, {
if (defs.length > 0) { if (defs.length > 0) {
// try to merge in assignments // try to merge in assignments
insert_vars(self.body); insert_vars(self.body);
defs = make_node(AST_Var, self, { defs = make_node(AST_Var, self, { definitions: defs });
definitions: defs
});
hoisted.push(defs); hoisted.push(defs);
} }
} }
@@ -8367,12 +8365,14 @@ merge(Compressor.prototype, {
AST_Definitions.DEFMETHOD("to_assignments", function() { AST_Definitions.DEFMETHOD("to_assignments", function() {
var assignments = this.definitions.reduce(function(a, defn) { var assignments = this.definitions.reduce(function(a, defn) {
var def = defn.name.definition(); var def = defn.name.definition();
if (defn.value) { var value = defn.value;
if (value) {
if (value instanceof AST_Sequence) value = value.clone();
var name = make_node(AST_SymbolRef, defn.name, defn.name); var name = make_node(AST_SymbolRef, defn.name, defn.name);
a.push(make_node(AST_Assign, defn, { a.push(make_node(AST_Assign, defn, {
operator : "=", operator: "=",
left : name, left: name,
right : defn.value right: value,
})); }));
def.references.push(name); def.references.push(name);
} }

View File

@@ -265,3 +265,32 @@ issue_4839: {
} }
expect_stdout: "PASS" expect_stdout: "PASS"
} }
issue_4859: {
options = {
evaluate: true,
hoist_vars: true,
keep_infinity: true,
merge_vars: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function f(a) {
var b = (a = 2, 1 / 0), c = 3;
var d = a + b;
console.log(d);
return f;
}
f();
}
expect: {
(function f(a) {
var d = 1 / 0, d = Infinity;
console.log(d);
return f;
})();
}
expect_stdout: "Infinity"
}

View File

@@ -1796,11 +1796,9 @@ function createClassLiteral(recurmax, stmtDepth, canThrow, name) {
if (SUPPORT.class_field && rng(2)) { if (SUPPORT.class_field && rng(2)) {
s += internal || createObjectKey(recurmax, stmtDepth, canThrow); s += internal || createObjectKey(recurmax, stmtDepth, canThrow);
if (rng(5)) { if (rng(5)) {
async = false; async = bug_async_class_await && fixed;
generator = false; generator = false;
if (bug_async_class_await && fixed) addAvoidVar("await");
s += " = " + createExpression(recurmax, NO_COMMA, stmtDepth, fixed ? canThrow : CANNOT_THROW); s += " = " + createExpression(recurmax, NO_COMMA, stmtDepth, fixed ? canThrow : CANNOT_THROW);
if (bug_async_class_await && fixed) removeAvoidVar("await");
generator = save_generator; generator = save_generator;
async = save_async; async = save_async;
} }