From 57d2323ae91d3bc3887acefd7ce74e34f8784743 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 28 Jul 2015 01:19:59 +0100 Subject: [PATCH] deopt on binding identifiers with same rest name - fixes #2091 --- .../transformers/es6/parameters/rest.js | 12 ++++++++++++ .../rest-binding-deoptimisation/actal.js | 1 + .../rest-binding-deoptimisation/expected.js | 9 +++++++++ 3 files changed, 22 insertions(+) create mode 100644 packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actal.js create mode 100644 packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js diff --git a/packages/babel/src/transformation/transformers/es6/parameters/rest.js b/packages/babel/src/transformation/transformers/es6/parameters/rest.js index 963e070d17..5388a37a8e 100644 --- a/packages/babel/src/transformation/transformers/es6/parameters/rest.js +++ b/packages/babel/src/transformation/transformers/es6/parameters/rest.js @@ -78,6 +78,18 @@ var memberExpressionOptimisationVisitor = { state.references.push(this); } + }, + + /** + * Deopt on use of a binding identifier with the same name as our rest param. + * + * See https://github.com/babel/babel/issues/2091 + */ + + BindingIdentifier(node, parent, scope, state) { + if (node.name === state.name) { + state.deopted = true; + } } }; diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actal.js b/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actal.js new file mode 100644 index 0000000000..43adbba736 --- /dev/null +++ b/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actal.js @@ -0,0 +1 @@ +const deepAssign = (...args) => args = []; diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js b/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js new file mode 100644 index 0000000000..b5288257f7 --- /dev/null +++ b/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js @@ -0,0 +1,9 @@ +"use strict"; + +var deepAssign = function deepAssign() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return args = []; +};