From b1c50b01f2ec2453c7cc8aa9ef63b3c7f212033d Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Sat, 12 Mar 2016 12:28:22 -0800 Subject: [PATCH] Ensure that we push and pop evenly so things don't fail to queue - fixes T7199 --- .../test/fixtures/regression/T7199/actual.js | 2 ++ .../test/fixtures/regression/T7199/expected.js | 15 +++++++++++++++ .../test/fixtures/regression/T7199/options.json | 8 ++++++++ packages/babel-traverse/src/context.js | 8 +++++++- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/options.json diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/actual.js new file mode 100644 index 0000000000..8688ce9a54 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/actual.js @@ -0,0 +1,2 @@ +import foo from 'foo'; +const [x] = bar; diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js new file mode 100644 index 0000000000..04d5367ebd --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js @@ -0,0 +1,15 @@ +'use strict'; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _foo = require('foo'); + +var _foo2 = _interopRequireDefault(_foo); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _bar = bar; + +var _bar2 = _slicedToArray(_bar, 1); + +const x = _bar2[0]; diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/options.json b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/options.json new file mode 100644 index 0000000000..bfd4950ba4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "transform-es2015-destructuring", + "transform-es2015-modules-commonjs", + "transform-es3-member-expression-literals", + "transform-es3-property-literals" + ] +} diff --git a/packages/babel-traverse/src/context.js b/packages/babel-traverse/src/context.js index edad4ea598..b8ffaf0e20 100644 --- a/packages/babel-traverse/src/context.js +++ b/packages/babel-traverse/src/context.js @@ -103,7 +103,13 @@ export default class TraversalContext { // visit the queue for (let path of queue) { path.resync(); - path.pushContext(this); + + if (path.contexts.length === 0 || path.contexts[path.contexts.length - 1] !== this){ + // The context might already have been pushed when this path was inserted and queued. + // If we always re-pushed here, we could get duplicates and risk leaving contexts + // on the stack after the traversal has completed, which could break things. + path.pushContext(this); + } // this path no longer belongs to the tree if (path.key === null) continue;