diff --git a/packages/babel-plugin-transform-es2015-parameters/src/rest.js b/packages/babel-plugin-transform-es2015-parameters/src/rest.js index 3f0bd764d7..6a3b15e8d4 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/rest.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/rest.js @@ -29,12 +29,15 @@ let memberExpressionOptimisationVisitor = { }, Function(path, state) { - // skip over functions as whatever `arguments` we reference inside will refer - // to the wrong function + // Detect whether any reference to rest is contained in nested functions to + // determine if deopt is necessary. let oldNoOptimise = state.noOptimise; state.noOptimise = true; path.traverse(memberExpressionOptimisationVisitor, state); state.noOptimise = oldNoOptimise; + + // Skip because optimizing references to rest would refer to the `arguments` + // of the nested function. path.skip(); }, @@ -165,7 +168,18 @@ export let visitor = { // local rest binding name name: rest.name, - // whether any references to the rest parameter were made in a function + /* + It may be possible to optimize the output code in certain ways, such as + not generating code to initialize an array (perhaps substituting direct + references to arguments[i] or arguments.length for reads of the + corresponding rest parameter property) or positioning the initialization + code so that it may not have to execute depending on runtime conditions. + + This property tracks eligibility for optimization. "deopted" means give up + and don't perform optimization. For example, when any of rest's elements / + properties is assigned to at the top level, or referenced at all in a + nested function. + */ deopted: false, };