diff --git a/packages/babel-plugin-transform-es2015-parameters/src/rest.js b/packages/babel-plugin-transform-es2015-parameters/src/rest.js index bda2cb0557..265996da7d 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/rest.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/rest.js @@ -60,6 +60,12 @@ let memberExpressionOptimisationVisitor = { let {parentPath} = path; let grandparentPath = parentPath.parentPath; + // ex: [rest[0]] = [rest[1]] + if (grandparentPath.isLVal()) { + state.deopted = true; + return; + } + // ex: args[0] if ( parentPath.isMemberExpression({ computed: true, object: node }) && @@ -68,7 +74,8 @@ let memberExpressionOptimisationVisitor = { !( grandparentPath.isAssignmentExpression() && parentPath.node === grandparentPath.node.left - ) + ) && + !grandparentPath.isForInStatement() ) { // if we know that this member expression is referencing a number then // we can safely optimise it diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-member-expression-deoptimisation/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-member-expression-deoptimisation/expected.js index f8a3e5d0eb..2354ea3aee 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-member-expression-deoptimisation/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-member-expression-deoptimisation/expected.js @@ -83,10 +83,12 @@ function swap() { rest[_key9] = arguments[_key9]; } - [rest[0], rest[1]] = [rest[1], rest[0]]; + var _ref = [rest[1], rest[0]]; + rest[0] = _ref[0]; + rest[1] = _ref[1]; } -function x() { +function forIn() { for (var _len10 = arguments.length, rest = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { rest[_key10] = arguments[_key10]; }