1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 function AsyncIteratorIdentity() {
9 function AsyncGeneratorNext(val) {
11 IsAsyncGeneratorObject(this),
12 "ThisArgument must be a generator object for async generators"
14 return resumeGenerator(this, val, "next");
17 function AsyncGeneratorThrow(val) {
19 IsAsyncGeneratorObject(this),
20 "ThisArgument must be a generator object for async generators"
22 return resumeGenerator(this, val, "throw");
25 function AsyncGeneratorReturn(val) {
27 IsAsyncGeneratorObject(this),
28 "ThisArgument must be a generator object for async generators"
30 return resumeGenerator(this, val, "return");
33 /* ECMA262 7.4.7 AsyncIteratorClose */
34 async function AsyncIteratorClose(iteratorRecord, value) {
36 var iterator = iteratorRecord.iterator;
38 var returnMethod = iterator.return;
40 if (!IsNullOrUndefined(returnMethod)) {
41 var result = await callContentFunction(returnMethod, iterator);
43 if (!IsObject(result)) {
44 ThrowTypeError(JSMSG_OBJECT_REQUIRED, DecompileArg(0, result));
51 /* Iterator Helpers proposal 1.1.1 */
52 function GetIteratorDirect(obj) {
55 ThrowTypeError(JSMSG_OBJECT_REQUIRED, DecompileArg(0, obj));
59 var nextMethod = obj.next;
61 if (!IsCallable(nextMethod)) {
62 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, nextMethod));
73 /* Iterator Helpers proposal 1.1.1 */
74 function GetAsyncIteratorDirectWrapper(obj) {
77 ThrowTypeError(JSMSG_OBJECT_REQUIRED, obj);
81 var nextMethod = obj.next;
83 if (!IsCallable(nextMethod)) {
84 ThrowTypeError(JSMSG_NOT_FUNCTION, nextMethod);
89 // Use a named function expression instead of a method definition, so
90 // we don't create an inferred name for this function at runtime.
91 [GetBuiltinSymbol("asyncIterator")]: function AsyncIteratorMethod() {
95 return callContentFunction(nextMethod, obj, value);
98 var returnMethod = obj.return;
99 if (!IsNullOrUndefined(returnMethod)) {
100 return callContentFunction(returnMethod, obj, value);
102 return { done: true, value };
107 /* AsyncIteratorHelper object prototype methods. */
108 function AsyncIteratorHelperNext(value) {
110 if (!IsObject(O) || (O = GuardToAsyncIteratorHelper(O)) === null) {
112 CallAsyncIteratorHelperMethodIfWrapped,
115 "AsyncIteratorHelperNext"
118 var generator = UnsafeGetReservedSlot(
120 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT
122 return callFunction(IntrinsicAsyncGeneratorNext, generator, value);
125 function AsyncIteratorHelperReturn(value) {
127 if (!IsObject(O) || (O = GuardToAsyncIteratorHelper(O)) === null) {
129 CallAsyncIteratorHelperMethodIfWrapped,
132 "AsyncIteratorHelperReturn"
135 var generator = UnsafeGetReservedSlot(
137 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT
139 return callFunction(IntrinsicAsyncGeneratorReturn, generator, value);
142 function AsyncIteratorHelperThrow(value) {
144 if (!IsObject(O) || (O = GuardToAsyncIteratorHelper(O)) === null) {
146 CallAsyncIteratorHelperMethodIfWrapped,
149 "AsyncIteratorHelperThrow"
152 var generator = UnsafeGetReservedSlot(
154 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT
156 return callFunction(IntrinsicAsyncGeneratorThrow, generator, value);
159 // AsyncIterator lazy Iterator Helper methods
160 // Iterator Helpers proposal 2.1.6.2-2.1.6.7
162 // The AsyncIterator lazy methods are structured closely to how the Iterator
163 // lazy methods are. See builtin/Iterator.js for the reasoning.
165 /* Iterator Helpers proposal 2.1.6.2 Prelude */
166 function AsyncIteratorMap(mapper) {
168 var iterated = GetIteratorDirect(this);
171 if (!IsCallable(mapper)) {
172 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, mapper));
175 var iteratorHelper = NewAsyncIteratorHelper();
176 var generator = AsyncIteratorMapGenerator(iterated, mapper);
177 callFunction(IntrinsicAsyncGeneratorNext, generator);
178 UnsafeSetReservedSlot(
180 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT,
183 return iteratorHelper;
186 /* Iterator Helpers proposal 2.1.6.2 Body */
187 async function* AsyncIteratorMapGenerator(iterated, mapper) {
191 var needClose = true;
197 var next = await IteratorNext(iterated, lastValue);
199 next = await IteratorNext(iterated, lastValue)
202 var value = next.value;
206 lastValue = yield callContentFunction(mapper, undefined, value);
211 AsyncIteratorClose(iterated);
216 /* Iterator Helpers proposal 2.1.6.3 Prelude */
217 function AsyncIteratorFilter(filterer) {
219 var iterated = GetIteratorDirect(this);
222 if (!IsCallable(filterer)) {
223 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, filterer));
226 var iteratorHelper = NewAsyncIteratorHelper();
227 var generator = AsyncIteratorFilterGenerator(iterated, filterer);
228 callFunction(IntrinsicAsyncGeneratorNext, generator);
229 UnsafeSetReservedSlot(
231 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT,
234 return iteratorHelper;
237 /* Iterator Helpers proposal 2.1.6.3 Body */
238 async function* AsyncIteratorFilterGenerator(iterated, filterer) {
242 var needClose = true;
248 var next = await IteratorNext(iterated, lastValue);
250 next = await IteratorNext(iterated, lastValue)
253 var value = next.value;
257 if (await callContentFunction(filterer, undefined, value)) {
258 lastValue = yield value;
264 AsyncIteratorClose(iterated);
269 /* Iterator Helpers proposal 2.1.6.4 Prelude */
270 function AsyncIteratorTake(limit) {
272 var iterated = GetIteratorDirect(this);
275 var remaining = ToInteger(limit);
278 ThrowRangeError(JSMSG_NEGATIVE_LIMIT);
281 var iteratorHelper = NewAsyncIteratorHelper();
282 var generator = AsyncIteratorTakeGenerator(iterated, remaining);
283 callFunction(IntrinsicAsyncGeneratorNext, generator);
284 UnsafeSetReservedSlot(
286 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT,
289 return iteratorHelper;
292 /* Iterator Helpers proposal 2.1.6.4 Body */
293 async function* AsyncIteratorTakeGenerator(iterated, remaining) {
297 var needClose = true;
302 for (; remaining > 0; remaining--) {
303 var next = await IteratorNext(iterated, lastValue);
308 var value = next.value;
311 lastValue = yield value;
316 AsyncIteratorClose(iterated, undefined);
320 return AsyncIteratorClose(iterated, undefined);
323 /* Iterator Helpers proposal 2.1.6.5 Prelude */
324 function AsyncIteratorDrop(limit) {
326 var iterated = GetIteratorDirect(this);
329 var remaining = ToInteger(limit);
332 ThrowRangeError(JSMSG_NEGATIVE_LIMIT);
335 var iteratorHelper = NewAsyncIteratorHelper();
336 var generator = AsyncIteratorDropGenerator(iterated, remaining);
337 callFunction(IntrinsicAsyncGeneratorNext, generator);
338 UnsafeSetReservedSlot(
340 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT,
343 return iteratorHelper;
346 /* Iterator Helpers proposal 2.1.6.5 Body */
347 async function* AsyncIteratorDropGenerator(iterated, remaining) {
348 var needClose = true;
354 for (; remaining > 0; remaining--) {
355 var next = await IteratorNext(iterated);
365 var next = await IteratorNext(iterated, lastValue);
367 next = await IteratorNext(iterated, lastValue)
370 var value = next.value;
373 lastValue = yield value;
378 AsyncIteratorClose(iterated);
383 /* Iterator Helpers proposal 2.1.6.6 Prelude */
384 function AsyncIteratorAsIndexedPairs() {
386 var iterated = GetIteratorDirect(this);
388 var iteratorHelper = NewAsyncIteratorHelper();
389 var generator = AsyncIteratorAsIndexedPairsGenerator(iterated);
390 callFunction(IntrinsicAsyncGeneratorNext, generator);
391 UnsafeSetReservedSlot(
393 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT,
396 return iteratorHelper;
399 /* Iterator Helpers proposal 2.1.6.6 Body */
400 async function* AsyncIteratorAsIndexedPairsGenerator(iterated) {
401 var needClose = true;
410 var next = await IteratorNext(iterated, lastValue), index = 0;
412 next = await IteratorNext(iterated, lastValue), index++
415 var value = next.value;
418 lastValue = yield [index, value];
423 AsyncIteratorClose(iterated);
428 /* Iterator Helpers proposal 2.1.6.7 Prelude */
429 function AsyncIteratorFlatMap(mapper) {
431 var iterated = GetIteratorDirect(this);
434 if (!IsCallable(mapper)) {
435 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, mapper));
438 var iteratorHelper = NewAsyncIteratorHelper();
439 var generator = AsyncIteratorFlatMapGenerator(iterated, mapper);
440 callFunction(IntrinsicAsyncGeneratorNext, generator);
441 UnsafeSetReservedSlot(
443 ASYNC_ITERATOR_HELPER_GENERATOR_SLOT,
446 return iteratorHelper;
449 /* Iterator Helpers proposal 2.1.6.7 Body */
450 async function* AsyncIteratorFlatMapGenerator(iterated, mapper) {
451 var needClose = true;
458 var next = await IteratorNext(iterated);
460 next = await IteratorNext(iterated)
463 var value = next.value;
467 var mapped = await callContentFunction(mapper, undefined, value);
469 for await (var innerValue of allowContentIter(mapped)) {
476 AsyncIteratorClose(iterated);
481 /* Iterator Helpers proposal 2.1.6.8 */
482 async function AsyncIteratorReduce(reducer /*, initialValue*/) {
484 var iterated = GetAsyncIteratorDirectWrapper(this);
487 if (!IsCallable(reducer)) {
488 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, reducer));
493 if (ArgumentsLength() === 1) {
495 var next = await callContentFunction(iterated.next, iterated);
496 if (!IsObject(next)) {
497 ThrowTypeError(JSMSG_OBJECT_REQUIRED, DecompileArg(0, next));
501 ThrowTypeError(JSMSG_EMPTY_ITERATOR_REDUCE);
504 accumulator = next.value;
507 accumulator = GetArgument(1);
511 for await (var value of allowContentIter(iterated)) {
513 accumulator = await callContentFunction(
524 /* Iterator Helpers proposal 2.1.6.9 */
525 async function AsyncIteratorToArray() {
527 var iterated = { [GetBuiltinSymbol("asyncIterator")]: () => this };
532 for await (var value of allowContentIter(iterated)) {
534 DefineDataProperty(items, index++, value);
540 /* Iterator Helpers proposal 2.1.6.10 */
541 async function AsyncIteratorForEach(fn) {
543 var iterated = GetAsyncIteratorDirectWrapper(this);
546 if (!IsCallable(fn)) {
547 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, fn));
551 for await (var value of allowContentIter(iterated)) {
553 await callContentFunction(fn, undefined, value);
557 /* Iterator Helpers proposal 2.1.6.11 */
558 async function AsyncIteratorSome(fn) {
560 var iterated = GetAsyncIteratorDirectWrapper(this);
563 if (!IsCallable(fn)) {
564 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, fn));
568 for await (var value of allowContentIter(iterated)) {
570 if (await callContentFunction(fn, undefined, value)) {
578 /* Iterator Helpers proposal 2.1.6.12 */
579 async function AsyncIteratorEvery(fn) {
581 var iterated = GetAsyncIteratorDirectWrapper(this);
584 if (!IsCallable(fn)) {
585 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, fn));
589 for await (var value of allowContentIter(iterated)) {
591 if (!(await callContentFunction(fn, undefined, value))) {
599 /* Iterator Helpers proposal 2.1.6.13 */
600 async function AsyncIteratorFind(fn) {
602 var iterated = GetAsyncIteratorDirectWrapper(this);
605 if (!IsCallable(fn)) {
606 ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, fn));
610 for await (var value of allowContentIter(iterated)) {
612 if (await callContentFunction(fn, undefined, value)) {