diff --git a/src/babel/transformation/transformers/es6/parameters/default.js b/src/babel/transformation/transformers/es6/parameters/default.js index 7e022d8811..6f6c8ea093 100644 --- a/src/babel/transformation/transformers/es6/parameters/default.js +++ b/src/babel/transformation/transformers/es6/parameters/default.js @@ -38,7 +38,7 @@ export var visitor = { // var argsIdentifier = t.identifier("arguments"); - argsIdentifier._shadowedFunctionLiteral = node; + argsIdentifier._shadowedFunctionLiteral = this; // push a default parameter definition function pushDefNode(left, right, i) { diff --git a/src/babel/transformation/transformers/es6/parameters/rest.js b/src/babel/transformation/transformers/es6/parameters/rest.js index 4d1ee7f93a..c467283772 100644 --- a/src/babel/transformation/transformers/es6/parameters/rest.js +++ b/src/babel/transformation/transformers/es6/parameters/rest.js @@ -84,7 +84,7 @@ export var visitor = { var argsId = t.identifier("arguments"); // otherwise `arguments` will be remapped in arrow functions - argsId._shadowedFunctionLiteral = node; + argsId._shadowedFunctionLiteral = this; // support patterns if (t.isPattern(rest)) { diff --git a/src/babel/transformation/transformers/es6/tail-call.js b/src/babel/transformation/transformers/es6/tail-call.js index 115624241f..610b63f8e5 100644 --- a/src/babel/transformation/transformers/es6/tail-call.js +++ b/src/babel/transformation/transformers/es6/tail-call.js @@ -211,7 +211,7 @@ class TailCallTransformer { var decl = t.variableDeclarator(this.argumentsId); if (this.argumentsId) { decl.init = t.identifier("arguments"); - decl.init._shadowedFunctionLiteral = node; + decl.init._shadowedFunctionLiteral = this.path; } topVars.push(decl); } diff --git a/src/babel/transformation/transformers/internal/shadow-functions.js b/src/babel/transformation/transformers/internal/shadow-functions.js index c3445ce061..c8d5de6d90 100644 --- a/src/babel/transformation/transformers/internal/shadow-functions.js +++ b/src/babel/transformation/transformers/internal/shadow-functions.js @@ -9,15 +9,31 @@ function remap(path, key, create) { if (!path.inShadow()) return; var shadowed = path.node._shadowedFunctionLiteral; + var currentFunction; var fnPath = path.findParent(function (path) { if (shadowed) { - return path.node === shadowed; + // only match our shadowed function parent + if (path === shadowed) { + // found our target reference function + currentFunction = path; + return true; + } else { + return false; + } + } else if (path.isFunction() || path.isProgram()) { + // catch current function in case this is the shadowed one + if (!currentFunction) currentFunction = path; + + return !path.is("shadow"); } else { - return !path.is("shadow") && (path.isFunction() || path.isProgram()); + return false; } }); + // no point in realiasing if we're in this function + if (fnPath === currentFunction) return; + var cached = fnPath.getData(key); if (cached) return cached;