fix nested unused assignments (#2769)

fixes #2768
This commit is contained in:
Alex Lam S.L
2018-01-11 23:13:44 +08:00
committed by GitHub
parent 23ec484806
commit b757450cd8
2 changed files with 60 additions and 10 deletions

View File

@@ -2817,7 +2817,7 @@ merge(Compressor.prototype, {
def.value.walk(tw); def.value.walk(tw);
} }
if (def.name.fixed_value() === def.value) { if (def.name.fixed_value() === def.value) {
fixed_ids[node_def.id] = true; fixed_ids[node_def.id] = def;
} }
} }
}); });
@@ -2846,9 +2846,7 @@ merge(Compressor.prototype, {
var def = sym.definition(); var def = sym.definition();
var in_use = def.id in in_use_ids; var in_use = def.id in in_use_ids;
if (node instanceof AST_Assign) { if (node instanceof AST_Assign) {
if (!in_use if (!in_use || def.id in fixed_ids && fixed_ids[def.id] !== node) {
|| def.id in fixed_ids
&& node.left.fixed_value() !== node.right) {
return maintain_this_binding(parent, node, node.right.transform(tt)); return maintain_this_binding(parent, node, node.right.transform(tt));
} }
} else if (!in_use) return make_node(AST_Number, node, { } else if (!in_use) return make_node(AST_Number, node, {
@@ -2902,25 +2900,29 @@ merge(Compressor.prototype, {
if (def.value) def.value = def.value.transform(tt); if (def.value) def.value = def.value.transform(tt);
var sym = def.name.definition(); var sym = def.name.definition();
if (!drop_vars || sym.id in in_use_ids) { if (!drop_vars || sym.id in in_use_ids) {
if (def.value && sym.id in fixed_ids && fixed_ids[sym.id] !== def) {
def.value = def.value.drop_side_effect_free(compressor);
}
if (def.name instanceof AST_SymbolVar) { if (def.name instanceof AST_SymbolVar) {
var var_defs = var_defs_by_id.get(sym.id); var var_defs = var_defs_by_id.get(sym.id);
if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) { if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) {
compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name)); compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name));
if (def.value) { if (def.value) {
side_effects.push(make_node(AST_Assign, def, { var assign = make_node(AST_Assign, def, {
operator: "=", operator: "=",
left: make_node(AST_SymbolRef, def.name, def.name), left: make_node(AST_SymbolRef, def.name, def.name),
right: def.value right: def.value
}).transform(tt)); });
if (fixed_ids[sym.id] === def) {
fixed_ids[sym.id] = assign;
}
side_effects.push(assign.transform(tt));
} }
remove(var_defs, def); remove(var_defs, def);
sym.eliminated++; sym.eliminated++;
return; return;
} }
} }
if (def.value && sym.id in fixed_ids && def.name.fixed_value() !== def.value) {
def.value = def.value.drop_side_effect_free(compressor);
}
if (def.value) { if (def.value) {
if (side_effects.length > 0) { if (side_effects.length > 0) {
if (tail.length > 0) { if (tail.length > 0) {
@@ -3031,7 +3033,7 @@ merge(Compressor.prototype, {
if (node instanceof AST_Assign) { if (node instanceof AST_Assign) {
node.right.walk(tw); node.right.walk(tw);
if (node.left.fixed_value() === node.right) { if (node.left.fixed_value() === node.right) {
fixed_ids[node_def.id] = true; fixed_ids[node_def.id] = node;
} }
} }
return true; return true;

View File

@@ -1644,3 +1644,51 @@ cascade_drop_assign: {
} }
expect_stdout: "PASS" expect_stdout: "PASS"
} }
chained_3: {
options = {
reduce_vars: true,
unused: true,
}
input: {
console.log(function(a, b) {
var c = a, c = b;
b++;
return c;
}(1, 2));
}
expect: {
console.log(function(a, b) {
var c = b;
b++;
return c;
}(0, 2));
}
expect_stdout: "2"
}
issue_2768: {
options = {
inline: true,
reduce_vars: true,
sequences: true,
side_effects: true,
toplevel: true,
unused: true,
}
input: {
var a = "FAIL", c = 1;
var c = function(b) {
var d = b = a;
var e = --b + (d && (a = "PASS"));
}();
console.log(a, typeof c);
}
expect: {
var a = "FAIL";
var c = (d = a, 0, void (d && (a = "PASS")));
var d;
console.log(a, typeof c);
}
expect_stdout: "PASS undefined"
}