From dada1374cf6b1cd03dd5fe3cffc2a9ae82895b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 19 Jun 2021 15:49:10 +0200 Subject: [PATCH 1/5] Fix `_step.value` acces in `for await` --- .../src/for-await.js | 17 ++++------ .../fixtures/for-await/async-arrow/output.js | 4 +-- .../async-function-no-transform/output.js | 4 +-- .../for-await/async-function/output.js | 4 +-- .../for-await/async-generator/output.js | 4 +-- .../for-await/destructuring/output.js | 4 +-- .../for-await/step-single-tick/exec.js | 31 +++++++++++++++++++ .../for-await/step-single-tick/options.json | 6 ++++ .../for-await/step-value-is-promise/exec.js | 22 +++++++++++++ .../step-value-is-promise/options.json | 6 ++++ .../step-value-not-accessed-when-done/exec.js | 18 +++++++++++ .../options.json | 6 ++++ .../test/fixtures/regression/5880/output.js | 7 ++--- 13 files changed, 108 insertions(+), 25 deletions(-) create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json diff --git a/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js b/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js index eff702a255b3..f9cb7e1e1151 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js +++ b/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js @@ -7,14 +7,10 @@ const buildForAwait = template(` var ITERATOR_ERROR_KEY; try { for ( - var ITERATOR_KEY = GET_ITERATOR(OBJECT), STEP_KEY, STEP_VALUE; - ( - STEP_KEY = await ITERATOR_KEY.next(), - ITERATOR_COMPLETION = STEP_KEY.done, - STEP_VALUE = await STEP_KEY.value, - !ITERATOR_COMPLETION - ); - ITERATOR_COMPLETION = true) { + var ITERATOR_KEY = GET_ITERATOR(OBJECT), STEP_KEY; + !(ITERATOR_COMPLETION = (STEP_KEY = await ITERATOR_KEY.next()).done); + ITERATOR_COMPLETION = true + ) { } } catch (err) { ITERATOR_HAD_ERROR_KEY = true; @@ -37,7 +33,7 @@ export default function (path, { getAsyncIterator }) { const { node, scope, parent } = path; const stepKey = scope.generateUidIdentifier("step"); - const stepValue = scope.generateUidIdentifier("value"); + const stepValue = t.memberExpression(stepKey, t.identifier("value")); const left = node.left; let declar; @@ -61,8 +57,7 @@ export default function (path, { getAsyncIterator }) { ITERATOR_KEY: scope.generateUidIdentifier("iterator"), GET_ITERATOR: getAsyncIterator, OBJECT: node.right, - STEP_VALUE: t.cloneNode(stepValue), - STEP_KEY: stepKey, + STEP_KEY: t.cloneNode(stepKey), }); // remove async function wrapper diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js index 1003e22ca6c3..76e74426a60a 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js @@ -6,8 +6,8 @@ babelHelpers.asyncToGenerator(function* () { var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step, _value; _step = yield _iterator.next(), _iteratorNormalCompletion = _step.done, _value = yield _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { - let x = _value; + for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = yield _iterator.next()).done); _iteratorNormalCompletion = true) { + let x = _step.value; f(x); } } catch (err) { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js index d7801fa31936..e92aec989915 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js @@ -5,8 +5,8 @@ async function foo() { var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step, _value; _step = await _iterator.next(), _iteratorNormalCompletion = _step.done, _value = await _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { - const x = _value; + for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = await _iterator.next()).done); _iteratorNormalCompletion = true) { + const x = _step.value; } } catch (err) { _didIteratorError = true; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js index 95eb83b6b2d8..15daa7a9040a 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js @@ -10,8 +10,8 @@ function _f() { var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step, _value; _step = yield _iterator.next(), _iteratorNormalCompletion = _step.done, _value = yield _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { - let x = _value; + for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = yield _iterator.next()).done); _iteratorNormalCompletion = true) { + let x = _step.value; g(x); } } catch (err) { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js index 1531571a1a47..076b8fae79bd 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js @@ -10,8 +10,8 @@ function _g() { var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step, _value; _step = yield babelHelpers.awaitAsyncGenerator(_iterator.next()), _iteratorNormalCompletion = _step.done, _value = yield babelHelpers.awaitAsyncGenerator(_step.value), !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { - let x = _value; + for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done); _iteratorNormalCompletion = true) { + let x = _step.value; f(x); } } catch (err) { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js index 74aeb607a425..e44677aa6da5 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js @@ -10,11 +10,11 @@ function _f() { var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(a), _step, _value; _step = yield _iterator.next(), _iteratorNormalCompletion = _step.done, _value = yield _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(a), _step; !(_iteratorNormalCompletion = (_step = yield _iterator.next()).done); _iteratorNormalCompletion = true) { let { x, y: [z] - } = _value; + } = _step.value; g(x, z); } } catch (err) { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js new file mode 100644 index 000000000000..444f052003be --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js @@ -0,0 +1,31 @@ +let resolve; +let promise = new Promise((r) => (resolve = r)); +let iterable = { + [Symbol.asyncIterator]() { + return { + next: () => promise, + }; + }, +}; + +let values = []; + +return Promise.all([ + async function () { + for await (let value of iterable) { + values.push(value); + } + }(), + async function () { + resolve({ value: 0, done: false }); + promise = new Promise((r) => (resolve = r)); + + await null; + resolve({ value: 1, done: false }); + promise = new Promise((r) => (resolve = r)); + + resolve({ value: undefined, done: true }); + }(), +]).then(() => { + expect(values).toEqual([0, 1]); +}); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json new file mode 100644 index 000000000000..15db91d1e301 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json @@ -0,0 +1,6 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + }, + "plugins": ["proposal-async-generator-functions"] +} diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js new file mode 100644 index 000000000000..2adc4531bb73 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js @@ -0,0 +1,22 @@ +let steps = [ + { done: false, value: Promise.resolve(1) }, + { done: true, value: undefined } +]; + +let iterable = { + [Symbol.asyncIterator]() { + return { + next: () => steps.shift(), + }; + }, +}; + +let values = []; + +return async function () { + let value; + for await (value of iterable); + + expect(value).toBeInstanceOf(Promise); + await expect(value).resolves.toBe(1); +}(); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json new file mode 100644 index 000000000000..15db91d1e301 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json @@ -0,0 +1,6 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + }, + "plugins": ["proposal-async-generator-functions"] +} diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js new file mode 100644 index 000000000000..65bd7569138b --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js @@ -0,0 +1,18 @@ +let gotValue = false; + +let iterable = { + [Symbol.asyncIterator]() { + return { + next: () => Promise.resolve({ + get value() { gotValue = true }, + done: true + }) + }; + }, +}; + +return async function () { + for await (let value of iterable) {} + + expect(gotValue).toBe(false); +}(); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json new file mode 100644 index 000000000000..15db91d1e301 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json @@ -0,0 +1,6 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + }, + "plugins": ["proposal-async-generator-functions"] +} diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js index 4b9e652d6cbc..7ff6de47b2a6 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js @@ -5,10 +5,9 @@ var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(iterable), _step, _value; _step = await _iterator.next(), _iteratorNormalCompletion = _step.done, _value = await _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { - const _value2 = _value, - _value3 = babelHelpers.slicedToArray(_value2, 1), - value = _value3[0]; + for (var _iterator = babelHelpers.asyncIterator(iterable), _step; !(_iteratorNormalCompletion = (_step = await _iterator.next()).done); _iteratorNormalCompletion = true) { + const _step$value = babelHelpers.slicedToArray(_step.value, 1), + value = _step$value[0]; } } catch (err) { _didIteratorError = true; From 78071a103cb539383887cca34172f8c890aa5b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 19 Jun 2021 15:54:22 +0200 Subject: [PATCH 2/5] Add test --- .../for-await/lhs-member-expression/exec.js | 6 +++++ .../for-await/lhs-member-expression/input.js | 3 +++ .../lhs-member-expression/options.json | 6 +++++ .../for-await/lhs-member-expression/output.js | 25 +++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/exec.js create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/input.js create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json create mode 100644 packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/exec.js new file mode 100644 index 000000000000..a53e9957acaf --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/exec.js @@ -0,0 +1,6 @@ +return async function () { + let obj = {}; + for await (obj.x of [1, 2]); + + expect(obj.x).toBe(2); +}(); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/input.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/input.js new file mode 100644 index 000000000000..5e1926be130a --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/input.js @@ -0,0 +1,3 @@ +(async function () { + for await (obj.x of y) {} +})(); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json new file mode 100644 index 000000000000..15db91d1e301 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json @@ -0,0 +1,6 @@ +{ + "parserOpts": { + "allowReturnOutsideFunction": true + }, + "plugins": ["proposal-async-generator-functions"] +} diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js new file mode 100644 index 000000000000..1bba85771390 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js @@ -0,0 +1,25 @@ +(async function () { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + + var _iteratorError; + + try { + for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = await _iterator.next()).done); _iteratorNormalCompletion = true) { + obj.x = _step.value; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return != null) { + await _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } +})(); From a2d27bc7f60aa1fd6a93a8183da45b51466fa0f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 19 Jun 2021 16:13:56 +0200 Subject: [PATCH 3/5] `iteratorNormalCompletion` -> `iteratorAbruptCompletion` Saves 3 bytes when minified, 1 when not minified. --- .../src/for-await.js | 12 ++++++------ .../test/fixtures/for-await/async-arrow/output.js | 6 +++--- .../for-await/async-function-no-transform/output.js | 6 +++--- .../test/fixtures/for-await/async-function/output.js | 6 +++--- .../fixtures/for-await/async-generator/output.js | 6 +++--- .../test/fixtures/for-await/destructuring/output.js | 6 +++--- .../for-await/lhs-member-expression/output.js | 6 +++--- .../test/fixtures/regression/5880/output.js | 6 +++--- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js b/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js index f9cb7e1e1151..16f08dca1524 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js +++ b/packages/babel-plugin-proposal-async-generator-functions/src/for-await.js @@ -2,14 +2,14 @@ import { types as t, template } from "@babel/core"; const buildForAwait = template(` async function wrapper() { - var ITERATOR_COMPLETION = true; + var ITERATOR_ABRUPT_COMPLETION = false; var ITERATOR_HAD_ERROR_KEY = false; var ITERATOR_ERROR_KEY; try { for ( var ITERATOR_KEY = GET_ITERATOR(OBJECT), STEP_KEY; - !(ITERATOR_COMPLETION = (STEP_KEY = await ITERATOR_KEY.next()).done); - ITERATOR_COMPLETION = true + ITERATOR_ABRUPT_COMPLETION = !(STEP_KEY = await ITERATOR_KEY.next()).done; + ITERATOR_ABRUPT_COMPLETION = false ) { } } catch (err) { @@ -17,7 +17,7 @@ const buildForAwait = template(` ITERATOR_ERROR_KEY = err; } finally { try { - if (!ITERATOR_COMPLETION && ITERATOR_KEY.return != null) { + if (ITERATOR_ABRUPT_COMPLETION && ITERATOR_KEY.return != null) { await ITERATOR_KEY.return(); } } finally { @@ -50,8 +50,8 @@ export default function (path, { getAsyncIterator }) { } let template = buildForAwait({ ITERATOR_HAD_ERROR_KEY: scope.generateUidIdentifier("didIteratorError"), - ITERATOR_COMPLETION: scope.generateUidIdentifier( - "iteratorNormalCompletion", + ITERATOR_ABRUPT_COMPLETION: scope.generateUidIdentifier( + "iteratorAbruptCompletion", ), ITERATOR_ERROR_KEY: scope.generateUidIdentifier("iteratorError"), ITERATOR_KEY: scope.generateUidIdentifier("iterator"), diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js index 76e74426a60a..802dd6d77316 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js @@ -1,12 +1,12 @@ /*#__PURE__*/ babelHelpers.asyncToGenerator(function* () { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = yield _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { let x = _step.value; f(x); } @@ -15,7 +15,7 @@ babelHelpers.asyncToGenerator(function* () { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { yield _iterator.return(); } } finally { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js index e92aec989915..1e1df44ed94a 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function-no-transform/output.js @@ -1,11 +1,11 @@ async function foo() { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = await _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { const x = _step.value; } } catch (err) { @@ -13,7 +13,7 @@ async function foo() { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { await _iterator.return(); } } finally { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js index 15daa7a9040a..fdeebc16c34f 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js @@ -4,13 +4,13 @@ function f() { function _f() { _f = babelHelpers.asyncToGenerator(function* () { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = yield _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { let x = _step.value; g(x); } @@ -19,7 +19,7 @@ function _f() { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { yield _iterator.return(); } } finally { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js index 076b8fae79bd..1dc0aba51463 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js @@ -4,13 +4,13 @@ function g() { function _g() { _g = babelHelpers.wrapAsyncGenerator(function* () { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _iteratorAbruptCompletion = false) { let x = _step.value; f(x); } @@ -19,7 +19,7 @@ function _g() { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { yield babelHelpers.awaitAsyncGenerator(_iterator.return()); } } finally { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js index e44677aa6da5..4e599cf8bbb7 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js @@ -4,13 +4,13 @@ function f() { function _f() { _f = babelHelpers.asyncToGenerator(function* () { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(a), _step; !(_iteratorNormalCompletion = (_step = yield _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(a), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { let { x, y: [z] @@ -22,7 +22,7 @@ function _f() { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { yield _iterator.return(); } } finally { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js index 1bba85771390..792882550bc9 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js @@ -1,11 +1,11 @@ (async function () { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; !(_iteratorNormalCompletion = (_step = await _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { obj.x = _step.value; } } catch (err) { @@ -13,7 +13,7 @@ _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { await _iterator.return(); } } finally { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js index 7ff6de47b2a6..dca5c85a89a8 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/regression/5880/output.js @@ -1,11 +1,11 @@ (async () => { - var _iteratorNormalCompletion = true; + var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(iterable), _step; !(_iteratorNormalCompletion = (_step = await _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = babelHelpers.asyncIterator(iterable), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { const _step$value = babelHelpers.slicedToArray(_step.value, 1), value = _step$value[0]; } @@ -14,7 +14,7 @@ _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { + if (_iteratorAbruptCompletion && _iterator.return != null) { await _iterator.return(); } } finally { From d452c97a2bf3fc91e29be6acb58a61722385b400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 19 Jun 2021 16:24:16 +0200 Subject: [PATCH 4/5] Compile to generators --- .../fixtures/for-await/lhs-member-expression/options.json | 3 +-- .../test/fixtures/for-await/lhs-member-expression/output.js | 6 +++--- .../test/fixtures/for-await/step-single-tick/options.json | 3 +-- .../fixtures/for-await/step-value-is-promise/options.json | 3 +-- .../step-value-not-accessed-when-done/options.json | 3 +-- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json index 15db91d1e301..eeebc1a57738 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/options.json @@ -1,6 +1,5 @@ { "parserOpts": { "allowReturnOutsideFunction": true - }, - "plugins": ["proposal-async-generator-functions"] + } } diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js index 792882550bc9..e3db99173493 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/lhs-member-expression/output.js @@ -1,11 +1,11 @@ -(async function () { +babelHelpers.asyncToGenerator(function* () { var _iteratorAbruptCompletion = false; var _didIteratorError = false; var _iteratorError; try { - for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { + for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { obj.x = _step.value; } } catch (err) { @@ -14,7 +14,7 @@ } finally { try { if (_iteratorAbruptCompletion && _iterator.return != null) { - await _iterator.return(); + yield _iterator.return(); } } finally { if (_didIteratorError) { diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json index 15db91d1e301..eeebc1a57738 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/options.json @@ -1,6 +1,5 @@ { "parserOpts": { "allowReturnOutsideFunction": true - }, - "plugins": ["proposal-async-generator-functions"] + } } diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json index 15db91d1e301..eeebc1a57738 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/options.json @@ -1,6 +1,5 @@ { "parserOpts": { "allowReturnOutsideFunction": true - }, - "plugins": ["proposal-async-generator-functions"] + } } diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json index 15db91d1e301..eeebc1a57738 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/options.json @@ -1,6 +1,5 @@ { "parserOpts": { "allowReturnOutsideFunction": true - }, - "plugins": ["proposal-async-generator-functions"] + } } From 0927c7e61f5278cc1ce0fde11a61969ac5a76722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 21 Jun 2021 14:21:44 +0200 Subject: [PATCH 5/5] Fix tests in older engines --- .../test/fixtures/for-await/step-single-tick/exec.js | 2 +- .../test/fixtures/for-await/step-value-is-promise/exec.js | 2 +- .../for-await/step-value-not-accessed-when-done/exec.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js index 444f052003be..16236197b357 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-single-tick/exec.js @@ -1,7 +1,7 @@ let resolve; let promise = new Promise((r) => (resolve = r)); let iterable = { - [Symbol.asyncIterator]() { + [Symbol.asyncIterator || "@@asyncIterator"]() { return { next: () => promise, }; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js index 2adc4531bb73..f79aeda27771 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-is-promise/exec.js @@ -4,7 +4,7 @@ let steps = [ ]; let iterable = { - [Symbol.asyncIterator]() { + [Symbol.asyncIterator || "@@asyncIterator"]() { return { next: () => steps.shift(), }; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js index 65bd7569138b..8c7c36d8e9a3 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/step-value-not-accessed-when-done/exec.js @@ -1,7 +1,7 @@ let gotValue = false; let iterable = { - [Symbol.asyncIterator]() { + [Symbol.asyncIterator || "@@asyncIterator"]() { return { next: () => Promise.resolve({ get value() { gotValue = true },