fix corner case in `hoist_vars` (#4860)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 21 Apr 2021 21:47:21 +0000 (22:47 +0100)
committerGitHub <noreply@github.com>
Wed, 21 Apr 2021 21:47:21 +0000 (05:47 +0800)
fixes #4859

lib/compress.js
test/compress/hoist_vars.js
test/ufuzz/index.js

index 010dcf4..846c391 100644 (file)
@@ -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);
             }
index 8db060d..a6efa7a 100644 (file)
@@ -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"
+}
index 5a791f1..69760b2 100644 (file)
@@ -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;
             }