fix corner case in hoist_vars (#5864)

fixes #5863
This commit is contained in:
Alex Lam S.L
2024-06-25 19:19:47 +03:00
committed by GitHub
parent 205a1d1f19
commit 6669ea19ef
2 changed files with 36 additions and 6 deletions

View File

@@ -8484,7 +8484,8 @@ Compressor.prototype.compress = function(node) {
&& self.find_variable(sym.name) === sym.definition(); && self.find_variable(sym.name) === sym.definition();
})) return node; })) return node;
node.definitions.forEach(function(defn) { node.definitions.forEach(function(defn) {
vars.set(defn.name.name, defn); var name = defn.name.name;
if (!vars.has(name)) vars.set(name, defn);
}); });
var seq = node.to_assignments(); var seq = node.to_assignments();
if (p instanceof AST_ForEnumeration && p.init === node) { if (p instanceof AST_ForEnumeration && p.init === node) {
@@ -8511,13 +8512,14 @@ Compressor.prototype.compress = function(node) {
return !ref.in_arg; return !ref.in_arg;
})) vars.del(argname.name); })) vars.del(argname.name);
}); });
vars.each(function(defn, name) { vars.each(function(defn) {
var name = defn.name;
defn = defn.clone(); defn = defn.clone();
defn.name = defn.name.clone(); defn.name = name.clone();
defn.value = null; defn.value = null;
defns.push(defn); defns.push(defn);
vars.set(name, defn); var orig = name.definition().orig;
defn.name.definition().orig.unshift(defn.name); orig.splice(orig.indexOf(name), 0, defn.name);
}); });
if (defns.length > 0) hoisted.push(make_node(AST_Var, self, { definitions: defns })); if (defns.length > 0) hoisted.push(make_node(AST_Var, self, { definitions: defns }));
} }
@@ -10348,8 +10350,8 @@ Compressor.prototype.compress = function(node) {
} }
}); });
def.references.push(name); def.references.push(name);
}
def.assignments++; def.assignments++;
}
def.eliminated++; def.eliminated++;
def.single_use = false; def.single_use = false;
return a; return a;

View File

@@ -3107,3 +3107,31 @@ issue_5774: {
expect_stdout: "PASS" expect_stdout: "PASS"
node_version: ">=6" node_version: ">=6"
} }
issue_5863: {
options = {
collapse_vars: true,
hoist_vars: true,
}
input: {
console.log(typeof function f(a = function() {
f = 42;
return f;
}()) {
var f;
var f;
return a;
}());
}
expect: {
console.log(typeof function f(a = function() {
f = 42;
return f;
}()) {
var f;
return a;
}());
}
expect_stdout: "function"
node_version: ">=6"
}