@@ -46,8 +46,11 @@ class MicrotaskQueueBuiltinsAssembler : public CodeStubAssembler {
4646 void EnterMicrotaskContext (TNode<Context> native_context);
4747 void RewindEnteredContext (TNode<IntPtrT> saved_entered_context_count);
4848
49+ void RunAllPromiseHooks (PromiseHookType type, TNode<Context> context,
50+ TNode<HeapObject> promise_or_capability);
4951 void RunPromiseHook (Runtime::FunctionId id, TNode<Context> context,
50- TNode<HeapObject> promise_or_capability);
52+ TNode<HeapObject> promise_or_capability,
53+ TNode<Uint32T> promiseHookFlags);
5154};
5255
5356TNode<RawPtrT> MicrotaskQueueBuiltinsAssembler::GetMicrotaskQueue (
@@ -198,7 +201,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
198201 const TNode<Object> thenable = LoadObjectField (
199202 microtask, PromiseResolveThenableJobTask::kThenableOffset );
200203
201- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
204+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
202205 CAST (promise_to_resolve));
203206
204207 {
@@ -207,7 +210,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
207210 promise_to_resolve, thenable, then);
208211 }
209212
210- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
213+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
211214 CAST (promise_to_resolve));
212215
213216 RewindEnteredContext (saved_entered_context_count);
@@ -242,8 +245,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
242245 BIND (&preserved_data_done);
243246
244247 // Run the promise before/debug hook if enabled.
245- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
246- promise_or_capability);
248+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
249+ promise_or_capability);
247250
248251 {
249252 ScopedExceptionHandler handler (this , &if_exception, &var_exception);
@@ -252,8 +255,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
252255 }
253256
254257 // Run the promise after/debug hook if enabled.
255- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
256- promise_or_capability);
258+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
259+ promise_or_capability);
257260
258261 Label preserved_data_reset_done (this );
259262 GotoIf (IsUndefined (preserved_embedder_data), &preserved_data_reset_done);
@@ -295,8 +298,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
295298 BIND (&preserved_data_done);
296299
297300 // Run the promise before/debug hook if enabled.
298- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
299- promise_or_capability);
301+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
302+ promise_or_capability);
300303
301304 {
302305 ScopedExceptionHandler handler (this , &if_exception, &var_exception);
@@ -305,8 +308,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
305308 }
306309
307310 // Run the promise after/debug hook if enabled.
308- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
309- promise_or_capability);
311+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
312+ promise_or_capability);
310313
311314 Label preserved_data_reset_done (this );
312315 GotoIf (IsUndefined (preserved_embedder_data), &preserved_data_reset_done);
@@ -464,12 +467,43 @@ void MicrotaskQueueBuiltinsAssembler::RewindEnteredContext(
464467 saved_entered_context_count);
465468}
466469
470+ void MicrotaskQueueBuiltinsAssembler::RunAllPromiseHooks (
471+ PromiseHookType type, TNode<Context> context,
472+ TNode<HeapObject> promise_or_capability) {
473+ Label hook (this , Label::kDeferred ), done_hook (this );
474+ TNode<Uint32T> promiseHookFlags = PromiseHookFlags ();
475+ Branch (IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate (
476+ promiseHookFlags), &hook, &done_hook);
477+ BIND (&hook);
478+ {
479+ switch (type) {
480+ case PromiseHookType::kBefore :
481+ RunContextPromiseHookBefore (context, promise_or_capability,
482+ promiseHookFlags);
483+ RunPromiseHook (Runtime::kPromiseHookBefore , context,
484+ promise_or_capability, promiseHookFlags);
485+ break ;
486+ case PromiseHookType::kAfter :
487+ RunContextPromiseHookAfter (context, promise_or_capability,
488+ promiseHookFlags);
489+ RunPromiseHook (Runtime::kPromiseHookAfter , context,
490+ promise_or_capability, promiseHookFlags);
491+ break ;
492+ default :
493+ UNREACHABLE ();
494+ }
495+ Goto (&done_hook);
496+ }
497+ BIND (&done_hook);
498+ }
499+
467500void MicrotaskQueueBuiltinsAssembler::RunPromiseHook (
468501 Runtime::FunctionId id, TNode<Context> context,
469- TNode<HeapObject> promise_or_capability) {
502+ TNode<HeapObject> promise_or_capability,
503+ TNode<Uint32T> promiseHookFlags) {
470504 Label hook (this , Label::kDeferred ), done_hook (this );
471- Branch (IsPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate (), &hook,
472- &done_hook);
505+ Branch (IsIsolatePromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate (
506+ promiseHookFlags), &hook, &done_hook);
473507 BIND (&hook);
474508 {
475509 // Get to the underlying JSPromise instance.
0 commit comments