From c2f6fd5fded46624da3851e3accc3b5165e6d588 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 5 Nov 2020 19:55:25 +0000 Subject: [PATCH] fix corner case in `functions` (#4260) fixes #4259 --- lib/compress.js | 25 ++++++++++++------------- test/compress/functions.js | 26 ++++++++++++++++++++++++++ test/compress/reduce_vars.js | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 0c49d49d..ab837f60 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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; diff --git a/test/compress/functions.js b/test/compress/functions.js index 4ed0dc1b..c2ab23f6 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -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" +} diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index ea3703c1..838b130a 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -1999,7 +1999,7 @@ issue_1606: { var a, b; function g(){}; b = 2; - x(b); + x(2); } } } -- 2.34.1