@@ -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 (
@@ -199,7 +202,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
199202 const TNode<Object> thenable = LoadObjectField (
200203 microtask, PromiseResolveThenableJobTask::kThenableOffset );
201204
202- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
205+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
203206 CAST (promise_to_resolve));
204207
205208 {
@@ -208,7 +211,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
208211 promise_to_resolve, thenable, then);
209212 }
210213
211- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
214+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
212215 CAST (promise_to_resolve));
213216
214217 RewindEnteredContext (saved_entered_context_count);
@@ -243,8 +246,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
243246 BIND (&preserved_data_done);
244247
245248 // Run the promise before/debug hook if enabled.
246- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
247- promise_or_capability);
249+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
250+ promise_or_capability);
248251
249252 {
250253 ScopedExceptionHandler handler (this , &if_exception, &var_exception);
@@ -253,8 +256,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
253256 }
254257
255258 // Run the promise after/debug hook if enabled.
256- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
257- promise_or_capability);
259+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
260+ promise_or_capability);
258261
259262 Label preserved_data_reset_done (this );
260263 GotoIf (IsUndefined (preserved_embedder_data), &preserved_data_reset_done);
@@ -296,8 +299,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
296299 BIND (&preserved_data_done);
297300
298301 // Run the promise before/debug hook if enabled.
299- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
300- promise_or_capability);
302+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
303+ promise_or_capability);
301304
302305 {
303306 ScopedExceptionHandler handler (this , &if_exception, &var_exception);
@@ -306,8 +309,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
306309 }
307310
308311 // Run the promise after/debug hook if enabled.
309- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
310- promise_or_capability);
312+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
313+ promise_or_capability);
311314
312315 Label preserved_data_reset_done (this );
313316 GotoIf (IsUndefined (preserved_embedder_data), &preserved_data_reset_done);
@@ -465,12 +468,43 @@ void MicrotaskQueueBuiltinsAssembler::RewindEnteredContext(
465468 saved_entered_context_count);
466469}
467470
471+ void MicrotaskQueueBuiltinsAssembler::RunAllPromiseHooks (
472+ PromiseHookType type, TNode<Context> context,
473+ TNode<HeapObject> promise_or_capability) {
474+ Label hook (this , Label::kDeferred ), done_hook (this );
475+ TNode<Uint32T> promiseHookFlags = PromiseHookFlags ();
476+ Branch (IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate (
477+ promiseHookFlags), &hook, &done_hook);
478+ BIND (&hook);
479+ {
480+ switch (type) {
481+ case PromiseHookType::kBefore :
482+ RunContextPromiseHookBefore (context, promise_or_capability,
483+ promiseHookFlags);
484+ RunPromiseHook (Runtime::kPromiseHookBefore , context,
485+ promise_or_capability, promiseHookFlags);
486+ break ;
487+ case PromiseHookType::kAfter :
488+ RunContextPromiseHookAfter (context, promise_or_capability,
489+ promiseHookFlags);
490+ RunPromiseHook (Runtime::kPromiseHookAfter , context,
491+ promise_or_capability, promiseHookFlags);
492+ break ;
493+ default :
494+ UNREACHABLE ();
495+ }
496+ Goto (&done_hook);
497+ }
498+ BIND (&done_hook);
499+ }
500+
468501void MicrotaskQueueBuiltinsAssembler::RunPromiseHook (
469502 Runtime::FunctionId id, TNode<Context> context,
470- TNode<HeapObject> promise_or_capability) {
503+ TNode<HeapObject> promise_or_capability,
504+ TNode<Uint32T> promiseHookFlags) {
471505 Label hook (this , Label::kDeferred ), done_hook (this );
472- Branch (IsPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate (), &hook,
473- &done_hook);
506+ Branch (IsIsolatePromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate (
507+ promiseHookFlags), &hook, &done_hook);
474508 BIND (&hook);
475509 {
476510 // Get to the underlying JSPromise instance.
0 commit comments