From 360628de962aecdc45fa473bb6e3386c9a8a1e76 Mon Sep 17 00:00:00 2001 From: Richard van Velzen Date: Fri, 25 Oct 2013 15:54:35 +0200 Subject: [PATCH] Fix mangling issues with safari Fixes #326 and #179 It isn't a really clean solution, but it works. The idea is to "virtually" reference the function name inside the scope. But to be able know it isn't *really* referenced, we add a `virtual` flag to `AST_SymbolRef.reference`. --- lib/scope.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index 713a2c92..3d3ea1af 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -145,6 +145,16 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(){ func = node; descend(); func = prev_func; + + if (node instanceof AST_Function && node.name && node.argnames.length) { + var ref = new AST_SymbolRef({ + scope: node.argnames[0].scope, + name: node.name.name, + thedef: node.name.thedef + }); + ref.reference(true); + } + return true; } if (node instanceof AST_SymbolRef) { @@ -199,9 +209,9 @@ AST_Lambda.DEFMETHOD("init_scope_vars", function(){ this.uses_arguments = false; }); -AST_SymbolRef.DEFMETHOD("reference", function() { +AST_SymbolRef.DEFMETHOD("reference", function(virtual) { var def = this.definition(); - def.references.push(this); + if (!virtual) def.references.push(this); var s = this.scope; while (s) { push_uniq(s.enclosed, def);