if (def) {
this.mangled_name = def.mangled_name || def.name;
} else {
- this.mangled_name = next_mangled_name(this.scope, options, this);
+ this.mangled_name = next_mangled_name(this, options);
}
if (this.global && cache) {
cache.set(this.name, this.mangled_name);
return names;
}
-function next_mangled_name(scope, options, def) {
+function next_mangled_name(def, options) {
+ var scope = def.scope;
var in_use = names_in_use(scope, options);
var holes = scope.cname_holes;
var names = Object.create(null);
return true;
}
if (node instanceof AST_BlockScope) {
- var to_mangle = [];
+ node.to_mangle = [];
node.variables.each(function(def) {
- if (!defer_redef(def)) to_mangle.push(def);
+ if (!defer_redef(def)) node.to_mangle.push(def);
});
descend();
if (options.cache && node instanceof AST_Toplevel) {
sym.scope = node;
sym.reference(options);
}
- to_mangle.forEach(mangle);
+ node.to_mangle.forEach(mangle);
return true;
}
if (node instanceof AST_Label) {
def.mangle(options);
}
- function defer_redef(def, node) {
+ function defer_redef(def) {
+ var sym = def.orig[0];
var redef = def.redefined();
- if (!redef) return false;
+ if (!redef) {
+ if (!(sym instanceof AST_SymbolConst)) return false;
+ var scope = def.scope.resolve();
+ if (def.scope === scope) return false;
+ redef = scope.def_variable(sym);
+ scope.to_mangle.push(redef);
+ }
redefined.push(def);
def.references.forEach(reference);
- var node = def.orig[0];
- if (node instanceof AST_SymbolCatch || node instanceof AST_SymbolConst) reference(node);
+ if (sym instanceof AST_SymbolCatch || sym instanceof AST_SymbolConst) reference(sym);
return true;
function reference(sym) {