fix corner case in functions (#4260)

fixes #4259
This commit is contained in:
Alex Lam S.L
2020-11-05 19:55:25 +00:00
committed by GitHub
parent af4ea3ff69
commit c2f6fd5fde
3 changed files with 39 additions and 14 deletions

View 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;

View 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"
}

View File

@@ -1999,7 +1999,7 @@ issue_1606: {
var a, b;
function g(){};
b = 2;
x(b);
x(2);
}
}
}