} else if (node instanceof AST_SymbolDefun) {
var def = defun.def_function(node, tw.parent());
if (exported) def.exported = true;
- entangle(defun, scope);
} else if (node instanceof AST_SymbolFunarg) {
defun.def_variable(node);
- entangle(defun, scope);
} else if (node instanceof AST_SymbolLambda) {
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
if (options.ie) def.defun = defun.parent_scope.resolve();
} else if (node instanceof AST_SymbolVar) {
var def = defun.def_variable(node, node instanceof AST_SymbolImport ? undefined : null);
if (exported) def.exported = true;
- entangle(defun, scope);
}
function walk_scope(descend) {
scope = save_scope;
defun = save_defun;
}
-
- function entangle(defun, scope) {
- if (defun === scope) return;
- node.mark_enclosed(options);
- var def = scope.find_variable(node.name);
- if (node.thedef === def) return;
- node.thedef = def;
- def.orig.push(node);
- node.mark_enclosed(options);
- }
});
self.make_def = function(orig, init) {
return new SymbolDef(++next_def_id, this, orig, init);
}
if (node instanceof AST_Lambda) {
in_arg.push(node);
+ if (node.name) node.name.walk(tw);
node.argnames.forEach(function(argname) {
argname.walk(tw);
});
// ensure compression works if `const` reuses a scope variable
var redef = def.redefined();
if (redef) redef.const_redefs = true;
+ } else if (def.scope !== node.scope && (node instanceof AST_SymbolDefun
+ || node instanceof AST_SymbolFunarg
+ || node instanceof AST_SymbolVar)) {
+ node.mark_enclosed(options);
+ var redef = node.scope.find_variable(node.name);
+ if (node.thedef !== redef) {
+ node.thedef = redef;
+ redef.orig.push(node);
+ node.mark_enclosed(options);
+ }
}
if (node.name != "arguments") return true;
var parent = node instanceof AST_SymbolVar && tw.parent();