diff --git a/packages/babel-plugin-transform-async-generator-functions/src/for-await.ts b/packages/babel-plugin-transform-async-generator-functions/src/for-await.ts index fce810c5e9bc..f3825e4069bb 100644 --- a/packages/babel-plugin-transform-async-generator-functions/src/for-await.ts +++ b/packages/babel-plugin-transform-async-generator-functions/src/for-await.ts @@ -1,31 +1,21 @@ import { types as t, template } from "@babel/core"; import type { NodePath } from "@babel/traverse"; -const buildForAwait = template(` - async function wrapper() { - var ITERATOR_ABRUPT_COMPLETION = false; - var ITERATOR_HAD_ERROR_KEY = false; - var ITERATOR_ERROR_KEY; +const buildForAwait = template.statements(` + var ITERATOR_KEY = GET_ITERATOR(OBJECT), STEP_KEY, NOT_DONE_KEY; + try { + for (;NOT_DONE_KEY = !(STEP_KEY = await ITERATOR_KEY.next()).done;NOT_DONE_KEY = false) { + } + } catch(e) { + STEP_KEY = null; + throw e; + } finally { try { - for ( - var ITERATOR_KEY = GET_ITERATOR(OBJECT), STEP_KEY; - ITERATOR_ABRUPT_COMPLETION = !(STEP_KEY = await ITERATOR_KEY.next()).done; - ITERATOR_ABRUPT_COMPLETION = false - ) { - } - } catch (err) { - ITERATOR_HAD_ERROR_KEY = true; - ITERATOR_ERROR_KEY = err; - } finally { - try { - if (ITERATOR_ABRUPT_COMPLETION && ITERATOR_KEY.return != null) { - await ITERATOR_KEY.return(); - } - } finally { - if (ITERATOR_HAD_ERROR_KEY) { - throw ITERATOR_ERROR_KEY; - } + if (NOT_DONE_KEY && ITERATOR_KEY.return) { + await ITERATOR_KEY.return(); } + } catch (e) { + if (STEP_KEY) throw e; } } `); @@ -52,24 +42,16 @@ export default function ( t.variableDeclarator(left.declarations[0].id, stepValue), ]); } - let template = buildForAwait({ - ITERATOR_HAD_ERROR_KEY: scope.generateUidIdentifier("didIteratorError"), - ITERATOR_ABRUPT_COMPLETION: scope.generateUidIdentifier( - "iteratorAbruptCompletion", - ), - ITERATOR_ERROR_KEY: scope.generateUidIdentifier("iteratorError"), + const template = buildForAwait({ ITERATOR_KEY: scope.generateUidIdentifier("iterator"), + NOT_DONE_KEY: scope.generateUidIdentifier("notDone"), GET_ITERATOR: getAsyncIterator, OBJECT: node.right, STEP_KEY: t.cloneNode(stepKey), }); - // remove async function wrapper - // @ts-expect-error todo(flow->ts) improve type annotation for buildForAwait - template = template.body.body as t.Statement[]; - const isLabeledParent = t.isLabeledStatement(parent); - const tryBody = (template[3] as t.TryStatement).block.body; + const tryBody = (template[1] as t.TryStatement).block.body; const loop = tryBody[0] as t.ForStatement; if (isLabeledParent) { diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-arrow/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-arrow/output.js index 24f49ced2b8e..9cb559f6c882 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-arrow/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-arrow/output.js @@ -1,26 +1,24 @@ /*#__PURE__*/babelHelpers.asyncToGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(y), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { let x = _step.value; { f(x); } } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } }); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js index e997ab2a48b2..8be804d9b732 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js @@ -1,23 +1,21 @@ async function foo() { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(y), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = await _iterator.next()).done; _notDone = false) { const x = _step.value; } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { await _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } } diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function/output.js index cbbca5182980..01d06dec145e 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-function/output.js @@ -1,28 +1,26 @@ var _f; function f() { return (_f = _f || babelHelpers.asyncToGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(y), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { let x = _step.value; { g(x); } } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } })).apply(this, arguments); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-generator/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-generator/output.js index 5f69e14b0316..e5720b14ab88 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-generator/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/async-generator/output.js @@ -1,28 +1,26 @@ var _g; function g() { return (_g = _g || babelHelpers.wrapAsyncGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(y), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _notDone = false) { let x = _step.value; { f(x); } } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield babelHelpers.awaitAsyncGenerator(_iterator.return()); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } })).apply(this, arguments); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js index 5108e6e54295..10eef3148001 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js @@ -1,11 +1,11 @@ var _fn; function fn() { return (_fn = _fn || babelHelpers.wrapAsyncGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator([Promise.resolve("ok")]), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator([Promise.resolve("ok")]), _step; _iteratorAbruptCompletion = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _notDone = false) { const result = _step.value; { return { @@ -13,18 +13,16 @@ function fn() { }; } } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield babelHelpers.awaitAsyncGenerator(_iterator.return()); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } })).apply(this, arguments); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/destructuring/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/destructuring/output.js index 2007c18dc6cc..265850da771a 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/destructuring/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/destructuring/output.js @@ -1,11 +1,11 @@ var _f; function f() { return (_f = _f || babelHelpers.asyncToGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(a), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(a), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { let { x, y: [z] @@ -14,18 +14,16 @@ function f() { g(x, z); } } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } })).apply(this, arguments); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js index a3c282471216..4afae9be3e54 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js @@ -1,23 +1,21 @@ babelHelpers.asyncToGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(y), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { obj.x = _step.value; } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } })(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js index f5368c0de258..535e9dc2a936 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js @@ -1,26 +1,24 @@ /*#__PURE__*/babelHelpers.asyncToGenerator(function* () { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator([]), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator([]), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { let x = _step.value; { let x; } } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { yield _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } }); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/exec.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/exec.js new file mode 100644 index 000000000000..4e1853cce2af --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/exec.js @@ -0,0 +1,26 @@ +let throwCalled = false; + +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => ({ done: false, value: 1 }), + return: () => { + throwCalled = true; + throw "return" + } + }; + }, +}; + +return async function () { + let err; + try { + for await (const value of iterable) { + throw "error" + } + } catch (e) { + err = e; + } + expect(err).toBe("error"); + expect(throwCalled).toBe(true); +}(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/input.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/input.js new file mode 100644 index 000000000000..4e1853cce2af --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/input.js @@ -0,0 +1,26 @@ +let throwCalled = false; + +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => ({ done: false, value: 1 }), + return: () => { + throwCalled = true; + throw "return" + } + }; + }, +}; + +return async function () { + let err; + try { + for await (const value of iterable) { + throw "error" + } + } catch (e) { + err = e; + } + expect(err).toBe("error"); + expect(throwCalled).toBe(true); +}(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/options.json b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/options.json new file mode 100644 index 000000000000..eeebc1a57738 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/options.json @@ -0,0 +1,5 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/output.js new file mode 100644 index 000000000000..4dcf11e10a74 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw/output.js @@ -0,0 +1,46 @@ +let throwCalled = false; +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => ({ + done: false, + value: 1 + }), + return: () => { + throwCalled = true; + throw "return"; + } + }; + } +}; +return babelHelpers.asyncToGenerator(function* () { + let err; + try { + var _iterator = babelHelpers.asyncIterator(iterable), + _step, + _notDone; + try { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { + const value = _step.value; + { + throw "error"; + } + } + } catch (e) { + _step = null; + throw e; + } finally { + try { + if (_notDone && _iterator.return) { + yield _iterator.return(); + } + } catch (e) { + if (_step) throw e; + } + } + } catch (e) { + err = e; + } + expect(err).toBe("error"); + expect(throwCalled).toBe(true); +})(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/exec.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/exec.js new file mode 100644 index 000000000000..85c4a650dd02 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/exec.js @@ -0,0 +1,26 @@ +let throwCalled = false; + +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => { + throw "next" + }, + return: () => { + throwCalled = true; + throw "return" + } + }; + }, +}; + +return async function () { + let err; + try { + for await (const value of iterable); + } catch (e) { + err = e; + } + expect(err).toBe("next"); + expect(throwCalled).toBe(false); +}(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/input.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/input.js new file mode 100644 index 000000000000..85c4a650dd02 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/input.js @@ -0,0 +1,26 @@ +let throwCalled = false; + +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => { + throw "next" + }, + return: () => { + throwCalled = true; + throw "return" + } + }; + }, +}; + +return async function () { + let err; + try { + for await (const value of iterable); + } catch (e) { + err = e; + } + expect(err).toBe("next"); + expect(throwCalled).toBe(false); +}(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/options.json b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/options.json new file mode 100644 index 000000000000..eeebc1a57738 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/options.json @@ -0,0 +1,5 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/output.js new file mode 100644 index 000000000000..0310af3ba663 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw2/output.js @@ -0,0 +1,45 @@ +let throwCalled = false; +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => { + throw "next"; + }, + return: () => { + throwCalled = true; + throw "return"; + } + }; + } +}; +return babelHelpers.asyncToGenerator(function* () { + let err; + try { + var _iterator = babelHelpers.asyncIterator(iterable), + _step, + _notDone; + try { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { + const value = _step.value; + { + ; + } + } + } catch (e) { + _step = null; + throw e; + } finally { + try { + if (_notDone && _iterator.return) { + yield _iterator.return(); + } + } catch (e) { + if (_step) throw e; + } + } + } catch (e) { + err = e; + } + expect(err).toBe("next"); + expect(throwCalled).toBe(false); +})(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/exec.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/exec.js new file mode 100644 index 000000000000..536e1a04fd7f --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/exec.js @@ -0,0 +1,29 @@ +let throwCalled = false; +let i; +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => { + i++; + if(i) return { done: false, value: 1 }; + + throw "next" + }, + return: () => { + throwCalled = true; + throw "return" + } + }; + }, +}; + +return async function () { + let err; + try { + for await (const value of iterable); + } catch (e) { + err = e; + } + expect(err).toBe("next"); + expect(throwCalled).toBe(false); +}(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/input.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/input.js new file mode 100644 index 000000000000..536e1a04fd7f --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/input.js @@ -0,0 +1,29 @@ +let throwCalled = false; +let i; +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => { + i++; + if(i) return { done: false, value: 1 }; + + throw "next" + }, + return: () => { + throwCalled = true; + throw "return" + } + }; + }, +}; + +return async function () { + let err; + try { + for await (const value of iterable); + } catch (e) { + err = e; + } + expect(err).toBe("next"); + expect(throwCalled).toBe(false); +}(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/options.json b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/options.json new file mode 100644 index 000000000000..eeebc1a57738 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/options.json @@ -0,0 +1,5 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/output.js new file mode 100644 index 000000000000..cfc92c193935 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw3/output.js @@ -0,0 +1,51 @@ +let throwCalled = false; +let i; +let iterable = { + [Symbol.asyncIterator || "@@asyncIterator"]() { + return { + next: () => { + i++; + if (i) return { + done: false, + value: 1 + }; + throw "next"; + }, + return: () => { + throwCalled = true; + throw "return"; + } + }; + } +}; +return babelHelpers.asyncToGenerator(function* () { + let err; + try { + var _iterator = babelHelpers.asyncIterator(iterable), + _step, + _notDone; + try { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { + const value = _step.value; + { + ; + } + } + } catch (e) { + _step = null; + throw e; + } finally { + try { + if (_notDone && _iterator.return) { + yield _iterator.return(); + } + } catch (e) { + if (_step) throw e; + } + } + } catch (e) { + err = e; + } + expect(err).toBe("next"); + expect(throwCalled).toBe(false); +})(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/exec.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/exec.js new file mode 100644 index 000000000000..c7d94c3ec81d --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/exec.js @@ -0,0 +1,18 @@ +function* gen() { + try { + yield 1; + } finally { + throw 2; + } +} + +return async function () { + let err; + try { + for await (const _ of gen()) break; + } catch (e) { + err = e; + } + + expect(err).toBe(2); +}() diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/input.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/input.js new file mode 100644 index 000000000000..c7d94c3ec81d --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/input.js @@ -0,0 +1,18 @@ +function* gen() { + try { + yield 1; + } finally { + throw 2; + } +} + +return async function () { + let err; + try { + for await (const _ of gen()) break; + } catch (e) { + err = e; + } + + expect(err).toBe(2); +}() diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/options.json b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/options.json new file mode 100644 index 000000000000..eeebc1a57738 --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/options.json @@ -0,0 +1,5 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/output.js new file mode 100644 index 000000000000..0e5675511fdb --- /dev/null +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/for-await/throw4/output.js @@ -0,0 +1,37 @@ +function* gen() { + try { + yield 1; + } finally { + throw 2; + } +} +return babelHelpers.asyncToGenerator(function* () { + let err; + try { + var _iterator = babelHelpers.asyncIterator(gen()), + _step, + _notDone; + try { + for (; _notDone = !(_step = yield _iterator.next()).done; _notDone = false) { + const _ = _step.value; + { + break; + } + } + } catch (e) { + _step = null; + throw e; + } finally { + try { + if (_notDone && _iterator.return) { + yield _iterator.return(); + } + } catch (e) { + if (_step) throw e; + } + } + } catch (e) { + err = e; + } + expect(err).toBe(2); +})(); diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/13801/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/13801/output.js index a275abdc806c..172bfe2d578a 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/13801/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/13801/output.js @@ -7,63 +7,63 @@ function main() { while (1) switch (_context2.prev = _context2.next) { case 0: () => { - var _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, string; + var _iterator, _step, _notDone, string; return _regeneratorRuntime().async(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: // IIFE: required for babel to crash - _iteratorAbruptCompletion = false; - _didIteratorError = false; - _context.prev = 2; _iterator = _asyncIterator(async_iterable); - case 4: - _context.next = 6; + _context.prev = 1; + case 2: + _context.next = 4; return _regeneratorRuntime().awrap(_iterator.next()); - case 6: - if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) { - _context.next = 12; + case 4: + if (!(_notDone = !(_step = _context.sent).done)) { + _context.next = 10; break; } string = _step.value; // for await: required for babel to crash console.log(string); - case 9: - _iteratorAbruptCompletion = false; - _context.next = 4; + case 7: + _notDone = false; + _context.next = 2; break; - case 12: - _context.next = 18; + case 10: + _context.next = 16; break; - case 14: - _context.prev = 14; - _context.t0 = _context["catch"](2); - _didIteratorError = true; - _iteratorError = _context.t0; - case 18: - _context.prev = 18; - _context.prev = 19; - if (!(_iteratorAbruptCompletion && _iterator.return != null)) { - _context.next = 23; + case 12: + _context.prev = 12; + _context.t0 = _context["catch"](1); + _step = null; + throw _context.t0; + case 16: + _context.prev = 16; + _context.prev = 17; + if (!(_notDone && _iterator.return)) { + _context.next = 21; break; } - _context.next = 23; + _context.next = 21; return _regeneratorRuntime().awrap(_iterator.return()); + case 21: + _context.next = 27; + break; case 23: _context.prev = 23; - if (!_didIteratorError) { - _context.next = 26; + _context.t1 = _context["catch"](17); + if (!_step) { + _context.next = 27; break; } - throw _iteratorError; - case 26: - return _context.finish(23); + throw _context.t1; case 27: - return _context.finish(18); + return _context.finish(16); case 28: case "end": return _context.stop(); } - }, null, null, [[2, 14, 18, 28], [19,, 23, 27]], Promise); + }, null, null, [[1, 12, 16, 28], [17, 23]], Promise); }; one = 1; // array destructuring: required for babel to crash case 2: diff --git a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/5880/output.js b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/5880/output.js index fad58fbc5ea1..43f5698e386d 100644 --- a/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/5880/output.js +++ b/packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/5880/output.js @@ -1,24 +1,22 @@ (async () => { - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator(iterable), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator(iterable), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = await _iterator.next()).done; _notDone = false) { const _step$value = babelHelpers.slicedToArray(_step.value, 1), value = _step$value[0]; } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { await _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } })(); diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js index fa168b0e1b32..f06286833134 100644 --- a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js @@ -1,24 +1,22 @@ async function v() { let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2; - var _iteratorAbruptCompletion = false; - var _didIteratorError = false; - var _iteratorError; + var _iterator = babelHelpers.asyncIterator([1]), + _step, + _notDone; try { - for (var _iterator = babelHelpers.asyncIterator([1]), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (; _notDone = !(_step = await _iterator.next()).done; _notDone = false) { source = _step.value; } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; + } catch (e) { + _step = null; + throw e; } finally { try { - if (_iteratorAbruptCompletion && _iterator.return != null) { + if (_notDone && _iterator.return) { await _iterator.return(); } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } + } catch (e) { + if (_step) throw e; } } }