diff --git a/lib/compress.js b/lib/compress.js index 6af086f7..6cd5571e 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index f67b3f47..4c1ebdd7 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -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 + "?"); + })("!"); + } +} +