From 957118fb41367ba42e69446968641b7c7dba51ad Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 1 Mar 2015 10:04:16 +1100 Subject: [PATCH] delay rest optimisation, deopt on unoptimisable references - fixes #918 --- .../transformers/es6/parameters.rest.js | 19 +++++++++++++------ .../es6-parameters.rest/deopt/expected.js | 4 ++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/babel/transformation/transformers/es6/parameters.rest.js b/src/babel/transformation/transformers/es6/parameters.rest.js index ab4de1b324..9217cad5b5 100644 --- a/src/babel/transformation/transformers/es6/parameters.rest.js +++ b/src/babel/transformation/transformers/es6/parameters.rest.js @@ -28,13 +28,14 @@ var memberExpressionOptimisationVisitor = { // optimise it var prop = parent.property; if (isNumber(prop.value) || t.isUnaryExpression(prop) || t.isBinaryExpression(prop)) { - optimizeMemberExpression(node, parent, state.method.params.length); - state.hasShorthand = true; + state.candidates.push(this); + state.canOptimise = true; return; } } - state.longForm = true; + state.canOptimise = false; + this.stop(); } }; @@ -82,8 +83,8 @@ exports.Function = function (node, parent, scope) { var state = { outerBinding: scope.getBindingIdentifier(rest.name), - hasShorthand: true, - longForm: false, + canOptimise: false, + candidates: [], method: node, name: rest.name, }; @@ -91,7 +92,13 @@ exports.Function = function (node, parent, scope) { scope.traverse(node, memberExpressionOptimisationVisitor, state); // we only have shorthands and there's no other references - if (!state.longForm && state.hasShorthand) return; + if (state.canOptimise) { + for (var i = 0; i < state.candidates.length; i++) { + var candidate = state.candidates[i]; + optimizeMemberExpression(candidate.node, candidate.parent, node.params.length); + } + return; + } // diff --git a/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js b/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js index 389762d336..07e408cfb0 100644 --- a/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js +++ b/test/fixtures/transformation/es6-parameters.rest/deopt/expected.js @@ -9,6 +9,10 @@ var x = function x(foo) { }; 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]; + } + var x = function z(bar) { bar[1] = 5; };