fix corner case in `functions` (#4260)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 5 Nov 2020 19:55:25 +0000 (19:55 +0000)
committerGitHub <noreply@github.com>
Thu, 5 Nov 2020 19:55:25 +0000 (03:55 +0800)
fixes #4259

lib/compress.js
test/compress/functions.js
test/compress/reduce_vars.js

index 0c49d49..ab837f6 100644 (file)
@@ -1424,8 +1424,9 @@ merge(Compressor.prototype, {
                     if (!--replaced) abort = true;
                     if (is_lhs(node, multi_replacer.parent())) return node;
                     def.replaced++;
-                    value_def.replaced--;
-                    return rvalue.clone();
+                    var ref = rvalue.clone();
+                    value_def.references.push(ref);
+                    return ref;
                 }
                 // Skip (non-executed) functions and (leading) default case in switch statements
                 if (node instanceof AST_Default || node instanceof AST_Scope) return node;
@@ -5433,7 +5434,7 @@ merge(Compressor.prototype, {
                     vars.set(def.name.name, def);
                     ++vars_found;
                 });
-                var seq = node.to_assignments(compressor);
+                var seq = node.to_assignments();
                 var p = tt.parent();
                 if (p instanceof AST_ForIn && p.init === node) {
                     if (seq) return seq;
@@ -6716,21 +6717,19 @@ merge(Compressor.prototype, {
     AST_Let.DEFMETHOD("remove_initializers", remove_initializers);
     AST_Var.DEFMETHOD("remove_initializers", remove_initializers);
 
-    AST_Definitions.DEFMETHOD("to_assignments", function(compressor) {
-        var reduce_vars = compressor.option("reduce_vars");
-        var assignments = this.definitions.reduce(function(a, def) {
-            if (def.value) {
-                var name = make_node(AST_SymbolRef, def.name, def.name);
-                a.push(make_node(AST_Assign, def, {
+    AST_Definitions.DEFMETHOD("to_assignments", function() {
+        var assignments = this.definitions.reduce(function(a, defn) {
+            var def = defn.name.definition();
+            if (defn.value) {
+                var name = make_node(AST_SymbolRef, defn.name, defn.name);
+                a.push(make_node(AST_Assign, defn, {
                     operator : "=",
                     left     : name,
-                    right    : def.value
+                    right    : defn.value
                 }));
-                if (reduce_vars) name.definition().fixed = false;
+                def.references.push(name);
             }
-            def = def.name.definition();
             def.eliminated++;
-            def.replaced--;
             return a;
         }, []);
         if (assignments.length == 0) return null;
index 4ed0dc1..c2ab23f 100644 (file)
@@ -5115,3 +5115,29 @@ issue_4233: {
     }
     expect_stdout: "number"
 }
+
+issue_4259: {
+    options = {
+        collapse_vars: true,
+        functions: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = function b() {
+            var c = b;
+            for (b in c);
+        };
+        a();
+        console.log(typeof a);
+    }
+    expect: {
+        function a() {
+            for (a in a);
+        }
+        a();
+        console.log(typeof a);
+    }
+    expect_stdout: "function"
+}
index ea3703c..838b130 100644 (file)
@@ -1999,7 +1999,7 @@ issue_1606: {
             var a, b;
             function g(){};
             b = 2;
-            x(b);
+            x(2);
         }
     }
 }