From 49010759608ad306b2d561b1abe915a88dbf569c Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 28 May 2015 10:22:12 -0400 Subject: [PATCH] deopt rest parameter member expression optimisation on child arrow functions - fixes #1631 --- .../transformers/es6/parameters.rest.js | 13 ++++-- .../arrow-functions/actual.js | 32 ++++++++------ .../arrow-functions/expected.js | 43 ++++++++++++------- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/src/babel/transformation/transformers/es6/parameters.rest.js b/src/babel/transformation/transformers/es6/parameters.rest.js index 8848816691..920caa6424 100644 --- a/src/babel/transformation/transformers/es6/parameters.rest.js +++ b/src/babel/transformation/transformers/es6/parameters.rest.js @@ -9,6 +9,13 @@ var memberExpressionOptimisationVisitor = { return this.skip(); } + var stop = () => { + state.canOptimise = false; + this.stop(); + }; + + if (this.isArrowFunctionExpression()) return stop(); + // skip over functions as whatever `arguments` we reference inside will refer // to the wrong function if (this.isFunctionDeclaration() || this.isFunctionExpression()) { @@ -31,8 +38,7 @@ var memberExpressionOptimisationVisitor = { } } - state.canOptimise = false; - this.stop(); + stop(); } }; @@ -90,8 +96,7 @@ export function Func/*tion*/(node, parent, scope, file) { // we only have shorthands and there's no other references if (state.canOptimise && state.candidates.length) { - for (var i = 0; i < state.candidates.length; i++) { - var candidate = state.candidates[i]; + for (var candidate of (state.candidates: Array)) { candidate.replaceWith(argsId); optimizeMemberExpression(candidate.parent, node.params.length); } diff --git a/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/actual.js b/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/actual.js index a01666d75d..9319e6f479 100644 --- a/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/actual.js +++ b/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/actual.js @@ -1,19 +1,25 @@ var concat = (...arrs) => { - var x = arrs[0]; - var y = arrs[1]; + var x = arrs[0]; + var y = arrs[1]; }; var somefun = function () { - let get2ndArg = (a, b, ...args1) => { - var _b = args1[0]; - let somef = (x, y, z, ...args2) => { - var _a = args2[0]; - }; - let somefg = (c, d, e, f, ...args3) => { - var _a = args3[0]; - }; - var _c = arguments[1]; - var _d = args1[1]; + let get2ndArg = (a, b, ...args1) => { + var _b = args1[0]; + let somef = (x, y, z, ...args2) => { + var _a = args2[0]; }; - let get1stArg = (...args) => args[0]; + let somefg = (c, d, e, f, ...args3) => { + var _a = args3[0]; + }; + var _c = arguments[1]; + var _d = args1[1]; + }; + let get1stArg = (...args) => args[0]; +} + +function demo1(...args) { + return (i) => { + return args[i+0]; + }; } diff --git a/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/expected.js b/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/expected.js index c345b2a74c..0ad069e01e 100644 --- a/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/expected.js +++ b/test/core/fixtures/transformation/es6.parameters.rest/arrow-functions/expected.js @@ -1,26 +1,39 @@ "use strict"; var concat = function concat() { - var x = arguments[0]; - var y = arguments[1]; + var x = arguments[0]; + var y = arguments[1]; }; var somefun = function somefun() { - var _arguments = arguments; + var _arguments = arguments; - var get2ndArg = function get2ndArg(a, b) { - var _b = arguments[2]; - var somef = function somef(x, y, z) { - var _a = arguments[3]; - }; - var somefg = function somefg(c, d, e, f) { - var _a = arguments[4]; - }; - var _c = _arguments[1]; - var _d = arguments[3]; + var get2ndArg = function get2ndArg(a, b) { + for (var _len = arguments.length, args1 = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args1[_key - 2] = arguments[_key]; + } + + var _b = args1[0]; + var somef = function somef(x, y, z) { + var _a = arguments[3]; }; - var get1stArg = function get1stArg() { - return arguments[0]; + var somefg = function somefg(c, d, e, f) { + var _a = arguments[4]; }; + var _c = _arguments[1]; + var _d = args1[1]; + }; + var get1stArg = function get1stArg() { + return arguments[0]; + }; }; +function demo1() { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + return function (i) { + return args[i + 0]; + }; +}