collapse_vars: fix bug in repeated var defs of same name
This commit is contained in:
parent
3eb9101918
commit
e0961f7b03
|
|
@ -255,16 +255,25 @@ merge(Compressor.prototype, {
|
|||
var var_defs = prev_stat.definitions;
|
||||
if (var_defs == null) continue;
|
||||
|
||||
// Scan variable definitions from right to left.
|
||||
var var_names_seen = {};
|
||||
var side_effects_encountered = false;
|
||||
var lvalues_encountered = false;
|
||||
var lvalues = {};
|
||||
|
||||
// Scan variable definitions from right to left.
|
||||
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];
|
||||
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.
|
||||
var var_name = var_decl.name.name;
|
||||
var def = self.find_variable && self.find_variable(var_name);
|
||||
if (!def || !def.references || def.references.length !== 1 || var_name == "arguments") {
|
||||
side_effects_encountered = true;
|
||||
|
|
|
|||
|
|
@ -1087,3 +1087,33 @@ collapse_vars_short_circuit: {
|
|||
}
|
||||
}
|
||||
|
||||
collapse_vars_repeat_of_same_var_name: {
|
||||
options = {
|
||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||
}
|
||||
input: {
|
||||
(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: {
|
||||
(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 + "?");
|
||||
})("!");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user