fix corner case in `hoist_vars` (#5188)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 23 Nov 2021 10:00:47 +0000 (10:00 +0000)
committerGitHub <noreply@github.com>
Tue, 23 Nov 2021 10:00:47 +0000 (18:00 +0800)
fixes #5187

lib/compress.js
test/compress/hoist_vars.js

index f59a996..f431b16 100644 (file)
@@ -9071,10 +9071,13 @@ merge(Compressor.prototype, {
                     right: value,
                 });
                 a.push(assign);
-                name.fixed = function() {
+                var fixed = function() {
                     return assign.right;
                 };
-                name.fixed.assigns = [ assign ];
+                fixed.assigns = [ assign ];
+                fixed.direct_access = def.direct_access;
+                fixed.escaped = def.escaped;
+                name.fixed = fixed;
                 def.references.forEach(function(ref) {
                     var assigns = ref.fixed && ref.fixed.assigns;
                     if (assigns && assigns[0] === defn) assigns[0] = assign;
index 983b47e..fde3639 100644 (file)
@@ -418,3 +418,32 @@ issue_4898: {
     }
     expect_stdout: "PASS"
 }
+
+issue_5187: {
+    options = {
+        hoist_props: true,
+        hoist_vars: true,
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f() {
+            var a = 42;
+            do {
+                var b = { 0: a++ };
+            } while (console.log(b[b ^= 0]));
+        }
+        f();
+    }
+    expect: {
+        (function() {
+            var b, a = 42;
+            do {
+                b = { 0: a++ };
+            } while (console.log(b[b ^= 0]));
+        })();
+    }
+    expect_stdout: "42"
+}