diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/scope.js | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/scope.js b/lib/scope.js index 82a935a2..c147ce00 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -79,7 +79,7 @@ SymbolDef.prototype = { if (options.ie8 && sym instanceof AST_SymbolLambda) s = s.parent_scope; var def; - if (this.defun && (def = this.defun.variables.get(this.name))) { + if (def = this.redefined()) { this.mangled_name = def.mangled_name || def.name; } else this.mangled_name = s.next_mangled(options, this); @@ -87,6 +87,9 @@ SymbolDef.prototype = { cache.set(this.name, this.mangled_name); } } + }, + redefined: function() { + return this.defun && this.defun.variables.get(this.name); } }; @@ -206,6 +209,16 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ node.reference(options); return true; } + // ensure mangling works if catch reuses a scope variable + var def; + if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) { + var s = node.scope; + while (s) { + push_uniq(s.enclosed, def); + if (s === def.scope) break; + s = s.parent_scope; + } + } }); self.walk(tw); |