Requeue generators for re-traversal so we pick up regeneratorRuntime - fixes T6676

This commit is contained in:
Logan Smyth 2015-12-13 16:15:02 -08:00
parent 9c88b8797e
commit ee6f470d77
3 changed files with 18 additions and 11 deletions

View File

@ -129,6 +129,11 @@ exports.visitor = {
if (wasGeneratorFunction && t.isExpression(node)) { if (wasGeneratorFunction && t.isExpression(node)) {
path.replaceWith(t.callExpression(util.runtimeProperty("mark"), [node])); path.replaceWith(t.callExpression(util.runtimeProperty("mark"), [node]));
} }
// Generators are processed in 'exit' handlers so that regenerator only has to run on
// an ES5 AST, but that means traversal will not pick up newly inserted references
// to things like 'regeneratorRuntime'. To avoid this, we explicitly re-queue.
path.requeue();
} }
} }
}; };

View File

@ -10,18 +10,20 @@ var _marked = [_callee].map(regeneratorRuntime.mark);
function _callee() { function _callee() {
var x; var x;
return regeneratorRuntime.wrap(function _callee$(_context) { return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) { while (1) {
case 0: switch (_context.prev = _context.next) {
_context.next = 2; case 0:
return 5; _context.next = 2;
return 5;
case 2: case 2:
x = _context.sent; x = _context.sent;
return _context.abrupt("return", 5); return _context.abrupt("return", 5);
case 4: case 4:
case "end": case "end":
return _context.stop(); return _context.stop();
}
} }
}, _marked[0], this); }, _marked[0], this);
} }

View File

@ -7,7 +7,7 @@ import foo, * as bar from "someModule";
export const myWord = _Symbol("abc"); export const myWord = _Symbol("abc");
export function giveWord() { export function giveWord() {
return regeneratorRuntime.wrap(function giveWord$(_context) { return _regeneratorRuntime.wrap(function giveWord$(_context) {
while (1) switch (_context.prev = _context.next) { while (1) switch (_context.prev = _context.next) {
case 0: case 0:
_context.next = 2; _context.next = 2;