diff --git a/packages/babel-plugin-transform-es2015-parameters/src/rest.js b/packages/babel-plugin-transform-es2015-parameters/src/rest.js index 45c31f61ab01..e1bd77594959 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/rest.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/rest.js @@ -17,6 +17,10 @@ let restIndex = template(` ARGUMENTS.length <= INDEX ? undefined : ARGUMENTS[INDEX] `); +let restIndexImpure = template(` + REF = INDEX, ARGUMENTS.length <= REF ? undefined : ARGUMENTS[REF] +`); + let restLength = template(` ARGUMENTS.length <= OFFSET ? 0 : ARGUMENTS.length - OFFSET `); @@ -161,10 +165,21 @@ function optimiseIndexGetter(path, argsId, offset) { index = t.binaryExpression("+", path.parent.property, t.numericLiteral(offset)); } - path.parentPath.replaceWith(restIndex({ - ARGUMENTS: argsId, - INDEX: index, - })); + const { scope } = path; + if (!scope.isPure(index)) { + let temp = scope.generateUidIdentifierBasedOnNode(index); + scope.push({id: temp, kind: "var"}); + path.parentPath.replaceWith(restIndexImpure({ + ARGUMENTS: argsId, + INDEX: index, + REF: temp + })); + } else { + path.parentPath.replaceWith(restIndex({ + ARGUMENTS: argsId, + INDEX: index, + })); + } } function optimiseLengthGetter(path, argsId, offset) { diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/regression-4348/actual.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/regression-4348/actual.js new file mode 100644 index 000000000000..59a4f8e0519e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/regression-4348/actual.js @@ -0,0 +1,4 @@ +function first(...values) { + var index = 0; + return values[index++]; +} diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/regression-4348/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/regression-4348/expected.js new file mode 100644 index 000000000000..2cee31ca38cf --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/regression-4348/expected.js @@ -0,0 +1,6 @@ +function first() { + var _ref; + + var index = 0; + return _ref = index++ + 0, arguments.length <= _ref ? undefined : arguments[_ref]; +} diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js index 2936b88a09bf..0ce220bc761a 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js @@ -1,6 +1,8 @@ var t = function (f) { + var _ref; + arguments.length <= 1 ? undefined : arguments[1]; - arguments.length <= (arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1 ? undefined : arguments[(arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1]; + _ref = (arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1, arguments.length <= _ref ? undefined : arguments[_ref]; }; function t(f) { @@ -11,4 +13,4 @@ function t(f) { items; items[0]; items[items.length - 1]; -} \ No newline at end of file +}