From 3c161a666259389f96f9aa88a5b6d4e7579d50a4 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 21 Apr 2021 22:47:21 +0100 Subject: [PATCH] fix corner case in `hoist_vars` (#4860) fixes #4859 --- lib/compress.js | 14 +++++++------- test/compress/hoist_vars.js | 29 +++++++++++++++++++++++++++++ test/ufuzz/index.js | 4 +--- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 010dcf46a4..846c391b28 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -6942,9 +6942,7 @@ merge(Compressor.prototype, { if (defs.length > 0) { // try to merge in assignments insert_vars(self.body); - defs = make_node(AST_Var, self, { - definitions: defs - }); + defs = make_node(AST_Var, self, { definitions: defs }); hoisted.push(defs); } } @@ -8367,12 +8365,14 @@ merge(Compressor.prototype, { AST_Definitions.DEFMETHOD("to_assignments", function() { var assignments = this.definitions.reduce(function(a, defn) { 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); a.push(make_node(AST_Assign, defn, { - operator : "=", - left : name, - right : defn.value + operator: "=", + left: name, + right: value, })); def.references.push(name); } diff --git a/test/compress/hoist_vars.js b/test/compress/hoist_vars.js index 8db060df8b..a6efa7af08 100644 --- a/test/compress/hoist_vars.js +++ b/test/compress/hoist_vars.js @@ -265,3 +265,32 @@ issue_4839: { } 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" +} diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js index 5a791f190f..69760b220c 100644 --- a/test/ufuzz/index.js +++ b/test/ufuzz/index.js @@ -1796,11 +1796,9 @@ function createClassLiteral(recurmax, stmtDepth, canThrow, name) { if (SUPPORT.class_field && rng(2)) { s += internal || createObjectKey(recurmax, stmtDepth, canThrow); if (rng(5)) { - async = false; + async = bug_async_class_await && fixed; generator = false; - if (bug_async_class_await && fixed) addAvoidVar("await"); s += " = " + createExpression(recurmax, NO_COMMA, stmtDepth, fixed ? canThrow : CANNOT_THROW); - if (bug_async_class_await && fixed) removeAvoidVar("await"); generator = save_generator; async = save_async; }