collapse_vars: fix bug in repeated var defs of same name
This commit is contained in:
@@ -255,16 +255,25 @@ merge(Compressor.prototype, {
|
|||||||
var var_defs = prev_stat.definitions;
|
var var_defs = prev_stat.definitions;
|
||||||
if (var_defs == null) continue;
|
if (var_defs == null) continue;
|
||||||
|
|
||||||
// Scan variable definitions from right to left.
|
var var_names_seen = {};
|
||||||
var side_effects_encountered = false;
|
var side_effects_encountered = false;
|
||||||
var lvalues_encountered = false;
|
var lvalues_encountered = false;
|
||||||
var lvalues = {};
|
var lvalues = {};
|
||||||
|
|
||||||
|
// Scan variable definitions from right to left.
|
||||||
for (var var_defs_index = var_defs.length; --var_defs_index >= 0;) {
|
for (var var_defs_index = var_defs.length; --var_defs_index >= 0;) {
|
||||||
|
|
||||||
|
// Obtain var declaration and var name with basic sanity check.
|
||||||
var var_decl = var_defs[var_defs_index];
|
var var_decl = var_defs[var_defs_index];
|
||||||
if (var_decl.value == null) continue;
|
if (var_decl.value == null) break;
|
||||||
|
var var_name = var_decl.name.name;
|
||||||
|
if (!var_name || !var_name.length) break;
|
||||||
|
|
||||||
|
// Bail if we've seen a var definition of same name before.
|
||||||
|
if (var_name in var_names_seen) break;
|
||||||
|
var_names_seen[var_name] = true;
|
||||||
|
|
||||||
// Only interested in cases with just one reference to the variable.
|
// Only interested in cases with just one reference to the variable.
|
||||||
var var_name = var_decl.name.name;
|
|
||||||
var def = self.find_variable && self.find_variable(var_name);
|
var def = self.find_variable && self.find_variable(var_name);
|
||||||
if (!def || !def.references || def.references.length !== 1 || var_name == "arguments") {
|
if (!def || !def.references || def.references.length !== 1 || var_name == "arguments") {
|
||||||
side_effects_encountered = true;
|
side_effects_encountered = true;
|
||||||
|
|||||||
@@ -685,19 +685,35 @@ collapse_vars_repeated: {
|
|||||||
var dummy = 3, a = 5, unused = 2, a = 1, a = 3;
|
var dummy = 3, a = 5, unused = 2, a = 1, a = 3;
|
||||||
return -a;
|
return -a;
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2(x) {
|
||||||
var a = 3, a = a + 2;
|
var a = 3, a = x;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
(function(x){
|
||||||
|
var a = "GOOD" + x, e = "BAD", k = "!", e = a;
|
||||||
|
console.log(e + k);
|
||||||
|
})("!"),
|
||||||
|
|
||||||
|
(function(x){
|
||||||
|
var a = "GOOD" + x, e = "BAD" + x, k = "!", e = a;
|
||||||
|
console.log(e + k);
|
||||||
|
})("!");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1() {
|
function f1() {
|
||||||
return -3
|
return -3
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2(x) {
|
||||||
var a = 3, a = a + 2;
|
return x
|
||||||
return a
|
|
||||||
}
|
}
|
||||||
|
(function(x){
|
||||||
|
var a = "GOOD" + x, e = "BAD", e = a;
|
||||||
|
console.log(e + "!");
|
||||||
|
})("!"),
|
||||||
|
(function(x){
|
||||||
|
var a = "GOOD" + x, e = "BAD" + x, e = a;
|
||||||
|
console.log(e + "!");
|
||||||
|
})("!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user