diff --git a/src/babel/transformation/transformers/es6/parameters.rest.js b/src/babel/transformation/transformers/es6/parameters.rest.js index 747662e1fd..bdf156a107 100644 --- a/src/babel/transformation/transformers/es6/parameters.rest.js +++ b/src/babel/transformation/transformers/es6/parameters.rest.js @@ -29,7 +29,6 @@ var memberExpressionOptimisationVisitor = { var prop = parent.property; if (isNumber(prop.value) || t.isUnaryExpression(prop) || t.isBinaryExpression(prop)) { state.candidates.push(this); - state.canOptimise = true; return; } } @@ -81,7 +80,7 @@ exports.Function = function (node, parent, scope) { var state = { outerBinding: scope.getBindingIdentifier(rest.name), - canOptimise: false, + canOptimise: true, candidates: [], method: node, name: rest.name @@ -90,7 +89,7 @@ exports.Function = function (node, parent, scope) { scope.traverse(node, memberExpressionOptimisationVisitor, state); // we only have shorthands and there's no other references - if (state.canOptimise) { + if (state.canOptimise && state.candidates.length) { for (var i = 0; i < state.candidates.length; i++) { var candidate = state.candidates[i]; candidate.node = argsId; diff --git a/test/fixtures/transformation/es6-parameters.rest/deopt/actual.js b/test/fixtures/transformation/es6-parameters.rest/deopt/actual.js index f7eab07df8..b559fc0e51 100644 --- a/test/fixtures/transformation/es6-parameters.rest/deopt/actual.js +++ b/test/fixtures/transformation/es6-parameters.rest/deopt/actual.js @@ -8,17 +8,23 @@ var y = function (foo, ...bar) { }; }; +var b = function (x, y, ...args) { + console.log(args[0]); + args.pop(); + console.log(args[1]); +}; + var z = function (foo, ...bar) { - var x = function () { - bar[1] = 5; - }; + var x = function () { + bar[1] = 5; + }; }; var a = function (foo, ...bar) { - return bar.join(','); + return bar.join(','); }; var b = function (foo, ...bar) { - var join = "join"; - return bar[join]; + var join = "join"; + return bar[join]; }; diff --git a/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js b/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js index 07e408cfb0..fff7c33680 100644 --- a/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js +++ b/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js @@ -1,47 +1,56 @@ "use strict"; var x = function x(foo) { - for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bar[_key - 1] = arguments[_key]; - } + for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + bar[_key - 1] = arguments[_key]; + } - console.log(bar); + console.log(bar); }; var y = function y(foo) { - for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bar[_key - 1] = arguments[_key]; - } + for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + bar[_key - 1] = arguments[_key]; + } - var x = function z(bar) { - bar[1] = 5; - }; + var x = function z(bar) { + bar[1] = 5; + }; +}; + +var b = function b(x, y) { + for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + console.log(args[0]); + args.pop(); + console.log(args[1]); }; var z = function z(foo) { - for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bar[_key - 1] = arguments[_key]; - } + for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + bar[_key - 1] = arguments[_key]; + } - var x = function x() { - bar[1] = 5; - }; + var x = function x() { + bar[1] = 5; + }; }; var a = function a(foo) { - for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bar[_key - 1] = arguments[_key]; - } + for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + bar[_key - 1] = arguments[_key]; + } - return bar.join(","); + return bar.join(","); }; var b = function b(foo) { - for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bar[_key - 1] = arguments[_key]; - } + for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + bar[_key - 1] = arguments[_key]; + } - var join = "join"; - return bar[join]; + var join = "join"; + return bar[join]; }; -