fix corner case in `collapse_vars` (#5261)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 3 Jan 2022 20:18:41 +0000 (20:18 +0000)
committerGitHub <noreply@github.com>
Mon, 3 Jan 2022 20:18:41 +0000 (04:18 +0800)
fixes #5260

lib/compress.js
test/compress/const.js
test/compress/let.js

index 308a711..64ec5c4 100644 (file)
@@ -2051,7 +2051,7 @@ Compressor.prototype.compress = function(node) {
                 if (node instanceof AST_BlockScope
                     && !(node instanceof AST_Scope)
                     && !(node.variables && node.variables.all(function(def) {
-                        return !lvalues.has(def.name);
+                        return !enclosed.has(def.name) && !lvalues.has(def.name);
                     }))) {
                     var replace = can_replace;
                     can_replace = false;
@@ -2149,6 +2149,7 @@ Compressor.prototype.compress = function(node) {
                     var read_toplevel = false;
                     var modify_toplevel = false;
                     // Locate symbols which may execute code outside of scanning range
+                    var enclosed = new Dictionary();
                     var well_defined = true;
                     var lvalues = get_lvalues(candidate);
                     var lhs_local = is_lhs_local(lhs);
@@ -3010,6 +3011,9 @@ Compressor.prototype.compress = function(node) {
                                 break;
                             }
                         }
+                        node.enclosed.forEach(function(def) {
+                            if (def.scope !== node) enclosed.set(def.name, true);
+                        });
                         return true;
                     } else if (find_arguments && node instanceof AST_Sub) {
                         scope.each_argname(function(argname) {
index 96210a5..1beccfc 100644 (file)
@@ -1752,3 +1752,38 @@ issue_5254: {
         "bar",
     ]
 }
+
+issue_5260: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        "use strict";
+        var a = "foo", o;
+        while (console.log("bar"));
+        o = {
+            baz: function(b) {
+                console.log(a, b);
+            },
+        };
+        for (const a in o)
+            o[a](a);
+    }
+    expect: {
+        "use strict";
+        var a = "foo", o;
+        while (console.log("bar"));
+        o = {
+            baz: function(b) {
+                console.log(a, b);
+            },
+        };
+        for (const a in o)
+            o[a](a);
+    }
+    expect_stdout: [
+        "bar",
+        "foo baz",
+    ]
+    node_version: ">=4"
+}
index a689fd5..d371892 100644 (file)
@@ -1906,3 +1906,38 @@ issue_5254: {
     ]
     node_version: ">=4"
 }
+
+issue_5260: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        "use strict";
+        var a = "foo", o;
+        while (console.log("bar"));
+        o = {
+            baz: function(b) {
+                console.log(a, b);
+            },
+        };
+        for (let a in o)
+            o[a](a);
+    }
+    expect: {
+        "use strict";
+        var a = "foo", o;
+        while (console.log("bar"));
+        o = {
+            baz: function(b) {
+                console.log(a, b);
+            },
+        };
+        for (let a in o)
+            o[a](a);
+    }
+    expect_stdout: [
+        "bar",
+        "foo baz",
+    ]
+    node_version: ">=4"
+}