From dccee6c9a73837d020c9313d65af95313a8206a2 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Wed, 6 Jul 2022 08:45:07 +0700 Subject: [PATCH 01/26] wrap `%AsyncFromSyncIteratorPrototype%` https://github.com/tc39/proposal-iterator-helpers/pull/182 --- packages/core-js/modules/esnext.async-iterator.from.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-js/modules/esnext.async-iterator.from.js b/packages/core-js/modules/esnext.async-iterator.from.js index 354922f64e4f..c3e63e6e154c 100644 --- a/packages/core-js/modules/esnext.async-iterator.from.js +++ b/packages/core-js/modules/esnext.async-iterator.from.js @@ -31,7 +31,7 @@ $({ target: 'AsyncIterator', stat: true, forced: true }, { } if (iterator === undefined) { usingIterator = getIteratorMethod(object); - if (usingIterator) return new AsyncFromSyncIterator(getIterator(object, usingIterator)); + if (usingIterator) iterator = new AsyncFromSyncIterator(getIterator(object, usingIterator)); } return new AsyncIteratorProxy(getIteratorDirect(iterator !== undefined ? iterator : object)); } From e26a689237e8be151cbe6c2e18b9beecf3bbcd51 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Wed, 6 Jul 2022 09:06:33 +0700 Subject: [PATCH 02/26] `RangeError` on `NaN` in `.drop` and `.take` https://github.com/tc39/proposal-iterator-helpers/pull/181 --- packages/core-js/internals/not-a-nan.js | 7 +++++++ packages/core-js/modules/esnext.async-iterator.drop.js | 3 ++- packages/core-js/modules/esnext.async-iterator.take.js | 3 ++- packages/core-js/modules/esnext.iterator.drop.js | 3 ++- packages/core-js/modules/esnext.iterator.take.js | 3 ++- tests/pure/esnext.async-iterator.drop.js | 3 ++- tests/pure/esnext.async-iterator.take.js | 3 ++- tests/pure/esnext.iterator.drop.js | 1 + tests/pure/esnext.iterator.take.js | 1 + tests/tests/esnext.async-iterator.drop.js | 3 ++- tests/tests/esnext.async-iterator.take.js | 3 ++- tests/tests/esnext.iterator.drop.js | 1 + tests/tests/esnext.iterator.take.js | 1 + 13 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 packages/core-js/internals/not-a-nan.js diff --git a/packages/core-js/internals/not-a-nan.js b/packages/core-js/internals/not-a-nan.js new file mode 100644 index 000000000000..cfb63bba3c4d --- /dev/null +++ b/packages/core-js/internals/not-a-nan.js @@ -0,0 +1,7 @@ +var $RangeError = RangeError; + +module.exports = function (it) { + // eslint-disable-next-line no-self-compare -- NaN check + if (it === it) return it; + throw $RangeError('NaN is not allowed'); +}; diff --git a/packages/core-js/modules/esnext.async-iterator.drop.js b/packages/core-js/modules/esnext.async-iterator.drop.js index be40c4c2da31..4e396937549a 100644 --- a/packages/core-js/modules/esnext.async-iterator.drop.js +++ b/packages/core-js/modules/esnext.async-iterator.drop.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var apply = require('../internals/function-apply'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); @@ -36,7 +37,7 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { drop: function drop(limit) { return new AsyncIteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/packages/core-js/modules/esnext.async-iterator.take.js b/packages/core-js/modules/esnext.async-iterator.take.js index 2f62c212845f..1649e96f2907 100644 --- a/packages/core-js/modules/esnext.async-iterator.take.js +++ b/packages/core-js/modules/esnext.async-iterator.take.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var apply = require('../internals/function-apply'); var call = require('../internals/function-call'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); @@ -26,7 +27,7 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { take: function take(limit) { return new AsyncIteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/packages/core-js/modules/esnext.iterator.drop.js b/packages/core-js/modules/esnext.iterator.drop.js index 888110bcdd99..b24e17ed7ac5 100644 --- a/packages/core-js/modules/esnext.iterator.drop.js +++ b/packages/core-js/modules/esnext.iterator.drop.js @@ -5,6 +5,7 @@ var apply = require('../internals/function-apply'); var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createIteratorProxy = require('../internals/iterator-create-proxy'); @@ -26,7 +27,7 @@ var IteratorProxy = createIteratorProxy(function (args) { $({ target: 'Iterator', proto: true, real: true, forced: true }, { drop: function drop(limit) { return new IteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/packages/core-js/modules/esnext.iterator.take.js b/packages/core-js/modules/esnext.iterator.take.js index 5ae6cda60c91..15001836a020 100644 --- a/packages/core-js/modules/esnext.iterator.take.js +++ b/packages/core-js/modules/esnext.iterator.take.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var apply = require('../internals/function-apply'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createIteratorProxy = require('../internals/iterator-create-proxy'); var iteratorClose = require('../internals/iterator-close'); @@ -22,7 +23,7 @@ var IteratorProxy = createIteratorProxy(function (args) { $({ target: 'Iterator', proto: true, real: true, forced: true }, { take: function take(limit) { return new IteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/tests/pure/esnext.async-iterator.drop.js b/tests/pure/esnext.async-iterator.drop.js index 4eb50a150cf4..51786e74eb23 100644 --- a/tests/pure/esnext.async-iterator.drop.js +++ b/tests/pure/esnext.async-iterator.drop.js @@ -3,7 +3,7 @@ import { createIterator } from '../helpers/helpers'; import AsyncIterator from 'core-js-pure/full/async-iterator'; QUnit.test('AsyncIterator#drop', assert => { - assert.expect(12); + assert.expect(13); const async = assert.async(); const { drop } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/pure/esnext.async-iterator.take.js b/tests/pure/esnext.async-iterator.take.js index dc5c0a561c5e..927c7d85fd54 100644 --- a/tests/pure/esnext.async-iterator.take.js +++ b/tests/pure/esnext.async-iterator.take.js @@ -3,7 +3,7 @@ import { createIterator } from '../helpers/helpers'; import AsyncIterator from 'core-js-pure/full/async-iterator'; QUnit.test('AsyncIterator#take', assert => { - assert.expect(12); + assert.expect(13); const async = assert.async(); const { take } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/pure/esnext.iterator.drop.js b/tests/pure/esnext.iterator.drop.js index 83b086156665..25cf67ed0165 100644 --- a/tests/pure/esnext.iterator.drop.js +++ b/tests/pure/esnext.iterator.drop.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/pure/esnext.iterator.take.js b/tests/pure/esnext.iterator.take.js index 8c69455e65b9..23728d0711f8 100644 --- a/tests/pure/esnext.iterator.take.js +++ b/tests/pure/esnext.iterator.take.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.async-iterator.drop.js b/tests/tests/esnext.async-iterator.drop.js index 5346d3b1cdf3..01194670daa9 100644 --- a/tests/tests/esnext.async-iterator.drop.js +++ b/tests/tests/esnext.async-iterator.drop.js @@ -1,7 +1,7 @@ import { createIterator } from '../helpers/helpers'; QUnit.test('AsyncIterator#drop', assert => { - assert.expect(14); + assert.expect(15); const async = assert.async(); const { drop } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.async-iterator.take.js b/tests/tests/esnext.async-iterator.take.js index a55b51383b3a..39d855a1e1ba 100644 --- a/tests/tests/esnext.async-iterator.take.js +++ b/tests/tests/esnext.async-iterator.take.js @@ -1,7 +1,7 @@ import { createIterator } from '../helpers/helpers'; QUnit.test('AsyncIterator#take', assert => { - assert.expect(14); + assert.expect(15); const async = assert.async(); const { take } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.iterator.drop.js b/tests/tests/esnext.iterator.drop.js index 714918def202..a38931a5090c 100644 --- a/tests/tests/esnext.iterator.drop.js +++ b/tests/tests/esnext.iterator.drop.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.iterator.take.js b/tests/tests/esnext.iterator.take.js index 1430f73b509c..7063523f4b7d 100644 --- a/tests/tests/esnext.iterator.take.js +++ b/tests/tests/esnext.iterator.take.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); From b21b5740aad111e2f1e30827ce8ffb145c0628b7 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 7 Jul 2022 02:42:03 +0700 Subject: [PATCH 03/26] rename `.asIndexedPairs` to `.indexed` --- README.md | 10 +++---- packages/core-js-compat/src/data.mjs | 6 ++++ .../src/modules-by-versions.mjs | 4 +++ packages/core-js/full/async-iterator/index.js | 2 ++ .../core-js/full/async-iterator/indexed.js | 8 ++++++ packages/core-js/full/iterator/index.js | 2 ++ packages/core-js/full/iterator/indexed.js | 8 ++++++ .../internals/async-iterator-indexed.js | 25 +++++++++++++++++ .../core-js/internals/iterator-indexed.js | 18 ++++++++++++ .../esnext.async-iterator.as-indexed-pairs.js | 28 +++---------------- .../modules/esnext.async-iterator.indexed.js | 7 +++++ .../esnext.iterator.as-indexed-pairs.js | 21 +++----------- .../modules/esnext.iterator.indexed.js | 7 +++++ .../core-js/proposals/iterator-helpers.js | 4 +++ scripts/check-compat-tests.mjs | 2 ++ tests/commonjs.mjs | 2 ++ tests/compat/tests.js | 12 ++++---- tests/pure/esnext.async-iterator.indexed.js | 23 +++++++++++++++ tests/pure/esnext.iterator.indexed.js | 18 ++++++++++++ .../esnext.async-iterator.as-indexed-pairs.js | 4 +-- tests/tests/esnext.async-iterator.indexed.js | 23 +++++++++++++++ .../tests/esnext.iterator.as-indexed-pairs.js | 2 +- tests/tests/esnext.iterator.indexed.js | 18 ++++++++++++ 23 files changed, 199 insertions(+), 55 deletions(-) create mode 100644 packages/core-js/full/async-iterator/indexed.js create mode 100644 packages/core-js/full/iterator/indexed.js create mode 100644 packages/core-js/internals/async-iterator-indexed.js create mode 100644 packages/core-js/internals/iterator-indexed.js create mode 100644 packages/core-js/modules/esnext.async-iterator.indexed.js create mode 100644 packages/core-js/modules/esnext.iterator.indexed.js create mode 100644 tests/pure/esnext.async-iterator.indexed.js create mode 100644 tests/pure/esnext.iterator.indexed.js create mode 100644 tests/tests/esnext.async-iterator.indexed.js create mode 100644 tests/tests/esnext.iterator.indexed.js diff --git a/README.md b/README.md index f124cf70b6c7..65286d17fa6d 100644 --- a/README.md +++ b/README.md @@ -2180,17 +2180,17 @@ correctionNeeded; // => [1, 1, 3] core-js(-pure)/stage/2 ``` ##### [Iterator helpers](https://github.com/tc39/proposal-iterator-helpers)[⬆](#index) -Modules [`esnext.async-iterator.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.constructor.js), [`esnext.async-iterator.as-indexed-pairs`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js), [`esnext.async-iterator.drop`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.drop.js), [`esnext.async-iterator.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.every.js), [`esnext.async-iterator.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.filter.js), [`esnext.async-iterator.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.find.js), [`esnext.async-iterator.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.flat-map.js), [`esnext.async-iterator.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.for-each.js), [`esnext.async-iterator.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.from.js), [`esnext.async-iterator.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.map.js), [`esnext.async-iterator.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.reduce.js), [`esnext.async-iterator.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.some.js), [`esnext.async-iterator.take`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.take.js), [`esnext.async-iterator.to-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.to-array.js), [`esnext.iterator.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.constructor.js), [`esnext.iterator.as-indexed-pairs`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.as-indexed-pairs.js), [`esnext.iterator.drop`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.drop.js), [`esnext.iterator.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.every.js), [`esnext.iterator.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.filter.js), [`esnext.iterator.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.find.js), [`esnext.iterator.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.flat-map.js), [`esnext.iterator.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.for-each.js), [`esnext.iterator.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.from.js), [`esnext.iterator.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.map.js), [`esnext.iterator.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.reduce.js), [`esnext.iterator.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.some.js), [`esnext.iterator.take`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.take.js), [`esnext.iterator.to-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.to-array.js) and [`esnext.iterator.to-async`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.to-async.js) +Modules [`esnext.async-iterator.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.constructor.js), [`esnext.async-iterator.drop`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.drop.js), [`esnext.async-iterator.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.every.js), [`esnext.async-iterator.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.filter.js), [`esnext.async-iterator.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.find.js), [`esnext.async-iterator.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.flat-map.js), [`esnext.async-iterator.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.for-each.js), [`esnext.async-iterator.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.from.js), [`esnext.async-iterator.indexed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.indexed.js), [`esnext.async-iterator.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.map.js), [`esnext.async-iterator.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.reduce.js), [`esnext.async-iterator.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.some.js), [`esnext.async-iterator.take`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.take.js), [`esnext.async-iterator.to-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.to-array.js), [`esnext.iterator.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.constructor.js), [`esnext.iterator.drop`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.drop.js), [`esnext.iterator.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.every.js), [`esnext.iterator.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.filter.js), [`esnext.iterator.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.find.js), [`esnext.iterator.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.flat-map.js), [`esnext.iterator.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.for-each.js), [`esnext.iterator.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.from.js), [`esnext.iterator.indexed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.indexed.js), [`esnext.iterator.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.map.js), [`esnext.iterator.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.reduce.js), [`esnext.iterator.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.some.js), [`esnext.iterator.take`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.take.js), [`esnext.iterator.to-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.to-array.js) and [`esnext.iterator.to-async`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.to-async.js) ```js class Iterator { static from(iterable: Iterable): Iterator; - asIndexedPairs(): Iterator<[index, any]>; drop(limit: uint): Iterator; every(callbackfn: value: any => boolean): boolean; filter(callbackfn: value: any => boolean): Iterator; find(callbackfn: value: any => boolean)): any; flatMap(callbackfn: value => any: Iterable): Iterator; forEach(callbackfn: value => void): void; + indexed(): Iterator<[index, any]>; map(callbackfn: value => any): Iterator; reduce(callbackfn: (memo: any, value: any) => any, initialValue: any): any; some(callbackfn: value: any => boolean): boolean; @@ -2202,13 +2202,13 @@ class Iterator { class AsyncIterator { static from(iterable: Iterable): AsyncIterator; - asIndexedPairs(): AsyncIterator<[index, any]>; drop(limit: uint): AsyncIterator; every(async callbackfn: value: any => boolean): Promise; filter(async callbackfn: value: any => boolean): AsyncIterator; find(async callbackfn: value: any => boolean)): Promise; flatMap(async callbackfn: value => any: Iterable): AsyncIterator; forEach(async callbackfn: value => void): Promise; + indexed(): AsyncIterator<[index, any]>; map(async callbackfn: value => any): AsyncIterator; reduce(async callbackfn: (memo: any, value: any) => any, initialValue: any): Promise; some(async callbackfn: value: any => boolean): Promise; @@ -2221,7 +2221,6 @@ class AsyncIterator { ```js core-js/proposals/iterator-helpers core-js(-pure)/full/async-iterator -core-js(-pure)/full/async-iterator/as-indexed-pairs core-js(-pure)/full/async-iterator/drop core-js(-pure)/full/async-iterator/every core-js(-pure)/full/async-iterator/filter @@ -2229,13 +2228,13 @@ core-js(-pure)/full/async-iterator/find core-js(-pure)/full/async-iterator/flat-map core-js(-pure)/full/async-iterator/for-each core-js(-pure)/full/async-iterator/from +core-js(-pure)/full/async-iterator/indexed core-js(-pure)/full/async-iterator/map core-js(-pure)/full/async-iterator/reduce core-js(-pure)/full/async-iterator/some core-js(-pure)/full/async-iterator/take core-js(-pure)/full/async-iterator/to-array core-js(-pure)/full/iterator -core-js(-pure)/full/iterator/as-indexed-pairs core-js(-pure)/full/iterator/drop core-js(-pure)/full/iterator/every core-js(-pure)/full/iterator/filter @@ -2243,6 +2242,7 @@ core-js(-pure)/full/iterator/find core-js(-pure)/full/iterator/flat-map core-js(-pure)/full/iterator/for-each core-js(-pure)/full/iterator/from +core-js(-pure)/full/iterator/indexed core-js(-pure)/full/iterator/map core-js(-pure)/full/iterator/reduce core-js(-pure)/full/iterator/some diff --git a/packages/core-js-compat/src/data.mjs b/packages/core-js-compat/src/data.mjs index eb95963181cc..b9c7dbad7141 100644 --- a/packages/core-js-compat/src/data.mjs +++ b/packages/core-js-compat/src/data.mjs @@ -2080,6 +2080,7 @@ export const data = { }, 'esnext.async-iterator.constructor': { }, + // TODO: Remove from `core-js@4` 'esnext.async-iterator.as-indexed-pairs': { }, 'esnext.async-iterator.drop': { @@ -2096,6 +2097,8 @@ export const data = { }, 'esnext.async-iterator.from': { }, + 'esnext.async-iterator.indexed': { + }, 'esnext.async-iterator.map': { }, 'esnext.async-iterator.reduce': { @@ -2122,6 +2125,7 @@ export const data = { 'esnext.global-this': null, 'esnext.iterator.constructor': { }, + // TODO: Remove from `core-js@4` 'esnext.iterator.as-indexed-pairs': { }, 'esnext.iterator.drop': { @@ -2138,6 +2142,8 @@ export const data = { }, 'esnext.iterator.from': { }, + 'esnext.iterator.indexed': { + }, 'esnext.iterator.map': { }, 'esnext.iterator.reduce': { diff --git a/packages/core-js-compat/src/modules-by-versions.mjs b/packages/core-js-compat/src/modules-by-versions.mjs index 347b99a53f53..ab62620b1326 100644 --- a/packages/core-js-compat/src/modules-by-versions.mjs +++ b/packages/core-js-compat/src/modules-by-versions.mjs @@ -150,4 +150,8 @@ export default { 'esnext.array.group-to-map', 'esnext.symbol.metadata-key', ], + 3.24: [ + 'esnext.async-iterator.indexed', + 'esnext.iterator.indexed', + ], }; diff --git a/packages/core-js/full/async-iterator/index.js b/packages/core-js/full/async-iterator/index.js index 6376eee05976..867cf7f8e0ba 100644 --- a/packages/core-js/full/async-iterator/index.js +++ b/packages/core-js/full/async-iterator/index.js @@ -3,6 +3,7 @@ require('../../modules/es.object.to-string'); require('../../modules/es.promise'); require('../../modules/es.string.iterator'); require('../../modules/esnext.async-iterator.constructor'); +// TODO: Remove from `core-js@4` require('../../modules/esnext.async-iterator.as-indexed-pairs'); require('../../modules/esnext.async-iterator.drop'); require('../../modules/esnext.async-iterator.every'); @@ -11,6 +12,7 @@ require('../../modules/esnext.async-iterator.find'); require('../../modules/esnext.async-iterator.flat-map'); require('../../modules/esnext.async-iterator.for-each'); require('../../modules/esnext.async-iterator.from'); +require('../../modules/esnext.async-iterator.indexed'); require('../../modules/esnext.async-iterator.map'); require('../../modules/esnext.async-iterator.reduce'); require('../../modules/esnext.async-iterator.some'); diff --git a/packages/core-js/full/async-iterator/indexed.js b/packages/core-js/full/async-iterator/indexed.js new file mode 100644 index 000000000000..2686c40d504a --- /dev/null +++ b/packages/core-js/full/async-iterator/indexed.js @@ -0,0 +1,8 @@ +require('../../modules/es.object.to-string'); +require('../../modules/es.promise'); +require('../../modules/esnext.async-iterator.constructor'); +require('../../modules/esnext.async-iterator.indexed'); + +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('AsyncIterator', 'indexed'); diff --git a/packages/core-js/full/iterator/index.js b/packages/core-js/full/iterator/index.js index 55bc312204b6..181901486408 100644 --- a/packages/core-js/full/iterator/index.js +++ b/packages/core-js/full/iterator/index.js @@ -3,6 +3,7 @@ require('../../modules/es.object.to-string'); require('../../modules/es.promise'); require('../../modules/es.string.iterator'); require('../../modules/esnext.iterator.constructor'); +// TODO: Remove from `core-js@4` require('../../modules/esnext.iterator.as-indexed-pairs'); require('../../modules/esnext.iterator.drop'); require('../../modules/esnext.iterator.every'); @@ -11,6 +12,7 @@ require('../../modules/esnext.iterator.find'); require('../../modules/esnext.iterator.flat-map'); require('../../modules/esnext.iterator.for-each'); require('../../modules/esnext.iterator.from'); +require('../../modules/esnext.iterator.indexed'); require('../../modules/esnext.iterator.map'); require('../../modules/esnext.iterator.reduce'); require('../../modules/esnext.iterator.some'); diff --git a/packages/core-js/full/iterator/indexed.js b/packages/core-js/full/iterator/indexed.js new file mode 100644 index 000000000000..133712fff554 --- /dev/null +++ b/packages/core-js/full/iterator/indexed.js @@ -0,0 +1,8 @@ +require('../../modules/es.object.to-string'); +require('../../modules/esnext.iterator.constructor'); +require('../../modules/esnext.iterator.indexed'); + +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Iterator', 'indexed'); + diff --git a/packages/core-js/internals/async-iterator-indexed.js b/packages/core-js/internals/async-iterator-indexed.js new file mode 100644 index 000000000000..95285de13fba --- /dev/null +++ b/packages/core-js/internals/async-iterator-indexed.js @@ -0,0 +1,25 @@ +'use strict'; +// https://github.com/tc39/proposal-iterator-helpers +var apply = require('../internals/function-apply'); +var anObject = require('../internals/an-object'); +var getIteratorDirect = require('../internals/get-iterator-direct'); +var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); + +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { + var state = this; + var iterator = state.iterator; + + return Promise.resolve(anObject(apply(state.next, iterator, args))).then(function (step) { + if (anObject(step).done) { + state.done = true; + return { done: true, value: undefined }; + } + return { done: false, value: [state.index++, step.value] }; + }); +}); + +module.exports = function indexed() { + return new AsyncIteratorProxy(getIteratorDirect(this), { + index: 0 + }); +}; diff --git a/packages/core-js/internals/iterator-indexed.js b/packages/core-js/internals/iterator-indexed.js new file mode 100644 index 000000000000..b03bed38ae75 --- /dev/null +++ b/packages/core-js/internals/iterator-indexed.js @@ -0,0 +1,18 @@ +'use strict'; +// https://github.com/tc39/proposal-iterator-helpers +var apply = require('../internals/function-apply'); +var anObject = require('../internals/an-object'); +var getIteratorDirect = require('../internals/get-iterator-direct'); +var createIteratorProxy = require('../internals/iterator-create-proxy'); + +var IteratorProxy = createIteratorProxy(function (args) { + var result = anObject(apply(this.next, this.iterator, args)); + var done = this.done = !!result.done; + if (!done) return [this.index++, result.value]; +}); + +module.exports = function indexed() { + return new IteratorProxy(getIteratorDirect(this), { + index: 0 + }); +}; diff --git a/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js b/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js index 8f36b535e914..da3de5b08f06 100644 --- a/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js +++ b/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js @@ -1,28 +1,8 @@ -'use strict'; +// TODO: Remove from `core-js@4` // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); -var anObject = require('../internals/an-object'); -var getIteratorDirect = require('../internals/get-iterator-direct'); -var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); +var indexed = require('../internals/async-iterator-indexed'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { - var state = this; - var iterator = state.iterator; - - return Promise.resolve(anObject(apply(state.next, iterator, args))).then(function (step) { - if (anObject(step).done) { - state.done = true; - return { done: true, value: undefined }; - } - return { done: false, value: [state.index++, step.value] }; - }); -}); - -$({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { - asIndexedPairs: function asIndexedPairs() { - return new AsyncIteratorProxy(getIteratorDirect(this), { - index: 0 - }); - } +$({ target: 'AsyncIterator', name: 'indexed', proto: true, real: true, forced: true }, { + asIndexedPairs: indexed }); diff --git a/packages/core-js/modules/esnext.async-iterator.indexed.js b/packages/core-js/modules/esnext.async-iterator.indexed.js new file mode 100644 index 000000000000..5be9d38bcea5 --- /dev/null +++ b/packages/core-js/modules/esnext.async-iterator.indexed.js @@ -0,0 +1,7 @@ +// https://github.com/tc39/proposal-iterator-helpers +var $ = require('../internals/export'); +var indexed = require('../internals/async-iterator-indexed'); + +$({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { + indexed: indexed +}); diff --git a/packages/core-js/modules/esnext.iterator.as-indexed-pairs.js b/packages/core-js/modules/esnext.iterator.as-indexed-pairs.js index 33f16d7e3456..2e241af1a8bc 100644 --- a/packages/core-js/modules/esnext.iterator.as-indexed-pairs.js +++ b/packages/core-js/modules/esnext.iterator.as-indexed-pairs.js @@ -1,21 +1,8 @@ -'use strict'; +// TODO: Remove from `core-js@4` // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); -var anObject = require('../internals/an-object'); -var getIteratorDirect = require('../internals/get-iterator-direct'); -var createIteratorProxy = require('../internals/iterator-create-proxy'); +var indexed = require('../internals/iterator-indexed'); -var IteratorProxy = createIteratorProxy(function (args) { - var result = anObject(apply(this.next, this.iterator, args)); - var done = this.done = !!result.done; - if (!done) return [this.index++, result.value]; -}); - -$({ target: 'Iterator', proto: true, real: true, forced: true }, { - asIndexedPairs: function asIndexedPairs() { - return new IteratorProxy(getIteratorDirect(this), { - index: 0 - }); - } +$({ target: 'Iterator', name: 'indexed', proto: true, real: true, forced: true }, { + asIndexedPairs: indexed }); diff --git a/packages/core-js/modules/esnext.iterator.indexed.js b/packages/core-js/modules/esnext.iterator.indexed.js new file mode 100644 index 000000000000..b68c9fc12bd9 --- /dev/null +++ b/packages/core-js/modules/esnext.iterator.indexed.js @@ -0,0 +1,7 @@ +// https://github.com/tc39/proposal-iterator-helpers +var $ = require('../internals/export'); +var indexed = require('../internals/iterator-indexed'); + +$({ target: 'Iterator', proto: true, real: true, forced: true }, { + indexed: indexed +}); diff --git a/packages/core-js/proposals/iterator-helpers.js b/packages/core-js/proposals/iterator-helpers.js index a7b1355abe82..a08daf9506fe 100644 --- a/packages/core-js/proposals/iterator-helpers.js +++ b/packages/core-js/proposals/iterator-helpers.js @@ -1,5 +1,6 @@ // https://github.com/tc39/proposal-iterator-helpers require('../modules/esnext.async-iterator.constructor'); +// TODO: remove from `core-js@4` require('../modules/esnext.async-iterator.as-indexed-pairs'); require('../modules/esnext.async-iterator.drop'); require('../modules/esnext.async-iterator.every'); @@ -8,12 +9,14 @@ require('../modules/esnext.async-iterator.find'); require('../modules/esnext.async-iterator.flat-map'); require('../modules/esnext.async-iterator.for-each'); require('../modules/esnext.async-iterator.from'); +require('../modules/esnext.async-iterator.indexed'); require('../modules/esnext.async-iterator.map'); require('../modules/esnext.async-iterator.reduce'); require('../modules/esnext.async-iterator.some'); require('../modules/esnext.async-iterator.take'); require('../modules/esnext.async-iterator.to-array'); require('../modules/esnext.iterator.constructor'); +// TODO: remove from `core-js@4` require('../modules/esnext.iterator.as-indexed-pairs'); require('../modules/esnext.iterator.drop'); require('../modules/esnext.iterator.every'); @@ -22,6 +25,7 @@ require('../modules/esnext.iterator.find'); require('../modules/esnext.iterator.flat-map'); require('../modules/esnext.iterator.for-each'); require('../modules/esnext.iterator.from'); +require('../modules/esnext.iterator.indexed'); require('../modules/esnext.iterator.map'); require('../modules/esnext.iterator.reduce'); require('../modules/esnext.iterator.some'); diff --git a/scripts/check-compat-tests.mjs b/scripts/check-compat-tests.mjs index 8a2b954b67c3..058a917856ec 100644 --- a/scripts/check-compat-tests.mjs +++ b/scripts/check-compat-tests.mjs @@ -19,6 +19,8 @@ const ignore = new Set([ 'esnext.array.group-by-to-map', 'esnext.array.last-index', 'esnext.array.last-item', + 'esnext.async-iterator.as-indexed-pairs', + 'esnext.iterator.as-indexed-pairs', 'esnext.map.update-or-insert', 'esnext.map.upsert', 'esnext.math.iaddh', diff --git a/tests/commonjs.mjs b/tests/commonjs.mjs index 74aef7ef7aa9..f648c4470e07 100644 --- a/tests/commonjs.mjs +++ b/tests/commonjs.mjs @@ -685,6 +685,7 @@ for (PATH of ['core-js-pure', 'core-js']) { ok(typeof load(NS, 'async-iterator/flat-map') == 'function'); ok(typeof load(NS, 'async-iterator/for-each') == 'function'); ok(typeof load(NS, 'async-iterator/from') == 'function'); + ok(typeof load(NS, 'async-iterator/indexed') == 'function'); ok(typeof load(NS, 'async-iterator/map') == 'function'); ok(typeof load(NS, 'async-iterator/reduce') == 'function'); ok(typeof load(NS, 'async-iterator/some') == 'function'); @@ -707,6 +708,7 @@ for (PATH of ['core-js-pure', 'core-js']) { ok(typeof load(NS, 'iterator/flat-map') == 'function'); ok(typeof load(NS, 'iterator/for-each') == 'function'); ok(typeof load(NS, 'iterator/from') == 'function'); + ok(typeof load(NS, 'iterator/indexed') == 'function'); ok(typeof load(NS, 'iterator/map') == 'function'); ok(typeof load(NS, 'iterator/reduce') == 'function'); ok(typeof load(NS, 'iterator/some') == 'function'); diff --git a/tests/compat/tests.js b/tests/compat/tests.js index b37ffd96b137..10c780cdff8b 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -1431,9 +1431,6 @@ GLOBAL.tests = { 'esnext.async-iterator.constructor': function () { return typeof AsyncIterator == 'function'; }, - 'esnext.async-iterator.as-indexed-pairs': function () { - return AsyncIterator.prototype.asIndexedPairs; - }, 'esnext.async-iterator.drop': function () { return AsyncIterator.prototype.drop; }, @@ -1455,6 +1452,9 @@ GLOBAL.tests = { 'esnext.async-iterator.from': function () { return AsyncIterator.from; }, + 'esnext.async-iterator.indexed': function () { + return AsyncIterator.prototype.indexed; + }, 'esnext.async-iterator.map': function () { return AsyncIterator.prototype.map; }, @@ -1496,9 +1496,6 @@ GLOBAL.tests = { && Iterator.prototype === Object.getPrototypeOf(Object.getPrototypeOf([].values())); } }, - 'esnext.iterator.as-indexed-pairs': function () { - return Iterator.prototype.asIndexedPairs; - }, 'esnext.iterator.drop': function () { return Iterator.prototype.drop; }, @@ -1520,6 +1517,9 @@ GLOBAL.tests = { 'esnext.iterator.from': function () { return Iterator.from; }, + 'esnext.iterator.indexed': function () { + return Iterator.prototype.indexed; + }, 'esnext.iterator.map': function () { return Iterator.prototype.map; }, diff --git a/tests/pure/esnext.async-iterator.indexed.js b/tests/pure/esnext.async-iterator.indexed.js new file mode 100644 index 000000000000..d66bf5c9e802 --- /dev/null +++ b/tests/pure/esnext.async-iterator.indexed.js @@ -0,0 +1,23 @@ +import { createIterator } from '../helpers/helpers'; + +import AsyncIterator from 'core-js-pure/full/async-iterator'; + +QUnit.test('AsyncIterator#indexed', assert => { + assert.expect(8); + const async = assert.async(); + const { indexed } = AsyncIterator.prototype; + + assert.isFunction(indexed); + assert.arity(indexed, 0); + assert.nonEnumerable(AsyncIterator.prototype, 'indexed'); + + indexed.call(createIterator(['a', 'b', 'c'])).toArray().then(it => { + assert.same(it.toString(), '0,a,1,b,2,c', 'basic functionality'); + async(); + }); + + assert.throws(() => indexed.call(undefined, () => { /* empty */ }), TypeError); + assert.throws(() => indexed.call(null, () => { /* empty */ }), TypeError); + assert.throws(() => indexed.call({}, () => { /* empty */ }), TypeError); + assert.throws(() => indexed.call([], () => { /* empty */ }), TypeError); +}); diff --git a/tests/pure/esnext.iterator.indexed.js b/tests/pure/esnext.iterator.indexed.js new file mode 100644 index 000000000000..94454f77c4e6 --- /dev/null +++ b/tests/pure/esnext.iterator.indexed.js @@ -0,0 +1,18 @@ +import { createIterator } from '../helpers/helpers'; + +import Iterator from 'core-js-pure/full/iterator'; + +QUnit.test('Iterator#indexed', assert => { + const { indexed } = Iterator.prototype; + + assert.isFunction(indexed); + assert.arity(indexed, 0); + assert.nonEnumerable(Iterator.prototype, 'indexed'); + + assert.arrayEqual(indexed.call(createIterator(['a', 'b', 'c'])).toArray().toString(), '0,a,1,b,2,c', 'basic functionality'); + + assert.throws(() => indexed.call(undefined, TypeError)); + assert.throws(() => indexed.call(null, TypeError)); + assert.throws(() => indexed.call({}, TypeError)); + assert.throws(() => indexed.call([], TypeError)); +}); diff --git a/tests/tests/esnext.async-iterator.as-indexed-pairs.js b/tests/tests/esnext.async-iterator.as-indexed-pairs.js index 1e4dafea7433..5ca4da06f3e2 100644 --- a/tests/tests/esnext.async-iterator.as-indexed-pairs.js +++ b/tests/tests/esnext.async-iterator.as-indexed-pairs.js @@ -1,13 +1,13 @@ import { createIterator } from '../helpers/helpers'; QUnit.test('AsyncIterator#asIndexedPairs', assert => { - assert.expect(10); + assert.expect(9); const async = assert.async(); const { asIndexedPairs } = AsyncIterator.prototype; assert.isFunction(asIndexedPairs); assert.arity(asIndexedPairs, 0); - assert.name(asIndexedPairs, 'asIndexedPairs'); + // assert.name(asIndexedPairs, 'asIndexedPairs'); assert.looksNative(asIndexedPairs); assert.nonEnumerable(AsyncIterator.prototype, 'asIndexedPairs'); diff --git a/tests/tests/esnext.async-iterator.indexed.js b/tests/tests/esnext.async-iterator.indexed.js new file mode 100644 index 000000000000..cb6ac33154c4 --- /dev/null +++ b/tests/tests/esnext.async-iterator.indexed.js @@ -0,0 +1,23 @@ +import { createIterator } from '../helpers/helpers'; + +QUnit.test('AsyncIterator#indexed', assert => { + assert.expect(10); + const async = assert.async(); + const { indexed } = AsyncIterator.prototype; + + assert.isFunction(indexed); + assert.arity(indexed, 0); + assert.name(indexed, 'indexed'); + assert.looksNative(indexed); + assert.nonEnumerable(AsyncIterator.prototype, 'indexed'); + + indexed.call(createIterator(['a', 'b', 'c'])).toArray().then(it => { + assert.same(it.toString(), '0,a,1,b,2,c', 'basic functionality'); + async(); + }); + + assert.throws(() => indexed.call(undefined, () => { /* empty */ }), TypeError); + assert.throws(() => indexed.call(null, () => { /* empty */ }), TypeError); + assert.throws(() => indexed.call({}, () => { /* empty */ }), TypeError); + assert.throws(() => indexed.call([], () => { /* empty */ }), TypeError); +}); diff --git a/tests/tests/esnext.iterator.as-indexed-pairs.js b/tests/tests/esnext.iterator.as-indexed-pairs.js index 0917dce5d0aa..b620d82eab90 100644 --- a/tests/tests/esnext.iterator.as-indexed-pairs.js +++ b/tests/tests/esnext.iterator.as-indexed-pairs.js @@ -5,7 +5,7 @@ QUnit.test('Iterator#asIndexedPairs', assert => { assert.isFunction(asIndexedPairs); assert.arity(asIndexedPairs, 0); - assert.name(asIndexedPairs, 'asIndexedPairs'); + // assert.name(asIndexedPairs, 'asIndexedPairs'); assert.looksNative(asIndexedPairs); assert.nonEnumerable(Iterator.prototype, 'asIndexedPairs'); diff --git a/tests/tests/esnext.iterator.indexed.js b/tests/tests/esnext.iterator.indexed.js new file mode 100644 index 000000000000..2f3f6b042bf1 --- /dev/null +++ b/tests/tests/esnext.iterator.indexed.js @@ -0,0 +1,18 @@ +import { createIterator } from '../helpers/helpers'; + +QUnit.test('Iterator#indexed', assert => { + const { indexed } = Iterator.prototype; + + assert.isFunction(indexed); + assert.arity(indexed, 0); + assert.name(indexed, 'indexed'); + assert.looksNative(indexed); + assert.nonEnumerable(Iterator.prototype, 'indexed'); + + assert.arrayEqual(indexed.call(createIterator(['a', 'b', 'c'])).toArray().toString(), '0,a,1,b,2,c', 'basic functionality'); + + assert.throws(() => indexed.call(undefined, TypeError)); + assert.throws(() => indexed.call(null, TypeError)); + assert.throws(() => indexed.call({}, TypeError)); + assert.throws(() => indexed.call([], TypeError)); +}); From 41f834e045cfe327d53c7cf1f05564aba8da14be Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 9 Jul 2022 07:52:21 +0700 Subject: [PATCH 04/26] don't pass arguments to methods from the extended iterators protocol --- packages/core-js/internals/async-iterator-create-proxy.js | 8 ++------ packages/core-js/internals/async-iterator-indexed.js | 6 +++--- packages/core-js/internals/iterator-create-proxy.js | 7 ++----- packages/core-js/internals/iterator-indexed.js | 6 +++--- packages/core-js/modules/esnext.async-iterator.drop.js | 6 +++--- packages/core-js/modules/esnext.async-iterator.filter.js | 6 +++--- packages/core-js/modules/esnext.async-iterator.from.js | 6 +++--- packages/core-js/modules/esnext.async-iterator.map.js | 6 +++--- packages/core-js/modules/esnext.async-iterator.take.js | 7 +++---- packages/core-js/modules/esnext.iterator.drop.js | 5 ++--- packages/core-js/modules/esnext.iterator.filter.js | 6 +++--- packages/core-js/modules/esnext.iterator.from.js | 6 +++--- packages/core-js/modules/esnext.iterator.map.js | 6 +++--- packages/core-js/modules/esnext.iterator.take.js | 6 +++--- 14 files changed, 39 insertions(+), 48 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 7edc0d3b5f55..9e8c973af8d9 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -26,19 +26,15 @@ module.exports = function (nextHandler, IS_ITERATOR) { } else state = record; state.type = ASYNC_ITERATOR_PROXY; state.done = false; - state.ignoreArgument = !IS_ITERATOR; setInternalState(this, state); }; AsyncIteratorProxy.prototype = defineBuiltIns(create(AsyncIteratorPrototype), { - next: function next(arg) { + next: function next() { var that = this; - var hasArgument = !!arguments.length; return new Promise(function (resolve) { var state = getInternalState(that); - var args = hasArgument ? [state.ignoreArgument ? undefined : arg] : IS_ITERATOR ? [] : [undefined]; - state.ignoreArgument = false; - resolve(state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise, args))); + resolve(state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise))); }); }, 'return': function (value) { diff --git a/packages/core-js/internals/async-iterator-indexed.js b/packages/core-js/internals/async-iterator-indexed.js index 95285de13fba..948f00cda049 100644 --- a/packages/core-js/internals/async-iterator-indexed.js +++ b/packages/core-js/internals/async-iterator-indexed.js @@ -1,15 +1,15 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; var iterator = state.iterator; - return Promise.resolve(anObject(apply(state.next, iterator, args))).then(function (step) { + return Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { if (anObject(step).done) { state.done = true; return { done: true, value: undefined }; diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index e5137ba45d2f..38458b7555e2 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -23,16 +23,13 @@ module.exports = function (nextHandler, IS_ITERATOR) { } else state = record; state.type = ITERATOR_PROXY; state.done = false; - state.ignoreArg = !IS_ITERATOR; setInternalState(this, state); }; IteratorProxy.prototype = defineBuiltIns(create(IteratorPrototype), { - next: function next(arg) { + next: function next() { var state = getInternalState(this); - var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined]; - state.ignoreArg = false; - var result = state.done ? undefined : call(nextHandler, state, args); + var result = state.done ? undefined : call(nextHandler, state); return { done: state.done, value: result }; }, 'return': function (value) { diff --git a/packages/core-js/internals/iterator-indexed.js b/packages/core-js/internals/iterator-indexed.js index b03bed38ae75..1a64ec7c486c 100644 --- a/packages/core-js/internals/iterator-indexed.js +++ b/packages/core-js/internals/iterator-indexed.js @@ -1,12 +1,12 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createIteratorProxy = require('../internals/iterator-create-proxy'); -var IteratorProxy = createIteratorProxy(function (args) { - var result = anObject(apply(this.next, this.iterator, args)); +var IteratorProxy = createIteratorProxy(function () { + var result = anObject(call(this.next, this.iterator)); var done = this.done = !!result.done; if (!done) return [this.index++, result.value]; }); diff --git a/packages/core-js/modules/esnext.async-iterator.drop.js b/packages/core-js/modules/esnext.async-iterator.drop.js index 4e396937549a..3839e7958e3d 100644 --- a/packages/core-js/modules/esnext.async-iterator.drop.js +++ b/packages/core-js/modules/esnext.async-iterator.drop.js @@ -1,21 +1,21 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; return new Promise(function (resolve, reject) { var loop = function () { try { Promise.resolve( - anObject(apply(state.next, state.iterator, state.remaining ? [] : args)) + anObject(call(state.next, state.iterator)) ).then(function (step) { try { if (anObject(step).done) { diff --git a/packages/core-js/modules/esnext.async-iterator.filter.js b/packages/core-js/modules/esnext.async-iterator.filter.js index e9a250090a3c..94f83bb38900 100644 --- a/packages/core-js/modules/esnext.async-iterator.filter.js +++ b/packages/core-js/modules/esnext.async-iterator.filter.js @@ -1,20 +1,20 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; var filterer = state.filterer; return new Promise(function (resolve, reject) { var loop = function () { try { - Promise.resolve(anObject(apply(state.next, state.iterator, args))).then(function (step) { + Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { try { if (anObject(step).done) { state.done = true; diff --git a/packages/core-js/modules/esnext.async-iterator.from.js b/packages/core-js/modules/esnext.async-iterator.from.js index c3e63e6e154c..0870fed2db72 100644 --- a/packages/core-js/modules/esnext.async-iterator.from.js +++ b/packages/core-js/modules/esnext.async-iterator.from.js @@ -1,6 +1,6 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var toObject = require('../internals/to-object'); var isPrototypeOf = require('../internals/object-is-prototype-of'); @@ -16,8 +16,8 @@ var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator'); var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { - return anObject(apply(this.next, this.iterator, args)); +var AsyncIteratorProxy = createAsyncIteratorProxy(function () { + return anObject(call(this.next, this.iterator)); }, true); $({ target: 'AsyncIterator', stat: true, forced: true }, { diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index b4cfb85475b1..fdcd7d790b27 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -1,17 +1,17 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; var mapper = state.mapper; - return Promise.resolve(anObject(apply(state.next, state.iterator, args))).then(function (step) { + return Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { if (anObject(step).done) { state.done = true; return { done: true, value: undefined }; diff --git a/packages/core-js/modules/esnext.async-iterator.take.js b/packages/core-js/modules/esnext.async-iterator.take.js index 1649e96f2907..bb9d9bb6ccf7 100644 --- a/packages/core-js/modules/esnext.async-iterator.take.js +++ b/packages/core-js/modules/esnext.async-iterator.take.js @@ -1,14 +1,13 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); var call = require('../internals/function-call'); var getIteratorDirect = require('../internals/get-iterator-direct'); var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var iterator = this.iterator; var returnMethod, result; if (!this.remaining--) { @@ -16,12 +15,12 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { this.done = true; returnMethod = iterator['return']; if (returnMethod !== undefined) { - return Promise.resolve(call(returnMethod, iterator)).then(function () { + return Promise.resolve(call(returnMethod, iterator, undefined)).then(function () { return result; }); } return result; - } return apply(this.next, iterator, args); + } return call(this.next, iterator); }); $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { diff --git a/packages/core-js/modules/esnext.iterator.drop.js b/packages/core-js/modules/esnext.iterator.drop.js index b24e17ed7ac5..8737e8137404 100644 --- a/packages/core-js/modules/esnext.iterator.drop.js +++ b/packages/core-js/modules/esnext.iterator.drop.js @@ -1,7 +1,6 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); @@ -9,7 +8,7 @@ var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createIteratorProxy = require('../internals/iterator-create-proxy'); -var IteratorProxy = createIteratorProxy(function (args) { +var IteratorProxy = createIteratorProxy(function () { var iterator = this.iterator; var next = this.next; var result, done; @@ -19,7 +18,7 @@ var IteratorProxy = createIteratorProxy(function (args) { done = this.done = !!result.done; if (done) return; } - result = anObject(apply(next, iterator, args)); + result = anObject(call(next, iterator)); done = this.done = !!result.done; if (!done) return result.value; }); diff --git a/packages/core-js/modules/esnext.iterator.filter.js b/packages/core-js/modules/esnext.iterator.filter.js index b56aa2de15b2..d3205885065f 100644 --- a/packages/core-js/modules/esnext.iterator.filter.js +++ b/packages/core-js/modules/esnext.iterator.filter.js @@ -1,20 +1,20 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createIteratorProxy = require('../internals/iterator-create-proxy'); var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); -var IteratorProxy = createIteratorProxy(function (args) { +var IteratorProxy = createIteratorProxy(function () { var iterator = this.iterator; var filterer = this.filterer; var next = this.next; var result, done, value; while (true) { - result = anObject(apply(next, iterator, args)); + result = anObject(call(next, iterator)); done = this.done = !!result.done; if (done) return; value = result.value; diff --git a/packages/core-js/modules/esnext.iterator.from.js b/packages/core-js/modules/esnext.iterator.from.js index dd09294701f0..610f8f7abe4f 100644 --- a/packages/core-js/modules/esnext.iterator.from.js +++ b/packages/core-js/modules/esnext.iterator.from.js @@ -1,6 +1,6 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var toObject = require('../internals/to-object'); var isPrototypeOf = require('../internals/object-is-prototype-of'); @@ -10,8 +10,8 @@ var getIterator = require('../internals/get-iterator'); var getIteratorDirect = require('../internals/get-iterator-direct'); var getIteratorMethod = require('../internals/get-iterator-method'); -var IteratorProxy = createIteratorProxy(function (args) { - var result = anObject(apply(this.next, this.iterator, args)); +var IteratorProxy = createIteratorProxy(function () { + var result = anObject(call(this.next, this.iterator)); var done = this.done = !!result.done; if (!done) return result.value; }, true); diff --git a/packages/core-js/modules/esnext.iterator.map.js b/packages/core-js/modules/esnext.iterator.map.js index 1d3a49f969a6..c1b4b1963ab2 100644 --- a/packages/core-js/modules/esnext.iterator.map.js +++ b/packages/core-js/modules/esnext.iterator.map.js @@ -1,16 +1,16 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createIteratorProxy = require('../internals/iterator-create-proxy'); var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); -var IteratorProxy = createIteratorProxy(function (args) { +var IteratorProxy = createIteratorProxy(function () { var iterator = this.iterator; - var result = anObject(apply(this.next, iterator, args)); + var result = anObject(call(this.next, iterator)); var done = this.done = !!result.done; if (!done) return callWithSafeIterationClosing(iterator, this.mapper, result.value); }); diff --git a/packages/core-js/modules/esnext.iterator.take.js b/packages/core-js/modules/esnext.iterator.take.js index 15001836a020..05c5e46b51de 100644 --- a/packages/core-js/modules/esnext.iterator.take.js +++ b/packages/core-js/modules/esnext.iterator.take.js @@ -1,7 +1,7 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var notANaN = require('../internals/not-a-nan'); @@ -9,13 +9,13 @@ var toPositiveInteger = require('../internals/to-positive-integer'); var createIteratorProxy = require('../internals/iterator-create-proxy'); var iteratorClose = require('../internals/iterator-close'); -var IteratorProxy = createIteratorProxy(function (args) { +var IteratorProxy = createIteratorProxy(function () { var iterator = this.iterator; if (!this.remaining--) { this.done = true; return iteratorClose(iterator, 'normal', undefined); } - var result = anObject(apply(this.next, iterator, args)); + var result = anObject(call(this.next, iterator)); var done = this.done = !!result.done; if (!done) return result.value; }); From dcf48176c91b05ac6906064a28de04f18da2c8dc Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 9 Jul 2022 08:12:05 +0700 Subject: [PATCH 05/26] avoid extra promise creation https://github.com/tc39/proposal-iterator-helpers/pull/197 --- packages/core-js/internals/async-iterator-create-proxy.js | 6 ++++-- packages/core-js/modules/esnext.async-iterator.from.js | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 9e8c973af8d9..cad85f4f782d 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -1,5 +1,6 @@ 'use strict'; var call = require('../internals/function-call'); +var perform = require('../internals/perform'); var anObject = require('../internals/an-object'); var create = require('../internals/object-create'); var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); @@ -32,10 +33,11 @@ module.exports = function (nextHandler, IS_ITERATOR) { AsyncIteratorProxy.prototype = defineBuiltIns(create(AsyncIteratorPrototype), { next: function next() { var that = this; - return new Promise(function (resolve) { + var result = perform(function () { var state = getInternalState(that); - resolve(state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise))); + return state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise)); }); + return result.error ? Promise.reject(result.value) : Promise.resolve(result.value); }, 'return': function (value) { var that = this; diff --git a/packages/core-js/modules/esnext.async-iterator.from.js b/packages/core-js/modules/esnext.async-iterator.from.js index 0870fed2db72..c34176747d07 100644 --- a/packages/core-js/modules/esnext.async-iterator.from.js +++ b/packages/core-js/modules/esnext.async-iterator.from.js @@ -1,7 +1,6 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); var toObject = require('../internals/to-object'); var isPrototypeOf = require('../internals/object-is-prototype-of'); var AsyncIteratorPrototype = require('../internals/async-iterator-prototype'); @@ -17,7 +16,7 @@ var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator'); var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); var AsyncIteratorProxy = createAsyncIteratorProxy(function () { - return anObject(call(this.next, this.iterator)); + return call(this.next, this.iterator); }, true); $({ target: 'AsyncIterator', stat: true, forced: true }, { From 0730b228be4832a8c93cbbca1c2f636b27634285 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 9 Jul 2022 08:30:28 +0700 Subject: [PATCH 06/26] drop `.throw` methods from all wrappers / helpers prototypes --- .../core-js/internals/async-iterator-create-proxy.js | 11 ----------- packages/core-js/internals/iterator-create-proxy.js | 8 -------- 2 files changed, 19 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index cad85f4f782d..70757ee40859 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -52,17 +52,6 @@ module.exports = function (nextHandler, IS_ITERATOR) { resolve({ done: true, value: value }); }, reject); }); - }, - 'throw': function (value) { - var that = this; - return new Promise(function (resolve, reject) { - var state = getInternalState(that); - var iterator = state.iterator; - state.done = true; - var $$throw = getMethod(iterator, 'throw'); - if ($$throw === undefined) return reject(value); - resolve(call($$throw, iterator, value)); - }); } }); diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 38458b7555e2..2dca83b7406e 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -38,14 +38,6 @@ module.exports = function (nextHandler, IS_ITERATOR) { state.done = true; var $$return = getMethod(iterator, 'return'); return { done: true, value: $$return ? anObject(call($$return, iterator, value)).value : value }; - }, - 'throw': function (value) { - var state = getInternalState(this); - var iterator = state.iterator; - state.done = true; - var $$throw = getMethod(iterator, 'throw'); - if ($$throw) return call($$throw, iterator, value); - throw value; } }); From f0055f8e52e801c51fb682029498aa4a1aeb1aa5 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 9 Jul 2022 23:40:15 +0700 Subject: [PATCH 07/26] fix the difference between wrapper and generator proxies --- packages/core-js/internals/async-iterator-create-proxy.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 70757ee40859..72f00ed26146 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -37,7 +37,12 @@ module.exports = function (nextHandler, IS_ITERATOR) { var state = getInternalState(that); return state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise)); }); - return result.error ? Promise.reject(result.value) : Promise.resolve(result.value); + var error = result.error; + var value = result.value; + if (IS_ITERATOR) return error ? Promise.reject(value) : Promise.resolve(value); + return new Promise(function (resolve, reject) { + error ? reject(value) : resolve(value); + }); }, 'return': function (value) { var that = this; From e5968c8b16b4190e238772c2b61bfc0b2a641c3a Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 10 Jul 2022 00:54:03 +0700 Subject: [PATCH 08/26] close inner iterators in `.flatMap` on `.return` --- packages/core-js/internals/async-iterator-create-proxy.js | 7 +++++++ packages/core-js/internals/iterator-create-proxy.js | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 72f00ed26146..25705f4fb56e 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -10,6 +10,7 @@ var InternalStateModule = require('../internals/internal-state'); var getBuiltIn = require('../internals/get-built-in'); var getMethod = require('../internals/get-method'); var AsyncIteratorPrototype = require('../internals/async-iterator-prototype'); +var iteratorClose = require('../internals/iterator-close'); var Promise = getBuiltIn('Promise'); @@ -49,7 +50,13 @@ module.exports = function (nextHandler, IS_ITERATOR) { return new Promise(function (resolve, reject) { var state = getInternalState(that); var iterator = state.iterator; + var innerIterator = state.innerIterator; state.done = true; + if (innerIterator) try { + iteratorClose(innerIterator, 'return', value); + } catch (error) { + return iteratorClose(iterator, 'throw', error); + } var $$return = getMethod(iterator, 'return'); if ($$return === undefined) return resolve({ done: true, value: value }); Promise.resolve(call($$return, iterator, value)).then(function (result) { diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 2dca83b7406e..42ccfebbc568 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -8,6 +8,7 @@ var wellKnownSymbol = require('../internals/well-known-symbol'); var InternalStateModule = require('../internals/internal-state'); var getMethod = require('../internals/get-method'); var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; +var iteratorClose = require('../internals/iterator-close'); var ITERATOR_PROXY = 'IteratorProxy'; var setInternalState = InternalStateModule.set; @@ -35,7 +36,13 @@ module.exports = function (nextHandler, IS_ITERATOR) { 'return': function (value) { var state = getInternalState(this); var iterator = state.iterator; + var innerIterator = state.innerIterator; state.done = true; + if (innerIterator) try { + iteratorClose(innerIterator, 'return', value); + } catch (error) { + return iteratorClose(iterator, 'throw', error); + } var $$return = getMethod(iterator, 'return'); return { done: true, value: $$return ? anObject(call($$return, iterator, value)).value : value }; } From 98f0e559d5e2db2d91143c99b40da288763f699d Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 10 Jul 2022 02:36:19 +0700 Subject: [PATCH 09/26] avoid exposing `AsyncFromSyncIterator` in `Iterator.prototype.toAsync` --- packages/core-js/internals/async-from-sync-iterator.js | 10 ---------- packages/core-js/internals/async-iterator-wrap.js | 6 ++++++ packages/core-js/modules/esnext.async-iterator.from.js | 9 ++------- packages/core-js/modules/esnext.iterator.to-async.js | 4 +++- 4 files changed, 11 insertions(+), 18 deletions(-) create mode 100644 packages/core-js/internals/async-iterator-wrap.js diff --git a/packages/core-js/internals/async-from-sync-iterator.js b/packages/core-js/internals/async-from-sync-iterator.js index 79a19e068ae1..5fd7313d0b55 100644 --- a/packages/core-js/internals/async-from-sync-iterator.js +++ b/packages/core-js/internals/async-from-sync-iterator.js @@ -47,16 +47,6 @@ AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype), var result = anObject(apply($return, iterator, hasArg ? [arg] : [])); asyncFromSyncIteratorContinuation(result, resolve, reject); }); - }, - 'throw': function (arg) { - var iterator = getInternalState(this).iterator; - var hasArg = !!arguments.length; - return new Promise(function (resolve, reject) { - var $throw = getMethod(iterator, 'throw'); - if ($throw === undefined) return reject(arg); - var result = anObject(apply($throw, iterator, hasArg ? [arg] : [])); - asyncFromSyncIteratorContinuation(result, resolve, reject); - }); } }); diff --git a/packages/core-js/internals/async-iterator-wrap.js b/packages/core-js/internals/async-iterator-wrap.js new file mode 100644 index 000000000000..9580b5a10a2e --- /dev/null +++ b/packages/core-js/internals/async-iterator-wrap.js @@ -0,0 +1,6 @@ +var call = require('../internals/function-call'); +var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); + +module.exports = createAsyncIteratorProxy(function () { + return call(this.next, this.iterator); +}, true); diff --git a/packages/core-js/modules/esnext.async-iterator.from.js b/packages/core-js/modules/esnext.async-iterator.from.js index c34176747d07..bea7c28619d5 100644 --- a/packages/core-js/modules/esnext.async-iterator.from.js +++ b/packages/core-js/modules/esnext.async-iterator.from.js @@ -1,10 +1,8 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var call = require('../internals/function-call'); var toObject = require('../internals/to-object'); var isPrototypeOf = require('../internals/object-is-prototype-of'); var AsyncIteratorPrototype = require('../internals/async-iterator-prototype'); -var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var getAsyncIterator = require('../internals/get-async-iterator'); var getIterator = require('../internals/get-iterator'); var getIteratorDirect = require('../internals/get-iterator-direct'); @@ -12,13 +10,10 @@ var getIteratorMethod = require('../internals/get-iterator-method'); var getMethod = require('../internals/get-method'); var wellKnownSymbol = require('../internals/well-known-symbol'); var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator'); +var WrapAsyncIterator = require('../internals/async-iterator-wrap'); var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function () { - return call(this.next, this.iterator); -}, true); - $({ target: 'AsyncIterator', stat: true, forced: true }, { from: function from(O) { var object = toObject(O); @@ -32,6 +27,6 @@ $({ target: 'AsyncIterator', stat: true, forced: true }, { usingIterator = getIteratorMethod(object); if (usingIterator) iterator = new AsyncFromSyncIterator(getIterator(object, usingIterator)); } - return new AsyncIteratorProxy(getIteratorDirect(iterator !== undefined ? iterator : object)); + return new WrapAsyncIterator(getIteratorDirect(iterator !== undefined ? iterator : object)); } }); diff --git a/packages/core-js/modules/esnext.iterator.to-async.js b/packages/core-js/modules/esnext.iterator.to-async.js index 6dfb1b80c1ec..d3ccdcf396b2 100644 --- a/packages/core-js/modules/esnext.iterator.to-async.js +++ b/packages/core-js/modules/esnext.iterator.to-async.js @@ -2,9 +2,11 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator'); +var WrapAsyncIterator = require('../internals/async-iterator-wrap'); +var getIteratorDirect = require('../internals/get-iterator-direct'); $({ target: 'Iterator', proto: true, real: true, forced: true }, { toAsync: function toAsync() { - return new AsyncFromSyncIterator(this); + return new WrapAsyncIterator(getIteratorDirect(new AsyncFromSyncIterator(this))); } }); From 80f3f5593781ea2fa4d1b82834bbf9299c757100 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 10 Jul 2022 03:27:04 +0700 Subject: [PATCH 10/26] cleanup some more unnecessary cases passing of arguments --- .../core-js/internals/async-from-sync-iterator.js | 14 ++++++-------- .../internals/async-iterator-create-proxy.js | 10 +++++----- .../core-js/internals/iterator-create-proxy.js | 6 +++--- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/core-js/internals/async-from-sync-iterator.js b/packages/core-js/internals/async-from-sync-iterator.js index 5fd7313d0b55..b4070a9bba59 100644 --- a/packages/core-js/internals/async-from-sync-iterator.js +++ b/packages/core-js/internals/async-from-sync-iterator.js @@ -1,5 +1,5 @@ 'use strict'; -var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var create = require('../internals/object-create'); var getMethod = require('../internals/get-method'); @@ -30,21 +30,19 @@ var AsyncFromSyncIterator = function AsyncIterator(iterator) { }; AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype), { - next: function next(arg) { + next: function next() { var state = getInternalState(this); - var hasArg = !!arguments.length; return new Promise(function (resolve, reject) { - var result = anObject(apply(state.next, state.iterator, hasArg ? [arg] : [])); + var result = anObject(call(state.next, state.iterator)); asyncFromSyncIteratorContinuation(result, resolve, reject); }); }, - 'return': function (arg) { + 'return': function () { var iterator = getInternalState(this).iterator; - var hasArg = !!arguments.length; return new Promise(function (resolve, reject) { var $return = getMethod(iterator, 'return'); - if ($return === undefined) return resolve({ done: true, value: arg }); - var result = anObject(apply($return, iterator, hasArg ? [arg] : [])); + if ($return === undefined) return resolve({ done: true, value: undefined }); + var result = anObject(call($return, iterator)); asyncFromSyncIteratorContinuation(result, resolve, reject); }); } diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 25705f4fb56e..6a5a46f3ce00 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -45,7 +45,7 @@ module.exports = function (nextHandler, IS_ITERATOR) { error ? reject(value) : resolve(value); }); }, - 'return': function (value) { + 'return': function () { var that = this; return new Promise(function (resolve, reject) { var state = getInternalState(that); @@ -53,15 +53,15 @@ module.exports = function (nextHandler, IS_ITERATOR) { var innerIterator = state.innerIterator; state.done = true; if (innerIterator) try { - iteratorClose(innerIterator, 'return', value); + iteratorClose(innerIterator, 'return'); } catch (error) { return iteratorClose(iterator, 'throw', error); } var $$return = getMethod(iterator, 'return'); - if ($$return === undefined) return resolve({ done: true, value: value }); - Promise.resolve(call($$return, iterator, value)).then(function (result) { + if ($$return === undefined) return resolve({ done: true, value: undefined }); + Promise.resolve(call($$return, iterator)).then(function (result) { anObject(result); - resolve({ done: true, value: value }); + resolve({ done: true, value: undefined }); }, reject); }); } diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 42ccfebbc568..3ee14260e581 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -33,18 +33,18 @@ module.exports = function (nextHandler, IS_ITERATOR) { var result = state.done ? undefined : call(nextHandler, state); return { done: state.done, value: result }; }, - 'return': function (value) { + 'return': function () { var state = getInternalState(this); var iterator = state.iterator; var innerIterator = state.innerIterator; state.done = true; if (innerIterator) try { - iteratorClose(innerIterator, 'return', value); + iteratorClose(innerIterator, 'return'); } catch (error) { return iteratorClose(iterator, 'throw', error); } var $$return = getMethod(iterator, 'return'); - return { done: true, value: $$return ? anObject(call($$return, iterator, value)).value : value }; + return { done: true, value: $$return ? anObject(call($$return, iterator)).value : undefined }; } }); From 932e954a14081140fce39c744613d47cc7de2618 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 10 Jul 2022 21:32:10 +0700 Subject: [PATCH 11/26] use actual prototypes and tags for helpers / wrappers --- .../internals/async-iterator-create-proxy.js | 40 ++++++++++++------- .../internals/iterator-create-proxy.js | 40 ++++++++++++------- 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 6a5a46f3ce00..0917e8674ffc 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -20,23 +20,13 @@ var getInternalState = InternalStateModule.getterFor(ASYNC_ITERATOR_PROXY); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -module.exports = function (nextHandler, IS_ITERATOR) { - var AsyncIteratorProxy = function AsyncIterator(record, state) { - if (state) { - state.iterator = record.iterator; - state.next = record.next; - } else state = record; - state.type = ASYNC_ITERATOR_PROXY; - state.done = false; - setInternalState(this, state); - }; - - AsyncIteratorProxy.prototype = defineBuiltIns(create(AsyncIteratorPrototype), { +var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { + var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), { next: function next() { var that = this; var result = perform(function () { var state = getInternalState(that); - return state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise)); + return state.done ? { done: true, value: undefined } : anObject(state.nextHandler(Promise)); }); var error = result.error; var value = result.value; @@ -68,8 +58,30 @@ module.exports = function (nextHandler, IS_ITERATOR) { }); if (!IS_ITERATOR) { - createNonEnumerableProperty(AsyncIteratorProxy.prototype, TO_STRING_TAG, 'Generator'); + createNonEnumerableProperty(AsyncIteratorProxyPrototype, TO_STRING_TAG, 'Async Iterator Helper'); } + return AsyncIteratorProxyPrototype; +}; + +var AsyncIteratorHelperPrototype = createAsyncIteratorProxyPrototype(false); +var WrapForValidAsyncIteratorPrototype = createAsyncIteratorProxyPrototype(true); + +module.exports = function (nextHandler, IS_ITERATOR) { + var AsyncIteratorProxy = function AsyncIterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = ASYNC_ITERATOR_PROXY; + state.nextHandler = nextHandler; + state.done = false; + setInternalState(this, state); + }; + + AsyncIteratorProxy.prototype = IS_ITERATOR + ? WrapForValidAsyncIteratorPrototype + : AsyncIteratorHelperPrototype; + return AsyncIteratorProxy; }; diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 3ee14260e581..0eade878bdcc 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -16,21 +16,11 @@ var getInternalState = InternalStateModule.getterFor(ITERATOR_PROXY); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -module.exports = function (nextHandler, IS_ITERATOR) { - var IteratorProxy = function Iterator(record, state) { - if (state) { - state.iterator = record.iterator; - state.next = record.next; - } else state = record; - state.type = ITERATOR_PROXY; - state.done = false; - setInternalState(this, state); - }; - - IteratorProxy.prototype = defineBuiltIns(create(IteratorPrototype), { +var createIteratorProxyPrototype = function (IS_ITERATOR) { + var IteratorProxyPrototype = defineBuiltIns(create(IteratorPrototype), { next: function next() { var state = getInternalState(this); - var result = state.done ? undefined : call(nextHandler, state); + var result = state.done ? undefined : state.nextHandler(); return { done: state.done, value: result }; }, 'return': function () { @@ -49,8 +39,30 @@ module.exports = function (nextHandler, IS_ITERATOR) { }); if (!IS_ITERATOR) { - createNonEnumerableProperty(IteratorProxy.prototype, TO_STRING_TAG, 'Generator'); + createNonEnumerableProperty(IteratorProxyPrototype, TO_STRING_TAG, 'Iterator Helper'); } + return IteratorProxyPrototype; +}; + +var IteratorHelperPrototype = createIteratorProxyPrototype(false); +var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); + +module.exports = function (nextHandler, IS_ITERATOR) { + var IteratorProxy = function Iterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = ITERATOR_PROXY; + state.nextHandler = nextHandler; + state.done = false; + setInternalState(this, state); + }; + + IteratorProxy.prototype = IS_ITERATOR + ? WrapForValidIteratorPrototype + : IteratorHelperPrototype; + return IteratorProxy; }; From a528f753208f074c584266c9a0dc7eebfe5b8bee Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Mon, 11 Jul 2022 11:50:04 +0700 Subject: [PATCH 12/26] make helpers and wrappers `.next` and `.return` incompatible between different prototypes --- .../internals/async-iterator-create-proxy.js | 14 +++++++++----- .../core-js/internals/iterator-create-proxy.js | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 0917e8674ffc..93be90d10edb 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -14,13 +14,17 @@ var iteratorClose = require('../internals/iterator-close'); var Promise = getBuiltIn('Promise'); -var ASYNC_ITERATOR_PROXY = 'AsyncIteratorProxy'; +var ASYNC_ITERATOR_HELPER = 'AsyncIteratorHelper'; +var WRAP_FOR_VALID_ASYNC_ITERATOR = 'WrapForValidAsyncIterator'; var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ASYNC_ITERATOR_PROXY); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { + var ASYNC_ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER; + + var getInternalState = InternalStateModule.getterFor(ASYNC_ITERATOR_PROXY); + var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), { next: function next() { var that = this; @@ -68,6 +72,8 @@ var AsyncIteratorHelperPrototype = createAsyncIteratorProxyPrototype(false); var WrapForValidAsyncIteratorPrototype = createAsyncIteratorProxyPrototype(true); module.exports = function (nextHandler, IS_ITERATOR) { + var ASYNC_ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER; + var AsyncIteratorProxy = function AsyncIterator(record, state) { if (state) { state.iterator = record.iterator; @@ -79,9 +85,7 @@ module.exports = function (nextHandler, IS_ITERATOR) { setInternalState(this, state); }; - AsyncIteratorProxy.prototype = IS_ITERATOR - ? WrapForValidAsyncIteratorPrototype - : AsyncIteratorHelperPrototype; + AsyncIteratorProxy.prototype = IS_ITERATOR ? WrapForValidAsyncIteratorPrototype : AsyncIteratorHelperPrototype; return AsyncIteratorProxy; }; diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 0eade878bdcc..2c5036e7547a 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -10,13 +10,17 @@ var getMethod = require('../internals/get-method'); var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; var iteratorClose = require('../internals/iterator-close'); -var ITERATOR_PROXY = 'IteratorProxy'; +var ITERATOR_HELPER = 'IteratorHelper'; +var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ITERATOR_PROXY); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var createIteratorProxyPrototype = function (IS_ITERATOR) { + var ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + + var getInternalState = InternalStateModule.getterFor(ITERATOR_PROXY); + var IteratorProxyPrototype = defineBuiltIns(create(IteratorPrototype), { next: function next() { var state = getInternalState(this); @@ -49,6 +53,8 @@ var IteratorHelperPrototype = createIteratorProxyPrototype(false); var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); module.exports = function (nextHandler, IS_ITERATOR) { + var ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + var IteratorProxy = function Iterator(record, state) { if (state) { state.iterator = record.iterator; @@ -60,9 +66,7 @@ module.exports = function (nextHandler, IS_ITERATOR) { setInternalState(this, state); }; - IteratorProxy.prototype = IS_ITERATOR - ? WrapForValidIteratorPrototype - : IteratorHelperPrototype; + IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; return IteratorProxy; }; From da06219f54acebd7fec1d99bcb2341056e98e68a Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Mon, 11 Jul 2022 23:55:34 +0700 Subject: [PATCH 13/26] update the changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f074fc1271c7..f9842e1722a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ ## Changelog ##### Unreleased +- Recent updates of the [iterator helpers proposal](https://github.com/tc39/proposal-iterator-helpers), [#1101](https://github.com/zloirock/core-js/issues/1101): + - `.asIndexedPairs` renamed to `.indexed`, [proposal-iterator-helpers/183](https://github.com/tc39/proposal-iterator-helpers/pull/183): + - `Iterator.prototype.asIndexedPairs` -> `Iterator.prototype.indexed` + - `AsyncIterator.prototype.asIndexedPairs` -> `AsyncIterator.prototype.indexed` + - Avoid exposing spec fiction `%AsyncFromSyncIteratorPrototype%` in `AsyncIterator.from` (and in `Iterator.prototype.toAsync`), [proposal-iterator-helpers/182](https://github.com/tc39/proposal-iterator-helpers/pull/182) + - Avoid unnecessary promise creation in `%WrapForValidAsyncIteratorPrototype%.next`, [proposal-iterator-helpers/197](https://github.com/tc39/proposal-iterator-helpers/pull/197) + - Do not forward the parameter of `.next` / `.return` to an underlying iterator by the extended iterator protocol, a part of [proposal-iterator-helpers/194](https://github.com/tc39/proposal-iterator-helpers/pull/194) + - `.throw` methods removed from all wrappers / helpers prototypes, a part of [proposal-iterator-helpers/194](https://github.com/tc39/proposal-iterator-helpers/pull/194) + - Close inner iterators in `{ Iterator, AsyncIterator }.prototype.flatMap` on `.return`, [proposal-iterator-helpers/195](https://github.com/tc39/proposal-iterator-helpers/pull/195) + - Throw `RangeError` on `NaN` in `{ Iterator, AsyncIterator }.prototype.{ drop, take }`, [proposal-iterator-helpers/181](https://github.com/tc39/proposal-iterator-helpers/pull/181) + - Some other minor updates of this proposal - Polyfill `Promise` with `unhandledrejection` event support (browser style) in Deno < [1.24](https://github.com/denoland/deno/releases/tag/v1.24.0) - Added compat data for Bun, [#1103](https://github.com/zloirock/core-js/issues/1103) - Added compat data for Hermes, [#1099](https://github.com/zloirock/core-js/issues/1099) From 9a4125292154161bac9fe14724a2e2cb33ba515c Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 12 Jul 2022 13:37:09 +0700 Subject: [PATCH 14/26] fix some cases of async iteration closing --- .../core-js/internals/async-iterator-close.js | 18 ++++++++ .../internals/async-iterator-iteration.js | 41 +++++++------------ .../modules/esnext.async-iterator.filter.js | 18 +++++--- .../modules/esnext.async-iterator.map.js | 27 ++++++++---- .../modules/esnext.async-iterator.reduce.js | 13 ++++-- 5 files changed, 73 insertions(+), 44 deletions(-) create mode 100644 packages/core-js/internals/async-iterator-close.js diff --git a/packages/core-js/internals/async-iterator-close.js b/packages/core-js/internals/async-iterator-close.js new file mode 100644 index 000000000000..d18871d8a479 --- /dev/null +++ b/packages/core-js/internals/async-iterator-close.js @@ -0,0 +1,18 @@ +var call = require('../internals/function-call'); +var getBuiltIn = require('../internals/get-built-in'); +var getMethod = require('../internals/get-method'); + +module.exports = function (iterator, method, argument, reject) { + try { + var returnMethod = getMethod(iterator, 'return'); + if (returnMethod) { + return getBuiltIn('Promise').resolve(call(returnMethod, iterator)).then(function () { + method(argument); + }, function (error) { + reject(error); + }); + } + } catch (error2) { + return reject(error2); + } method(argument); +}; diff --git a/packages/core-js/internals/async-iterator-iteration.js b/packages/core-js/internals/async-iterator-iteration.js index d010dbadda69..108836a0ff0e 100644 --- a/packages/core-js/internals/async-iterator-iteration.js +++ b/packages/core-js/internals/async-iterator-iteration.js @@ -7,7 +7,7 @@ var anObject = require('../internals/an-object'); var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer'); var getBuiltIn = require('../internals/get-built-in'); var getIteratorDirect = require('../internals/get-iterator-direct'); -var getMethod = require('../internals/get-method'); +var closeAsyncIteration = require('../internals/async-iterator-close'); var createMethod = function (TYPE) { var IS_TO_ARRAY = TYPE == 0; @@ -24,28 +24,15 @@ var createMethod = function (TYPE) { if (MAPPING || !IS_TO_ARRAY) aCallable(fn); return new Promise(function (resolve, reject) { - var closeIteration = function (method, argument) { - try { - var returnMethod = getMethod(iterator, 'return'); - if (returnMethod) { - return Promise.resolve(call(returnMethod, iterator)).then(function () { - method(argument); - }, function (error) { - reject(error); - }); - } - } catch (error2) { - return reject(error2); - } method(argument); - }; - - var onError = function (error) { - closeIteration(reject, error); + var ifAbruptCloseAsyncIterator = function (error) { + closeAsyncIteration(iterator, reject, error, reject); }; var loop = function () { try { - if (IS_TO_ARRAY && MAPPING) doesNotExceedSafeInteger(index); + if (IS_TO_ARRAY && MAPPING) try { + doesNotExceedSafeInteger(index); + } catch (error4) { ifAbruptCloseAsyncIterator(error4); } Promise.resolve(anObject(call(next, iterator))).then(function (step) { try { if (anObject(step).done) { @@ -53,29 +40,29 @@ var createMethod = function (TYPE) { target.length = index; resolve(target); } else resolve(IS_SOME ? false : IS_EVERY || undefined); - } else { + } else try { var value = step.value; if (MAPPING) { Promise.resolve(IS_TO_ARRAY ? fn(value, index) : fn(value)).then(function (result) { if (IS_FOR_EACH) { loop(); } else if (IS_EVERY) { - result ? loop() : closeIteration(resolve, false); + result ? loop() : closeAsyncIteration(iterator, resolve, false, reject); } else if (IS_TO_ARRAY) { target[index++] = result; loop(); } else { - result ? closeIteration(resolve, IS_SOME || value) : loop(); + result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop(); } - }, onError); + }, ifAbruptCloseAsyncIterator); } else { target[index++] = value; loop(); } - } - } catch (error) { onError(error); } - }, onError); - } catch (error2) { onError(error2); } + } catch (error3) { ifAbruptCloseAsyncIterator(error3); } + } catch (error2) { reject(error2); } + }, reject); + } catch (error) { reject(error); } }; loop(); diff --git a/packages/core-js/modules/esnext.async-iterator.filter.js b/packages/core-js/modules/esnext.async-iterator.filter.js index 94f83bb38900..aaf2572bd170 100644 --- a/packages/core-js/modules/esnext.async-iterator.filter.js +++ b/packages/core-js/modules/esnext.async-iterator.filter.js @@ -6,26 +6,34 @@ var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); +var closeAsyncIteration = require('../internals/async-iterator-close'); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; + var iterator = state.iterator; var filterer = state.filterer; return new Promise(function (resolve, reject) { + var ifAbruptCloseAsyncIterator = function (error) { + closeAsyncIteration(iterator, reject, error, reject); + }; + var loop = function () { try { - Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { + Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { try { if (anObject(step).done) { state.done = true; resolve({ done: true, value: undefined }); } else { var value = step.value; - Promise.resolve(filterer(value)).then(function (selected) { - selected ? resolve({ done: false, value: value }) : loop(); - }, reject); + try { + Promise.resolve(filterer(value)).then(function (selected) { + selected ? resolve({ done: false, value: value }) : loop(); + }, ifAbruptCloseAsyncIterator); + } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } - } catch (err) { reject(err); } + } catch (error2) { reject(error2); } }, reject); } catch (error) { reject(error); } }; diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index fdcd7d790b27..0b3c3a006eb7 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -6,19 +6,30 @@ var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); +var closeAsyncIteration = require('../internals/async-iterator-close'); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; + var iterator = state.iterator; var mapper = state.mapper; - return Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { - if (anObject(step).done) { - state.done = true; - return { done: true, value: undefined }; - } - return Promise.resolve(mapper(step.value)).then(function (value) { - return { done: false, value: value }; - }); + return new Promise(function (resolve, reject) { + var ifAbruptCloseAsyncIterator = function (error) { + closeAsyncIteration(iterator, reject, error, reject); + }; + + Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { + try { + if (anObject(step).done) { + state.done = true; + resolve({ done: true, value: undefined }); + } else try { + Promise.resolve(mapper(step.value)).then(function (value) { + resolve({ done: false, value: value }); + }, ifAbruptCloseAsyncIterator); + } catch (error2) { ifAbruptCloseAsyncIterator(error2); } + } catch (error) { reject(error); } + }, reject); }); }); diff --git a/packages/core-js/modules/esnext.async-iterator.reduce.js b/packages/core-js/modules/esnext.async-iterator.reduce.js index 7066f2feb158..528498359c92 100644 --- a/packages/core-js/modules/esnext.async-iterator.reduce.js +++ b/packages/core-js/modules/esnext.async-iterator.reduce.js @@ -6,6 +6,7 @@ var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); var getBuiltIn = require('../internals/get-built-in'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var closeAsyncIteration = require('../internals/async-iterator-close'); var Promise = getBuiltIn('Promise'); var $TypeError = TypeError; @@ -20,6 +21,10 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { aCallable(reducer); return new Promise(function (resolve, reject) { + var ifAbruptCloseAsyncIterator = function (error) { + closeAsyncIteration(iterator, reject, error, reject); + }; + var loop = function () { try { Promise.resolve(anObject(call(next, iterator))).then(function (step) { @@ -32,14 +37,14 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { noInitial = false; accumulator = value; loop(); - } else { + } else try { Promise.resolve(reducer(accumulator, value)).then(function (result) { accumulator = result; loop(); - }, reject); - } + }, ifAbruptCloseAsyncIterator); + } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } - } catch (err) { reject(err); } + } catch (error2) { reject(error2); } }, reject); } catch (error) { reject(error); } }; From a0c110a5173e869b7631145218dd57b7719be5a0 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 12 Jul 2022 18:48:00 +0700 Subject: [PATCH 15/26] fix some more cases of async iteration closing --- .../internals/async-iterator-iteration.js | 44 ++++++++++--------- .../modules/esnext.async-iterator.flat-map.js | 33 +++++++++----- .../modules/esnext.async-iterator.map.js | 13 +++--- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/packages/core-js/internals/async-iterator-iteration.js b/packages/core-js/internals/async-iterator-iteration.js index 108836a0ff0e..081369db7400 100644 --- a/packages/core-js/internals/async-iterator-iteration.js +++ b/packages/core-js/internals/async-iterator-iteration.js @@ -32,7 +32,7 @@ var createMethod = function (TYPE) { try { if (IS_TO_ARRAY && MAPPING) try { doesNotExceedSafeInteger(index); - } catch (error4) { ifAbruptCloseAsyncIterator(error4); } + } catch (error5) { ifAbruptCloseAsyncIterator(error5); } Promise.resolve(anObject(call(next, iterator))).then(function (step) { try { if (anObject(step).done) { @@ -40,26 +40,30 @@ var createMethod = function (TYPE) { target.length = index; resolve(target); } else resolve(IS_SOME ? false : IS_EVERY || undefined); - } else try { + } else { var value = step.value; - if (MAPPING) { - Promise.resolve(IS_TO_ARRAY ? fn(value, index) : fn(value)).then(function (result) { - if (IS_FOR_EACH) { - loop(); - } else if (IS_EVERY) { - result ? loop() : closeAsyncIteration(iterator, resolve, false, reject); - } else if (IS_TO_ARRAY) { - target[index++] = result; - loop(); - } else { - result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop(); - } - }, ifAbruptCloseAsyncIterator); - } else { - target[index++] = value; - loop(); - } - } catch (error3) { ifAbruptCloseAsyncIterator(error3); } + try { + if (MAPPING) { + Promise.resolve(IS_TO_ARRAY ? fn(value, index) : fn(value)).then(function (result) { + if (IS_FOR_EACH) { + loop(); + } else if (IS_EVERY) { + result ? loop() : closeAsyncIteration(iterator, resolve, false, reject); + } else if (IS_TO_ARRAY) { + try { + target[index++] = result; + loop(); + } catch (error4) { ifAbruptCloseAsyncIterator(error4); } + } else { + result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop(); + } + }, ifAbruptCloseAsyncIterator); + } else { + target[index++] = value; + loop(); + } + } catch (error3) { ifAbruptCloseAsyncIterator(error3); } + } } catch (error2) { reject(error2); } }, reject); } catch (error) { reject(error); } diff --git a/packages/core-js/modules/esnext.async-iterator.flat-map.js b/packages/core-js/modules/esnext.async-iterator.flat-map.js index ad802137d762..b8006ff72e07 100644 --- a/packages/core-js/modules/esnext.async-iterator.flat-map.js +++ b/packages/core-js/modules/esnext.async-iterator.flat-map.js @@ -7,30 +7,39 @@ var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var getAsyncIterator = require('../internals/get-async-iterator'); +var closeAsyncIteration = require('../internals/async-iterator-close'); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; + var iterator = state.iterator; var mapper = state.mapper; var innerIterator; return new Promise(function (resolve, reject) { + var ifAbruptCloseAsyncIterator = function (error) { + closeAsyncIteration(iterator, reject, error, reject); + }; + var outerLoop = function () { try { - Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { + Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { try { if (anObject(step).done) { state.done = true; resolve({ done: true, value: undefined }); } else { - Promise.resolve(mapper(step.value)).then(function (mapped) { - try { - state.innerIterator = innerIterator = getAsyncIterator(mapped); - state.innerNext = aCallable(innerIterator.next); - return innerLoop(); - } catch (error2) { reject(error2); } - }, reject); + var value = step.value; + try { + Promise.resolve(mapper(value)).then(function (mapped) { + try { + state.innerIterator = innerIterator = getAsyncIterator(mapped); + state.innerNext = aCallable(innerIterator.next); + innerLoop(); + } catch (error4) { ifAbruptCloseAsyncIterator(error4); } + }, ifAbruptCloseAsyncIterator); + } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } - } catch (error1) { reject(error1); } + } catch (error2) { reject(error2); } }, reject); } catch (error) { reject(error); } }; @@ -44,9 +53,9 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { state.innerIterator = state.innerNext = null; outerLoop(); } else resolve({ done: false, value: result.value }); - } catch (error1) { reject(error1); } - }, reject); - } catch (error) { reject(error); } + } catch (error1) { ifAbruptCloseAsyncIterator(error1); } + }, ifAbruptCloseAsyncIterator); + } catch (error) { ifAbruptCloseAsyncIterator(error); } } else outerLoop(); }; diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index 0b3c3a006eb7..a376e2e81519 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -23,11 +23,14 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { if (anObject(step).done) { state.done = true; resolve({ done: true, value: undefined }); - } else try { - Promise.resolve(mapper(step.value)).then(function (value) { - resolve({ done: false, value: value }); - }, ifAbruptCloseAsyncIterator); - } catch (error2) { ifAbruptCloseAsyncIterator(error2); } + } else { + var value = step.value; + try { + Promise.resolve(mapper(value)).then(function (mapped) { + resolve({ done: false, value: mapped }); + }, ifAbruptCloseAsyncIterator); + } catch (error2) { ifAbruptCloseAsyncIterator(error2); } + } } catch (error) { reject(error); } }, reject); }); From 0cebba562572469fbb0abf8e74ed710bf55969a5 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 12 Jul 2022 21:39:13 +0700 Subject: [PATCH 16/26] fix one more cases of iteration closing --- .../modules/esnext.async-iterator.drop.js | 4 +--- .../modules/esnext.iterator.flat-map.js | 20 +++++++++---------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/core-js/modules/esnext.async-iterator.drop.js b/packages/core-js/modules/esnext.async-iterator.drop.js index 3839e7958e3d..4c2ca7ba5d7d 100644 --- a/packages/core-js/modules/esnext.async-iterator.drop.js +++ b/packages/core-js/modules/esnext.async-iterator.drop.js @@ -14,9 +14,7 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { return new Promise(function (resolve, reject) { var loop = function () { try { - Promise.resolve( - anObject(call(state.next, state.iterator)) - ).then(function (step) { + Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { try { if (anObject(step).done) { state.done = true; diff --git a/packages/core-js/modules/esnext.iterator.flat-map.js b/packages/core-js/modules/esnext.iterator.flat-map.js index 56b1fe1bc658..e30abcc4a142 100644 --- a/packages/core-js/modules/esnext.iterator.flat-map.js +++ b/packages/core-js/modules/esnext.iterator.flat-map.js @@ -17,17 +17,17 @@ var IteratorProxy = createIteratorProxy(function () { var result, mapped, iteratorMethod, innerIterator; while (true) { - try { - if (innerIterator = this.innerIterator) { - result = anObject(call(this.innerNext, innerIterator)); - if (!result.done) return result.value; - this.innerIterator = this.innerNext = null; - } + if (innerIterator = this.innerIterator) try { + result = anObject(call(this.innerNext, innerIterator)); + if (!result.done) return result.value; + this.innerIterator = this.innerNext = null; + } catch (error) { iteratorClose(iterator, 'throw', error); } - result = anObject(call(this.next, iterator)); + result = anObject(call(this.next, iterator)); - if (this.done = !!result.done) return; + if (this.done = !!result.done) return; + try { mapped = mapper(result.value); iteratorMethod = getIteratorMethod(mapped); @@ -37,9 +37,7 @@ var IteratorProxy = createIteratorProxy(function () { this.innerIterator = innerIterator = anObject(call(iteratorMethod, mapped)); this.innerNext = aCallable(innerIterator.next); - } catch (error) { - iteratorClose(iterator, 'throw', error); - } + } catch (error) { iteratorClose(iterator, 'throw', error); } } }); From f237c4c461f668f05651feb2db1d6622d97fd70f Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 00:30:55 +0700 Subject: [PATCH 17/26] call `.next` on inner iterators of done iterator *wrappers* --- packages/core-js/internals/async-iterator-create-proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 93be90d10edb..3b4867d6a7c0 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -30,7 +30,7 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { var that = this; var result = perform(function () { var state = getInternalState(that); - return state.done ? { done: true, value: undefined } : anObject(state.nextHandler(Promise)); + return (IS_ITERATOR && state.done) ? { done: true, value: undefined } : anObject(state.nextHandler(Promise)); }); var error = result.error; var value = result.value; From 59682b957739c6d8247327132c8f87450c8e6a4d Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 01:52:44 +0700 Subject: [PATCH 18/26] do not validate value in `%WrapForValidIteratorPrototype%.next` --- CHANGELOG.md | 1 + packages/core-js/internals/iterator-create-proxy.js | 4 ++++ packages/core-js/modules/esnext.iterator.from.js | 5 +---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9842e1722a1..522d5da8dfce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - `AsyncIterator.prototype.asIndexedPairs` -> `AsyncIterator.prototype.indexed` - Avoid exposing spec fiction `%AsyncFromSyncIteratorPrototype%` in `AsyncIterator.from` (and in `Iterator.prototype.toAsync`), [proposal-iterator-helpers/182](https://github.com/tc39/proposal-iterator-helpers/pull/182) - Avoid unnecessary promise creation in `%WrapForValidAsyncIteratorPrototype%.next`, [proposal-iterator-helpers/197](https://github.com/tc39/proposal-iterator-helpers/pull/197) + - Do not validate value in `%WrapForValid(Async)IteratorPrototype%.next`, [proposal-iterator-helpers/197](https://github.com/tc39/proposal-iterator-helpers/pull/197) and [proposal-iterator-helpers/205](https://github.com/tc39/proposal-iterator-helpers/pull/205) - Do not forward the parameter of `.next` / `.return` to an underlying iterator by the extended iterator protocol, a part of [proposal-iterator-helpers/194](https://github.com/tc39/proposal-iterator-helpers/pull/194) - `.throw` methods removed from all wrappers / helpers prototypes, a part of [proposal-iterator-helpers/194](https://github.com/tc39/proposal-iterator-helpers/pull/194) - Close inner iterators in `{ Iterator, AsyncIterator }.prototype.flatMap` on `.return`, [proposal-iterator-helpers/195](https://github.com/tc39/proposal-iterator-helpers/pull/195) diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 2c5036e7547a..7b97c2345841 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -24,6 +24,10 @@ var createIteratorProxyPrototype = function (IS_ITERATOR) { var IteratorProxyPrototype = defineBuiltIns(create(IteratorPrototype), { next: function next() { var state = getInternalState(this); + // for simplification: + // for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject` + // for `%IteratorHelperPrototype%.next` - just a value + if (IS_ITERATOR) return state.nextHandler(); var result = state.done ? undefined : state.nextHandler(); return { done: state.done, value: result }; }, diff --git a/packages/core-js/modules/esnext.iterator.from.js b/packages/core-js/modules/esnext.iterator.from.js index 610f8f7abe4f..17a25ab1ec84 100644 --- a/packages/core-js/modules/esnext.iterator.from.js +++ b/packages/core-js/modules/esnext.iterator.from.js @@ -1,7 +1,6 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); var toObject = require('../internals/to-object'); var isPrototypeOf = require('../internals/object-is-prototype-of'); var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; @@ -11,9 +10,7 @@ var getIteratorDirect = require('../internals/get-iterator-direct'); var getIteratorMethod = require('../internals/get-iterator-method'); var IteratorProxy = createIteratorProxy(function () { - var result = anObject(call(this.next, this.iterator)); - var done = this.done = !!result.done; - if (!done) return result.value; + return call(this.next, this.iterator); }, true); $({ target: 'Iterator', stat: true, forced: true }, { From a4d11b24a2328c854272466fd1eed2a432a47c36 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 02:03:52 +0700 Subject: [PATCH 19/26] mark generators-wrappers as done on error in `.next` --- packages/core-js/internals/iterator-create-proxy.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 7b97c2345841..d85fe1bb3a50 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -28,8 +28,13 @@ var createIteratorProxyPrototype = function (IS_ITERATOR) { // for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject` // for `%IteratorHelperPrototype%.next` - just a value if (IS_ITERATOR) return state.nextHandler(); - var result = state.done ? undefined : state.nextHandler(); - return { done: state.done, value: result }; + try { + var result = state.done ? undefined : state.nextHandler(); + return { done: state.done, value: result }; + } catch (error) { + state.done = true; + throw error; + } }, 'return': function () { var state = getInternalState(this); From f03ec273121917fcf09bdc99ac9fc82f339ec7a5 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 05:01:47 +0700 Subject: [PATCH 20/26] mark async generators-wrappers as done on error in `.next` --- .../internals/async-iterator-create-proxy.js | 8 +++-- .../internals/async-iterator-indexed.js | 9 +++++- .../modules/esnext.async-iterator.drop.js | 11 +++++-- .../modules/esnext.async-iterator.filter.js | 13 ++++++--- .../modules/esnext.async-iterator.flat-map.js | 13 ++++++--- .../modules/esnext.async-iterator.map.js | 11 +++++-- .../modules/esnext.async-iterator.take.js | 29 ++++++++++++++----- 7 files changed, 70 insertions(+), 24 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 3b4867d6a7c0..2633e85ce19e 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -28,15 +28,19 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), { next: function next() { var that = this; + var state; var result = perform(function () { - var state = getInternalState(that); + state = getInternalState(that); return (IS_ITERATOR && state.done) ? { done: true, value: undefined } : anObject(state.nextHandler(Promise)); }); var error = result.error; var value = result.value; if (IS_ITERATOR) return error ? Promise.reject(value) : Promise.resolve(value); return new Promise(function (resolve, reject) { - error ? reject(value) : resolve(value); + if (error) { + if (state) state.done = true; + reject(value); + } else resolve(value); }); }, 'return': function () { diff --git a/packages/core-js/internals/async-iterator-indexed.js b/packages/core-js/internals/async-iterator-indexed.js index 948f00cda049..e9200f7f4408 100644 --- a/packages/core-js/internals/async-iterator-indexed.js +++ b/packages/core-js/internals/async-iterator-indexed.js @@ -9,13 +9,20 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; var iterator = state.iterator; + var doneAndReThrow = function (error) { + state.done = true; + throw error; + }; + return Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { if (anObject(step).done) { state.done = true; return { done: true, value: undefined }; } return { done: false, value: [state.index++, step.value] }; - }); + }, doneAndReThrow).then(function (result) { + return result; + }, doneAndReThrow); }); module.exports = function indexed() { diff --git a/packages/core-js/modules/esnext.async-iterator.drop.js b/packages/core-js/modules/esnext.async-iterator.drop.js index 4c2ca7ba5d7d..1ed0a4ea08e1 100644 --- a/packages/core-js/modules/esnext.async-iterator.drop.js +++ b/packages/core-js/modules/esnext.async-iterator.drop.js @@ -12,6 +12,11 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; return new Promise(function (resolve, reject) { + var doneAndReject = function (error) { + state.done = true; + reject(error); + }; + var loop = function () { try { Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) { @@ -23,9 +28,9 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { state.remaining--; loop(); } else resolve({ done: false, value: step.value }); - } catch (err) { reject(err); } - }, reject); - } catch (error) { reject(error); } + } catch (err) { doneAndReject(err); } + }, doneAndReject); + } catch (error) { doneAndReject(error); } }; loop(); diff --git a/packages/core-js/modules/esnext.async-iterator.filter.js b/packages/core-js/modules/esnext.async-iterator.filter.js index aaf2572bd170..7ba993d02bbe 100644 --- a/packages/core-js/modules/esnext.async-iterator.filter.js +++ b/packages/core-js/modules/esnext.async-iterator.filter.js @@ -14,8 +14,13 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var filterer = state.filterer; return new Promise(function (resolve, reject) { + var doneAndReject = function (error) { + state.done = true; + reject(error); + }; + var ifAbruptCloseAsyncIterator = function (error) { - closeAsyncIteration(iterator, reject, error, reject); + closeAsyncIteration(iterator, doneAndReject, error, doneAndReject); }; var loop = function () { @@ -33,9 +38,9 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { }, ifAbruptCloseAsyncIterator); } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } - } catch (error2) { reject(error2); } - }, reject); - } catch (error) { reject(error); } + } catch (error2) { doneAndReject(error2); } + }, doneAndReject); + } catch (error) { doneAndReject(error); } }; loop(); diff --git a/packages/core-js/modules/esnext.async-iterator.flat-map.js b/packages/core-js/modules/esnext.async-iterator.flat-map.js index b8006ff72e07..dd70ef17d474 100644 --- a/packages/core-js/modules/esnext.async-iterator.flat-map.js +++ b/packages/core-js/modules/esnext.async-iterator.flat-map.js @@ -16,8 +16,13 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var innerIterator; return new Promise(function (resolve, reject) { + var doneAndReject = function (error) { + state.done = true; + reject(error); + }; + var ifAbruptCloseAsyncIterator = function (error) { - closeAsyncIteration(iterator, reject, error, reject); + closeAsyncIteration(iterator, doneAndReject, error, doneAndReject); }; var outerLoop = function () { @@ -39,9 +44,9 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { }, ifAbruptCloseAsyncIterator); } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } - } catch (error2) { reject(error2); } - }, reject); - } catch (error) { reject(error); } + } catch (error2) { doneAndReject(error2); } + }, doneAndReject); + } catch (error) { doneAndReject(error); } }; var innerLoop = function () { diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index a376e2e81519..76f9334bab3f 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -14,8 +14,13 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var mapper = state.mapper; return new Promise(function (resolve, reject) { + var doneAndReject = function (error) { + state.done = true; + reject(error); + }; + var ifAbruptCloseAsyncIterator = function (error) { - closeAsyncIteration(iterator, reject, error, reject); + closeAsyncIteration(iterator, doneAndReject, error, doneAndReject); }; Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { @@ -31,8 +36,8 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { }, ifAbruptCloseAsyncIterator); } catch (error2) { ifAbruptCloseAsyncIterator(error2); } } - } catch (error) { reject(error); } - }, reject); + } catch (error) { doneAndReject(error); } + }, doneAndReject); }); }); diff --git a/packages/core-js/modules/esnext.async-iterator.take.js b/packages/core-js/modules/esnext.async-iterator.take.js index bb9d9bb6ccf7..cca5e898234d 100644 --- a/packages/core-js/modules/esnext.async-iterator.take.js +++ b/packages/core-js/modules/esnext.async-iterator.take.js @@ -2,25 +2,40 @@ // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); var call = require('../internals/function-call'); +var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { - var iterator = this.iterator; - var returnMethod, result; - if (!this.remaining--) { - result = { done: true, value: undefined }; - this.done = true; + var state = this; + var iterator = state.iterator; + var returnMethod; + + var doneAndReThrow = function (error) { + state.done = true; + throw error; + }; + + if (!state.remaining--) { + var resultDone = { done: true, value: undefined }; + state.done = true; returnMethod = iterator['return']; if (returnMethod !== undefined) { return Promise.resolve(call(returnMethod, iterator, undefined)).then(function () { - return result; + return resultDone; }); } + return resultDone; + } return Promise.resolve(call(state.next, iterator)).then(function (step) { + if (anObject(step).done) { + state.done = true; + return { done: true, value: undefined }; + } return { done: false, value: step.value }; + }, doneAndReThrow).then(function (result) { return result; - } return call(this.next, iterator); + }, doneAndReThrow); }); $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { From c9ee9fb1d348e41f913a19a1642081d23fc38e94 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 05:41:08 +0700 Subject: [PATCH 21/26] avoid extra tick in `%AsyncIteratorHelper%` --- .../core-js/internals/async-iterator-create-proxy.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 2633e85ce19e..fe2095d37e80 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -35,13 +35,8 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { }); var error = result.error; var value = result.value; - if (IS_ITERATOR) return error ? Promise.reject(value) : Promise.resolve(value); - return new Promise(function (resolve, reject) { - if (error) { - if (state) state.done = true; - reject(value); - } else resolve(value); - }); + if (error && state) state.done = true; + return error ? Promise.reject(value) : Promise.resolve(value); }, 'return': function () { var that = this; From 5b51af9c22d7b274dcf96f7bcb7feeea18cc8ad4 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 06:08:43 +0700 Subject: [PATCH 22/26] avoid an extra promise --- packages/core-js/internals/async-iterator-indexed.js | 12 ++++-------- .../core-js/modules/esnext.async-iterator.take.js | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/packages/core-js/internals/async-iterator-indexed.js b/packages/core-js/internals/async-iterator-indexed.js index e9200f7f4408..76deb459d4eb 100644 --- a/packages/core-js/internals/async-iterator-indexed.js +++ b/packages/core-js/internals/async-iterator-indexed.js @@ -9,20 +9,16 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var state = this; var iterator = state.iterator; - var doneAndReThrow = function (error) { - state.done = true; - throw error; - }; - return Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { if (anObject(step).done) { state.done = true; return { done: true, value: undefined }; } return { done: false, value: [state.index++, step.value] }; - }, doneAndReThrow).then(function (result) { - return result; - }, doneAndReThrow); + }).then(null, function (error) { + state.done = true; + throw error; + }); }); module.exports = function indexed() { diff --git a/packages/core-js/modules/esnext.async-iterator.take.js b/packages/core-js/modules/esnext.async-iterator.take.js index cca5e898234d..6f31fbfc0773 100644 --- a/packages/core-js/modules/esnext.async-iterator.take.js +++ b/packages/core-js/modules/esnext.async-iterator.take.js @@ -13,11 +13,6 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { var iterator = state.iterator; var returnMethod; - var doneAndReThrow = function (error) { - state.done = true; - throw error; - }; - if (!state.remaining--) { var resultDone = { done: true, value: undefined }; state.done = true; @@ -33,9 +28,10 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { state.done = true; return { done: true, value: undefined }; } return { done: false, value: step.value }; - }, doneAndReThrow).then(function (result) { - return result; - }, doneAndReThrow); + }).then(null, function (error) { + state.done = true; + throw error; + }); }); $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { From 3b1f77fba832266e5ef1f5c9fdad1b4e127da004 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 12:30:52 +0700 Subject: [PATCH 23/26] rework async generators core --- CHANGELOG.md | 2 +- .../internals/async-iterator-create-proxy.js | 90 +++++++++++++------ 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 522d5da8dfce..7e9520511153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ - `.throw` methods removed from all wrappers / helpers prototypes, a part of [proposal-iterator-helpers/194](https://github.com/tc39/proposal-iterator-helpers/pull/194) - Close inner iterators in `{ Iterator, AsyncIterator }.prototype.flatMap` on `.return`, [proposal-iterator-helpers/195](https://github.com/tc39/proposal-iterator-helpers/pull/195) - Throw `RangeError` on `NaN` in `{ Iterator, AsyncIterator }.prototype.{ drop, take }`, [proposal-iterator-helpers/181](https://github.com/tc39/proposal-iterator-helpers/pull/181) - - Some other minor updates of this proposal + - Many other updates and fixes of this proposal - Polyfill `Promise` with `unhandledrejection` event support (browser style) in Deno < [1.24](https://github.com/denoland/deno/releases/tag/v1.24.0) - Added compat data for Bun, [#1103](https://github.com/zloirock/core-js/issues/1103) - Added compat data for Hermes, [#1099](https://github.com/zloirock/core-js/issues/1099) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index fe2095d37e80..01342e2c2403 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -21,46 +21,81 @@ var setInternalState = InternalStateModule.set; var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { + var IS_GENERATOR = !IS_ITERATOR; var ASYNC_ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER; var getInternalState = InternalStateModule.getterFor(ASYNC_ITERATOR_PROXY); + var getStateOrEarlyExit = function (that) { + var stateCompletion = perform(function () { + return getInternalState(that); + }); + + var stateError = stateCompletion.error; + var state = stateCompletion.value; + + if (stateError || (IS_GENERATOR && state.done)) { + return { exit: true, value: stateError ? Promise.reject(state) : Promise.resolve({ done: true, value: undefined }) }; + } return { exit: false, value: state }; + }; + + var awaiting = function (state, promise) { + if (IS_GENERATOR) { + state.awaiting = promise; + var clean = function () { + state.awaiting = null; + }; + promise.then(clean, clean); + } return promise; + }; + + var enqueue = function (state, asyncHandler) { + return state.awaiting ? state.awaiting.then(asyncHandler, asyncHandler) : asyncHandler(); + }; + var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), { next: function next() { - var that = this; - var state; - var result = perform(function () { - state = getInternalState(that); - return (IS_ITERATOR && state.done) ? { done: true, value: undefined } : anObject(state.nextHandler(Promise)); + var stateCompletion = getStateOrEarlyExit(this); + var exit = stateCompletion.exit; + var state = stateCompletion.value; + + return exit ? state : enqueue(state, function () { + var handlerCompletion = perform(function () { + return anObject(state.nextHandler(Promise)); + }); + var handlerError = handlerCompletion.error; + var value = handlerCompletion.value; + if (handlerError) state.done = true; + return awaiting(state, handlerError ? Promise.reject(value) : Promise.resolve(value)); }); - var error = result.error; - var value = result.value; - if (error && state) state.done = true; - return error ? Promise.reject(value) : Promise.resolve(value); }, 'return': function () { - var that = this; - return new Promise(function (resolve, reject) { - var state = getInternalState(that); - var iterator = state.iterator; - var innerIterator = state.innerIterator; - state.done = true; - if (innerIterator) try { - iteratorClose(innerIterator, 'return'); - } catch (error) { - return iteratorClose(iterator, 'throw', error); - } - var $$return = getMethod(iterator, 'return'); - if ($$return === undefined) return resolve({ done: true, value: undefined }); - Promise.resolve(call($$return, iterator)).then(function (result) { - anObject(result); - resolve({ done: true, value: undefined }); - }, reject); + var stateCompletion = getStateOrEarlyExit(this); + var exit = stateCompletion.exit; + var state = stateCompletion.value; + + return exit ? state : enqueue(state, function () { + return awaiting(state, new Promise(function (resolve, reject) { + var iterator = state.iterator; + var innerIterator = state.innerIterator; + state.done = true; + if (innerIterator) try { + iteratorClose(innerIterator, 'return'); + } catch (error) { + return iteratorClose(iterator, 'throw', error); + } + var $$return = getMethod(iterator, 'return'); + if ($$return === undefined) return resolve({ done: true, value: undefined }); + Promise.resolve(call($$return, iterator)).then(function (result) { + anObject(result); + resolve({ done: true, value: undefined }); + }, reject); + })); }); } }); - if (!IS_ITERATOR) { + if (IS_GENERATOR) { createNonEnumerableProperty(AsyncIteratorProxyPrototype, TO_STRING_TAG, 'Async Iterator Helper'); } @@ -81,6 +116,7 @@ module.exports = function (nextHandler, IS_ITERATOR) { state.type = ASYNC_ITERATOR_PROXY; state.nextHandler = nextHandler; state.done = false; + state.awaiting = null; setInternalState(this, state); }; From 4d107e1b6996a4045845cb9b81cb94f744342cd0 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 13:44:54 +0700 Subject: [PATCH 24/26] fix promise chain --- packages/core-js/internals/async-iterator-create-proxy.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 01342e2c2403..f7aa977cbf26 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -43,14 +43,14 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { if (IS_GENERATOR) { state.awaiting = promise; var clean = function () { - state.awaiting = null; + if (state.awaiting === promise) state.awaiting = null; }; promise.then(clean, clean); } return promise; }; var enqueue = function (state, asyncHandler) { - return state.awaiting ? state.awaiting.then(asyncHandler, asyncHandler) : asyncHandler(); + return state.awaiting ? state.awaiting = state.awaiting.then(asyncHandler, asyncHandler) : asyncHandler(); }; var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), { From ae6018efed2c97ef61cd900c6bd5de18ff1e45b6 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 19 Jul 2022 14:10:16 +0700 Subject: [PATCH 25/26] simplify --- .../internals/async-iterator-create-proxy.js | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index f7aa977cbf26..ee26110b9ecf 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -39,18 +39,19 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { } return { exit: false, value: state }; }; - var awaiting = function (state, promise) { - if (IS_GENERATOR) { - state.awaiting = promise; - var clean = function () { - if (state.awaiting === promise) state.awaiting = null; - }; - promise.then(clean, clean); - } return promise; - }; - - var enqueue = function (state, asyncHandler) { - return state.awaiting ? state.awaiting = state.awaiting.then(asyncHandler, asyncHandler) : asyncHandler(); + var enqueue = function (state, handler) { + var task = function () { + var promise = handler(); + if (IS_GENERATOR) { + state.awaiting = promise; + var clean = function () { + if (state.awaiting === promise) state.awaiting = null; + }; + promise.then(clean, clean); + } return promise; + }; + + return state.awaiting ? state.awaiting = state.awaiting.then(task, task) : task(); }; var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), { @@ -66,7 +67,7 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { var handlerError = handlerCompletion.error; var value = handlerCompletion.value; if (handlerError) state.done = true; - return awaiting(state, handlerError ? Promise.reject(value) : Promise.resolve(value)); + return handlerError ? Promise.reject(value) : Promise.resolve(value); }); }, 'return': function () { @@ -75,7 +76,7 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { var state = stateCompletion.value; return exit ? state : enqueue(state, function () { - return awaiting(state, new Promise(function (resolve, reject) { + return new Promise(function (resolve, reject) { var iterator = state.iterator; var innerIterator = state.innerIterator; state.done = true; @@ -90,7 +91,7 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { anObject(result); resolve({ done: true, value: undefined }); }, reject); - })); + }); }); } }); From 5a2d4215371b32513bbb4c27094c30a800ec7693 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 23 Jul 2022 05:57:47 +0700 Subject: [PATCH 26/26] improve a changelog note --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e9520511153..25994cb12feb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - `.asIndexedPairs` renamed to `.indexed`, [proposal-iterator-helpers/183](https://github.com/tc39/proposal-iterator-helpers/pull/183): - `Iterator.prototype.asIndexedPairs` -> `Iterator.prototype.indexed` - `AsyncIterator.prototype.asIndexedPairs` -> `AsyncIterator.prototype.indexed` - - Avoid exposing spec fiction `%AsyncFromSyncIteratorPrototype%` in `AsyncIterator.from` (and in `Iterator.prototype.toAsync`), [proposal-iterator-helpers/182](https://github.com/tc39/proposal-iterator-helpers/pull/182) + - Avoid exposing spec fiction `%AsyncFromSyncIteratorPrototype%` in `AsyncIterator.from` and `Iterator.prototype.toAsync`, [proposal-iterator-helpers/182](https://github.com/tc39/proposal-iterator-helpers/pull/182), [proposal-iterator-helpers/202](https://github.com/tc39/proposal-iterator-helpers/pull/202) - Avoid unnecessary promise creation in `%WrapForValidAsyncIteratorPrototype%.next`, [proposal-iterator-helpers/197](https://github.com/tc39/proposal-iterator-helpers/pull/197) - Do not validate value in `%WrapForValid(Async)IteratorPrototype%.next`, [proposal-iterator-helpers/197](https://github.com/tc39/proposal-iterator-helpers/pull/197) and [proposal-iterator-helpers/205](https://github.com/tc39/proposal-iterator-helpers/pull/205) - Do not forward the parameter of `.next` / `.return` to an underlying iterator by the extended iterator protocol, a part of [proposal-iterator-helpers/194](https://github.com/tc39/proposal-iterator-helpers/pull/194)