5 #include "src/builtins/builtins-async-gen.h" 6 #include "src/builtins/builtins-utils-gen.h" 7 #include "src/builtins/builtins.h" 8 #include "src/code-factory.h" 9 #include "src/code-stub-assembler.h" 10 #include "src/frames-inl.h" 11 #include "src/objects/js-generator.h" 12 #include "src/objects/js-promise.h" 21 class AsyncGeneratorBuiltinsAssembler :
public AsyncBuiltinsAssembler {
23 explicit AsyncGeneratorBuiltinsAssembler(CodeAssemblerState* state)
24 : AsyncBuiltinsAssembler(state) {}
26 inline Node* TaggedIsAsyncGenerator(Node* tagged_object) {
27 TNode<BoolT> if_notsmi = TaggedIsNotSmi(tagged_object);
28 return Select<BoolT>(if_notsmi,
30 return HasInstanceType(
31 tagged_object, JS_ASYNC_GENERATOR_OBJECT_TYPE);
33 [=] {
return if_notsmi; });
35 inline Node* LoadGeneratorState(Node*
const generator) {
36 return LoadObjectField(generator, JSGeneratorObject::kContinuationOffset);
39 inline TNode<BoolT> IsGeneratorStateClosed(SloppyTNode<Smi>
const state) {
40 return SmiEqual(state, SmiConstant(JSGeneratorObject::kGeneratorClosed));
42 inline TNode<BoolT> IsGeneratorClosed(Node*
const generator) {
43 return IsGeneratorStateClosed(LoadGeneratorState(generator));
46 inline TNode<BoolT> IsGeneratorStateSuspended(SloppyTNode<Smi>
const state) {
47 return SmiGreaterThanOrEqual(state, SmiConstant(0));
50 inline TNode<BoolT> IsGeneratorSuspended(Node*
const generator) {
51 return IsGeneratorStateSuspended(LoadGeneratorState(generator));
54 inline TNode<BoolT> IsGeneratorStateSuspendedAtStart(
55 SloppyTNode<Smi>
const state) {
56 return SmiEqual(state, SmiConstant(0));
59 inline TNode<BoolT> IsGeneratorStateNotExecuting(
60 SloppyTNode<Smi>
const state) {
61 return SmiNotEqual(state,
62 SmiConstant(JSGeneratorObject::kGeneratorExecuting));
64 inline TNode<BoolT> IsGeneratorNotExecuting(Node*
const generator) {
65 return IsGeneratorStateNotExecuting(LoadGeneratorState(generator));
68 inline TNode<BoolT> IsGeneratorAwaiting(Node*
const generator) {
69 TNode<Object> is_generator_awaiting =
70 LoadObjectField(generator, JSAsyncGeneratorObject::kIsAwaitingOffset);
71 return WordEqual(is_generator_awaiting, SmiConstant(1));
74 inline void SetGeneratorAwaiting(Node*
const generator) {
75 CSA_ASSERT(
this, Word32BinaryNot(IsGeneratorAwaiting(generator)));
76 StoreObjectFieldNoWriteBarrier(
77 generator, JSAsyncGeneratorObject::kIsAwaitingOffset, SmiConstant(1));
78 CSA_ASSERT(
this, IsGeneratorAwaiting(generator));
81 inline void SetGeneratorNotAwaiting(Node*
const generator) {
82 CSA_ASSERT(
this, IsGeneratorAwaiting(generator));
83 StoreObjectFieldNoWriteBarrier(
84 generator, JSAsyncGeneratorObject::kIsAwaitingOffset, SmiConstant(0));
85 CSA_ASSERT(
this, Word32BinaryNot(IsGeneratorAwaiting(generator)));
88 inline void CloseGenerator(Node*
const generator) {
89 StoreObjectFieldNoWriteBarrier(
90 generator, JSGeneratorObject::kContinuationOffset,
91 SmiConstant(JSGeneratorObject::kGeneratorClosed));
94 inline Node* IsFastJSIterResult(Node*
const value, Node*
const context) {
95 CSA_ASSERT(
this, TaggedIsNotSmi(value));
96 Node*
const native_context = LoadNativeContext(context);
99 LoadContextElement(native_context, Context::ITERATOR_RESULT_MAP_INDEX));
102 inline Node* LoadFirstAsyncGeneratorRequestFromQueue(Node*
const generator) {
103 return LoadObjectField(generator, JSAsyncGeneratorObject::kQueueOffset);
106 inline Node* LoadResumeTypeFromAsyncGeneratorRequest(Node*
const request) {
107 return LoadObjectField(request, AsyncGeneratorRequest::kResumeModeOffset);
110 inline Node* LoadPromiseFromAsyncGeneratorRequest(Node*
const request) {
111 return LoadObjectField(request, AsyncGeneratorRequest::kPromiseOffset);
114 inline Node* LoadValueFromAsyncGeneratorRequest(Node*
const request) {
115 return LoadObjectField(request, AsyncGeneratorRequest::kValueOffset);
118 inline TNode<BoolT> IsAbruptResumeType(SloppyTNode<Smi>
const resume_type) {
119 return SmiNotEqual(resume_type, SmiConstant(JSGeneratorObject::kNext));
122 void AsyncGeneratorEnqueue(CodeStubArguments* args, Node* context,
123 Node* generator, Node* value,
124 JSAsyncGeneratorObject::ResumeMode resume_mode,
125 const char* method_name);
127 Node* TakeFirstAsyncGeneratorRequestFromQueue(Node* generator);
128 Node* TakeFirstAsyncGeneratorRequestFromQueueIfPresent(Node* generator,
129 Label* if_not_present);
130 void AddAsyncGeneratorRequestToQueue(Node* generator, Node* request);
132 Node* AllocateAsyncGeneratorRequest(
133 JSAsyncGeneratorObject::ResumeMode resume_mode, Node* resume_value,
138 template <
typename Descriptor>
139 void AsyncGeneratorAwait(
bool is_catchable);
140 void AsyncGeneratorAwaitResumeClosure(
141 Node* context, Node* value,
142 JSAsyncGeneratorObject::ResumeMode resume_mode);
147 void AsyncGeneratorBuiltinsAssembler::AsyncGeneratorEnqueue(
148 CodeStubArguments* args, Node* context, Node* generator, Node* value,
149 JSAsyncGeneratorObject::ResumeMode resume_mode,
const char* method_name) {
155 Node* promise = AllocateAndInitJSPromise(context);
157 Label enqueue(
this), if_receiverisincompatible(
this, Label::kDeferred);
159 Branch(TaggedIsAsyncGenerator(generator), &enqueue,
160 &if_receiverisincompatible);
166 AllocateAsyncGeneratorRequest(resume_mode, value, promise);
168 AddAsyncGeneratorRequestToQueue(generator, req);
174 TNode<Smi> continuation = CAST(LoadGeneratorState(generator));
176 GotoIf(SmiEqual(continuation,
177 SmiConstant(JSAsyncGeneratorObject::kGeneratorExecuting)),
180 CallBuiltin(Builtins::kAsyncGeneratorResumeNext, context, generator);
184 args->PopAndReturn(promise);
187 BIND(&if_receiverisincompatible);
190 MakeTypeError(MessageTemplate::kIncompatibleMethodReceiver, context,
191 StringConstant(method_name), generator);
193 CallBuiltin(Builtins::kRejectPromise, context, promise, error,
195 args->PopAndReturn(promise);
199 Node* AsyncGeneratorBuiltinsAssembler::AllocateAsyncGeneratorRequest(
200 JSAsyncGeneratorObject::ResumeMode resume_mode, Node* resume_value,
202 CSA_SLOW_ASSERT(
this, HasInstanceType(promise, JS_PROMISE_TYPE));
203 Node* request = Allocate(AsyncGeneratorRequest::kSize);
204 StoreMapNoWriteBarrier(request, RootIndex::kAsyncGeneratorRequestMap);
205 StoreObjectFieldNoWriteBarrier(request, AsyncGeneratorRequest::kNextOffset,
206 UndefinedConstant());
207 StoreObjectFieldNoWriteBarrier(request,
208 AsyncGeneratorRequest::kResumeModeOffset,
209 SmiConstant(resume_mode));
210 StoreObjectFieldNoWriteBarrier(request, AsyncGeneratorRequest::kValueOffset,
212 StoreObjectFieldNoWriteBarrier(request, AsyncGeneratorRequest::kPromiseOffset,
214 StoreObjectFieldRoot(request, AsyncGeneratorRequest::kNextOffset,
215 RootIndex::kUndefinedValue);
219 void AsyncGeneratorBuiltinsAssembler::AsyncGeneratorAwaitResumeClosure(
220 Node* context, Node* value,
221 JSAsyncGeneratorObject::ResumeMode resume_mode) {
222 Node*
const generator = LoadContextElement(context, Context::EXTENSION_INDEX);
223 CSA_SLOW_ASSERT(
this, TaggedIsAsyncGenerator(generator));
225 SetGeneratorNotAwaiting(generator);
227 CSA_SLOW_ASSERT(
this, IsGeneratorSuspended(generator));
230 StoreObjectFieldNoWriteBarrier(generator,
231 JSGeneratorObject::kResumeModeOffset,
232 SmiConstant(resume_mode));
234 CallStub(CodeFactory::ResumeGenerator(isolate()), context, value, generator);
236 TailCallBuiltin(Builtins::kAsyncGeneratorResumeNext, context, generator);
239 template <
typename Descriptor>
240 void AsyncGeneratorBuiltinsAssembler::AsyncGeneratorAwait(
bool is_catchable) {
241 TNode<JSAsyncGeneratorObject> async_generator_object =
242 CAST(Parameter(Descriptor::kAsyncGeneratorObject));
243 TNode<Object> value = CAST(Parameter(Descriptor::kValue));
244 TNode<Context> context = CAST(Parameter(Descriptor::kContext));
246 TNode<AsyncGeneratorRequest> request =
247 CAST(LoadFirstAsyncGeneratorRequestFromQueue(async_generator_object));
248 TNode<JSPromise> outer_promise = LoadObjectField<JSPromise>(
249 request, AsyncGeneratorRequest::kPromiseOffset);
251 const int resolve_index = Context::ASYNC_GENERATOR_AWAIT_RESOLVE_SHARED_FUN;
252 const int reject_index = Context::ASYNC_GENERATOR_AWAIT_REJECT_SHARED_FUN;
254 SetGeneratorAwaiting(async_generator_object);
255 Await(context, async_generator_object, value, outer_promise, resolve_index,
256 reject_index, is_catchable);
257 Return(UndefinedConstant());
260 void AsyncGeneratorBuiltinsAssembler::AddAsyncGeneratorRequestToQueue(
261 Node* generator, Node* request) {
262 VARIABLE(var_current, MachineRepresentation::kTagged);
263 Label empty(
this), loop(
this, &var_current), done(
this);
266 LoadObjectField(generator, JSAsyncGeneratorObject::kQueueOffset));
267 Branch(IsUndefined(var_current.value()), &empty, &loop);
271 StoreObjectField(generator, JSAsyncGeneratorObject::kQueueOffset, request);
277 Label loop_next(
this), next_empty(
this);
278 Node* current = var_current.value();
279 Node* next = LoadObjectField(current, AsyncGeneratorRequest::kNextOffset);
281 Branch(IsUndefined(next), &next_empty, &loop_next);
284 StoreObjectField(current, AsyncGeneratorRequest::kNextOffset, request);
290 var_current.Bind(next);
297 Node* AsyncGeneratorBuiltinsAssembler::TakeFirstAsyncGeneratorRequestFromQueue(
301 CSA_ASSERT(
this, TaggedIsAsyncGenerator(generator));
303 LoadObjectField(generator, JSAsyncGeneratorObject::kQueueOffset);
304 CSA_ASSERT(
this, IsNotUndefined(request));
306 Node* next = LoadObjectField(request, AsyncGeneratorRequest::kNextOffset);
308 StoreObjectField(generator, JSAsyncGeneratorObject::kQueueOffset, next);
315 TF_BUILTIN(AsyncGeneratorPrototypeNext, AsyncGeneratorBuiltinsAssembler) {
316 const int kValueArg = 0;
319 ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount));
320 CodeStubArguments args(
this, argc);
322 Node* generator = args.GetReceiver();
323 Node* value = args.GetOptionalArgumentValue(kValueArg);
324 Node* context = Parameter(Descriptor::kContext);
326 AsyncGeneratorEnqueue(&args, context, generator, value,
327 JSAsyncGeneratorObject::kNext,
328 "[AsyncGenerator].prototype.next");
333 TF_BUILTIN(AsyncGeneratorPrototypeReturn, AsyncGeneratorBuiltinsAssembler) {
334 const int kValueArg = 0;
337 ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount));
338 CodeStubArguments args(
this, argc);
340 Node* generator = args.GetReceiver();
341 Node* value = args.GetOptionalArgumentValue(kValueArg);
342 Node* context = Parameter(Descriptor::kContext);
344 AsyncGeneratorEnqueue(&args, context, generator, value,
345 JSAsyncGeneratorObject::kReturn,
346 "[AsyncGenerator].prototype.return");
351 TF_BUILTIN(AsyncGeneratorPrototypeThrow, AsyncGeneratorBuiltinsAssembler) {
352 const int kValueArg = 0;
355 ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount));
356 CodeStubArguments args(
this, argc);
358 Node* generator = args.GetReceiver();
359 Node* value = args.GetOptionalArgumentValue(kValueArg);
360 Node* context = Parameter(Descriptor::kContext);
362 AsyncGeneratorEnqueue(&args, context, generator, value,
363 JSAsyncGeneratorObject::kThrow,
364 "[AsyncGenerator].prototype.throw");
367 TF_BUILTIN(AsyncGeneratorAwaitResolveClosure, AsyncGeneratorBuiltinsAssembler) {
368 Node* value = Parameter(Descriptor::kValue);
369 Node* context = Parameter(Descriptor::kContext);
370 AsyncGeneratorAwaitResumeClosure(context, value,
371 JSAsyncGeneratorObject::kNext);
374 TF_BUILTIN(AsyncGeneratorAwaitRejectClosure, AsyncGeneratorBuiltinsAssembler) {
375 Node* value = Parameter(Descriptor::kValue);
376 Node* context = Parameter(Descriptor::kContext);
377 AsyncGeneratorAwaitResumeClosure(context, value,
378 JSAsyncGeneratorObject::kThrow);
381 TF_BUILTIN(AsyncGeneratorAwaitUncaught, AsyncGeneratorBuiltinsAssembler) {
382 const bool kIsCatchable =
false;
383 AsyncGeneratorAwait<Descriptor>(kIsCatchable);
386 TF_BUILTIN(AsyncGeneratorAwaitCaught, AsyncGeneratorBuiltinsAssembler) {
387 const bool kIsCatchable =
true;
388 AsyncGeneratorAwait<Descriptor>(kIsCatchable);
391 TF_BUILTIN(AsyncGeneratorResumeNext, AsyncGeneratorBuiltinsAssembler) {
392 typedef AsyncGeneratorResumeNextDescriptor Descriptor;
393 Node*
const generator = Parameter(Descriptor::kGenerator);
394 Node*
const context = Parameter(Descriptor::kContext);
404 VARIABLE(var_state, MachineRepresentation::kTaggedSigned,
405 LoadGeneratorState(generator));
406 VARIABLE(var_next, MachineRepresentation::kTagged,
407 LoadFirstAsyncGeneratorRequestFromQueue(generator));
408 Variable* loop_variables[] = {&var_state, &var_next};
409 Label start(
this, 2, loop_variables);
413 CSA_ASSERT(
this, IsGeneratorNotExecuting(generator));
416 ReturnIf(IsGeneratorAwaiting(generator), UndefinedConstant());
419 ReturnIf(IsUndefined(var_next.value()), UndefinedConstant());
421 Node*
const next = var_next.value();
422 TNode<Smi>
const resume_type =
423 CAST(LoadResumeTypeFromAsyncGeneratorRequest(next));
425 Label if_abrupt(
this), if_normal(
this), resume_generator(
this);
426 Branch(IsAbruptResumeType(resume_type), &if_abrupt, &if_normal);
429 Label settle_promise(
this), if_return(
this), if_throw(
this);
430 GotoIfNot(IsGeneratorStateSuspendedAtStart(var_state.value()),
432 CloseGenerator(generator);
433 var_state.Bind(SmiConstant(JSGeneratorObject::kGeneratorClosed));
434 Goto(&settle_promise);
436 BIND(&settle_promise);
437 Node* next_value = LoadValueFromAsyncGeneratorRequest(next);
438 Branch(SmiEqual(resume_type, SmiConstant(JSGeneratorObject::kReturn)),
439 &if_return, &if_throw);
449 Node* is_caught = CallRuntime(Runtime::kAsyncGeneratorHasCatchHandlerForPC,
451 TailCallBuiltin(Builtins::kAsyncGeneratorReturn, context, generator,
452 next_value, is_caught);
455 GotoIfNot(IsGeneratorStateClosed(var_state.value()), &resume_generator);
456 CallBuiltin(Builtins::kAsyncGeneratorReject, context, generator,
458 var_next.Bind(LoadFirstAsyncGeneratorRequestFromQueue(generator));
464 GotoIfNot(IsGeneratorStateClosed(var_state.value()), &resume_generator);
465 CallBuiltin(Builtins::kAsyncGeneratorResolve, context, generator,
466 UndefinedConstant(), TrueConstant());
467 var_state.Bind(LoadGeneratorState(generator));
468 var_next.Bind(LoadFirstAsyncGeneratorRequestFromQueue(generator));
472 BIND(&resume_generator);
475 StoreObjectFieldNoWriteBarrier(
476 generator, JSGeneratorObject::kResumeModeOffset, resume_type);
477 CallStub(CodeFactory::ResumeGenerator(isolate()), context,
478 LoadValueFromAsyncGeneratorRequest(next), generator);
479 var_state.Bind(LoadGeneratorState(generator));
480 var_next.Bind(LoadFirstAsyncGeneratorRequestFromQueue(generator));
485 TF_BUILTIN(AsyncGeneratorResolve, AsyncGeneratorBuiltinsAssembler) {
486 Node*
const generator = Parameter(Descriptor::kGenerator);
487 Node*
const value = Parameter(Descriptor::kValue);
488 Node*
const done = Parameter(Descriptor::kDone);
489 Node*
const context = Parameter(Descriptor::kContext);
491 CSA_SLOW_ASSERT(
this, TaggedIsAsyncGenerator(generator));
492 CSA_ASSERT(
this, Word32BinaryNot(IsGeneratorAwaiting(generator)));
500 Node*
const next = TakeFirstAsyncGeneratorRequestFromQueue(generator);
501 Node*
const promise = LoadPromiseFromAsyncGeneratorRequest(next);
504 Node*
const iter_result = Allocate(JSIteratorResult::kSize);
506 Node* map = LoadContextElement(LoadNativeContext(context),
507 Context::ITERATOR_RESULT_MAP_INDEX);
508 StoreMapNoWriteBarrier(iter_result, map);
509 StoreObjectFieldRoot(iter_result, JSIteratorResult::kPropertiesOrHashOffset,
510 RootIndex::kEmptyFixedArray);
511 StoreObjectFieldRoot(iter_result, JSIteratorResult::kElementsOffset,
512 RootIndex::kEmptyFixedArray);
513 StoreObjectFieldNoWriteBarrier(iter_result, JSIteratorResult::kValueOffset,
515 StoreObjectFieldNoWriteBarrier(iter_result, JSIteratorResult::kDoneOffset,
528 Label if_fast(
this), if_slow(
this, Label::kDeferred), return_promise(
this);
529 GotoIfForceSlowPath(&if_slow);
530 GotoIf(IsPromiseHookEnabled(), &if_slow);
531 Branch(IsPromiseThenProtectorCellInvalid(), &if_slow, &if_fast);
537 CallBuiltin(Builtins::kFulfillPromise, context, promise, iter_result);
538 Goto(&return_promise);
544 CallBuiltin(Builtins::kResolvePromise, context, promise, iter_result);
545 Goto(&return_promise);
550 BIND(&return_promise);
554 TF_BUILTIN(AsyncGeneratorReject, AsyncGeneratorBuiltinsAssembler) {
555 typedef AsyncGeneratorRejectDescriptor Descriptor;
556 Node*
const generator = Parameter(Descriptor::kGenerator);
557 Node*
const value = Parameter(Descriptor::kValue);
558 Node*
const context = Parameter(Descriptor::kContext);
560 Node*
const next = TakeFirstAsyncGeneratorRequestFromQueue(generator);
561 Node*
const promise = LoadPromiseFromAsyncGeneratorRequest(next);
563 Return(CallBuiltin(Builtins::kRejectPromise, context, promise, value,
567 TF_BUILTIN(AsyncGeneratorYield, AsyncGeneratorBuiltinsAssembler) {
568 Node*
const generator = Parameter(Descriptor::kGenerator);
569 Node*
const value = Parameter(Descriptor::kValue);
570 Node*
const is_caught = Parameter(Descriptor::kIsCaught);
571 Node*
const context = Parameter(Descriptor::kContext);
573 Node*
const request = LoadFirstAsyncGeneratorRequestFromQueue(generator);
574 Node*
const outer_promise = LoadPromiseFromAsyncGeneratorRequest(request);
576 const int on_resolve = Context::ASYNC_GENERATOR_YIELD_RESOLVE_SHARED_FUN;
577 const int on_reject = Context::ASYNC_GENERATOR_AWAIT_REJECT_SHARED_FUN;
579 SetGeneratorAwaiting(generator);
580 Await(context, generator, value, outer_promise, on_resolve, on_reject,
582 Return(UndefinedConstant());
585 TF_BUILTIN(AsyncGeneratorYieldResolveClosure, AsyncGeneratorBuiltinsAssembler) {
586 Node*
const context = Parameter(Descriptor::kContext);
587 Node*
const value = Parameter(Descriptor::kValue);
588 Node*
const generator = LoadContextElement(context, Context::EXTENSION_INDEX);
590 SetGeneratorNotAwaiting(generator);
594 CallBuiltin(Builtins::kAsyncGeneratorResolve, context, generator, value,
597 TailCallBuiltin(Builtins::kAsyncGeneratorResumeNext, context, generator);
600 TF_BUILTIN(AsyncGeneratorReturn, AsyncGeneratorBuiltinsAssembler) {
617 Node*
const generator = Parameter(Descriptor::kGenerator);
618 Node*
const value = Parameter(Descriptor::kValue);
619 Node*
const is_caught = Parameter(Descriptor::kIsCaught);
620 Node*
const req = LoadFirstAsyncGeneratorRequestFromQueue(generator);
621 CSA_ASSERT(
this, IsNotUndefined(req));
623 Label perform_await(
this);
624 VARIABLE(var_on_resolve, MachineType::PointerRepresentation(),
626 Context::ASYNC_GENERATOR_RETURN_CLOSED_RESOLVE_SHARED_FUN));
628 var_on_reject, MachineType::PointerRepresentation(),
629 IntPtrConstant(Context::ASYNC_GENERATOR_RETURN_CLOSED_REJECT_SHARED_FUN));
631 Node*
const state = LoadGeneratorState(generator);
632 GotoIf(IsGeneratorStateClosed(state), &perform_await);
634 IntPtrConstant(Context::ASYNC_GENERATOR_RETURN_RESOLVE_SHARED_FUN));
636 IntPtrConstant(Context::ASYNC_GENERATOR_AWAIT_REJECT_SHARED_FUN));
637 Goto(&perform_await);
639 BIND(&perform_await);
641 SetGeneratorAwaiting(generator);
642 Node*
const context = Parameter(Descriptor::kContext);
643 Node*
const outer_promise = LoadPromiseFromAsyncGeneratorRequest(req);
644 Await(context, generator, value, outer_promise, var_on_resolve.value(),
645 var_on_reject.value(), is_caught);
647 Return(UndefinedConstant());
654 TF_BUILTIN(AsyncGeneratorReturnResolveClosure,
655 AsyncGeneratorBuiltinsAssembler) {
656 Node*
const context = Parameter(Descriptor::kContext);
657 Node*
const value = Parameter(Descriptor::kValue);
658 AsyncGeneratorAwaitResumeClosure(context, value, JSGeneratorObject::kReturn);
664 TF_BUILTIN(AsyncGeneratorReturnClosedResolveClosure,
665 AsyncGeneratorBuiltinsAssembler) {
666 Node*
const context = Parameter(Descriptor::kContext);
667 Node*
const value = Parameter(Descriptor::kValue);
668 Node*
const generator = LoadContextElement(context, Context::EXTENSION_INDEX);
670 SetGeneratorNotAwaiting(generator);
675 CallBuiltin(Builtins::kAsyncGeneratorResolve, context, generator, value,
678 TailCallBuiltin(Builtins::kAsyncGeneratorResumeNext, context, generator);
681 TF_BUILTIN(AsyncGeneratorReturnClosedRejectClosure,
682 AsyncGeneratorBuiltinsAssembler) {
683 Node*
const context = Parameter(Descriptor::kContext);
684 Node*
const value = Parameter(Descriptor::kValue);
685 Node*
const generator = LoadContextElement(context, Context::EXTENSION_INDEX);
687 SetGeneratorNotAwaiting(generator);
692 CallBuiltin(Builtins::kAsyncGeneratorReject, context, generator, value);
694 TailCallBuiltin(Builtins::kAsyncGeneratorResumeNext, context, generator);