From e677e49638eb1c13541ad0bbae822ad94a3a1faa Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 14 Jul 2015 22:18:30 +0100 Subject: [PATCH] really fix spread inside the RHS of a destructuring assignment causing invalid unpack optimisation --- .../transformation/transformers/es6/destructuring.js | 12 ++++++------ .../array-unpack-optimisation/actual.js | 2 +- .../array-unpack-optimisation/expected.js | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/babel/src/transformation/transformers/es6/destructuring.js b/packages/babel/src/transformation/transformers/es6/destructuring.js index 104a858e47..ba63140af9 100644 --- a/packages/babel/src/transformation/transformers/es6/destructuring.js +++ b/packages/babel/src/transformation/transformers/es6/destructuring.js @@ -491,17 +491,17 @@ class DestructuringTransformer { if (pattern.elements.length > arr.elements.length) return; if (pattern.elements.length < arr.elements.length && !hasRest(pattern)) return false; - for (var i = 0; i < pattern.elements.length; i++) { - var elem = pattern.elements[i]; - + for (let elem of (pattern.elements: Array)) { // deopt on holes if (!elem) return false; + // deopt on member expressions as they may be included in the RHS + if (t.isMemberExpression(elem)) return false; + } + + for (let elem of (arr.elements: Array)) { // deopt on spread elements if (t.isSpreadElement(elem)) return false; - - // deopt on member expressions - if (t.isMemberExpression(elem)) return false; } // deopt on reference to left side identifiers diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js b/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js index e4268d8574..6617aa5797 100644 --- a/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js +++ b/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js @@ -9,4 +9,4 @@ var [a, b] = [1, 2, 3]; var [[a, b]] = [[1, 2, 3]]; var [a, b] = [a, b]; [a[0], a[1]] = [a[1], a[0]]; -var [a, b, c] = [...foo, bar]; +var [a, b] = [...foo, bar]; diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js b/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js index eb655e4a1e..50626ce5a3 100644 --- a/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js +++ b/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js @@ -30,4 +30,3 @@ var _ref5 = [].concat(babelHelpers.toConsumableArray(foo), [bar]); var a = _ref5[0]; var b = _ref5[1]; -var c = _ref5[2];