@@ -46,6 +46,8 @@ 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,
5052 TNode<HeapObject> promise_or_capability);
5153};
@@ -198,7 +200,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
198200 const TNode<Object> thenable = LoadObjectField (
199201 microtask, PromiseResolveThenableJobTask::kThenableOffset );
200202
201- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
203+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
202204 CAST (promise_to_resolve));
203205
204206 {
@@ -207,7 +209,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
207209 promise_to_resolve, thenable, then);
208210 }
209211
210- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
212+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
211213 CAST (promise_to_resolve));
212214
213215 RewindEnteredContext (saved_entered_context_count);
@@ -242,8 +244,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
242244 BIND (&preserved_data_done);
243245
244246 // Run the promise before/debug hook if enabled.
245- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
246- promise_or_capability);
247+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
248+ promise_or_capability);
247249
248250 {
249251 ScopedExceptionHandler handler (this , &if_exception, &var_exception);
@@ -252,8 +254,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
252254 }
253255
254256 // Run the promise after/debug hook if enabled.
255- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
256- promise_or_capability);
257+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
258+ promise_or_capability);
257259
258260 Label preserved_data_reset_done (this );
259261 GotoIf (IsUndefined (preserved_embedder_data), &preserved_data_reset_done);
@@ -295,8 +297,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
295297 BIND (&preserved_data_done);
296298
297299 // Run the promise before/debug hook if enabled.
298- RunPromiseHook (Runtime:: kPromiseHookBefore , microtask_context,
299- promise_or_capability);
300+ RunAllPromiseHooks (PromiseHookType:: kBefore , microtask_context,
301+ promise_or_capability);
300302
301303 {
302304 ScopedExceptionHandler handler (this , &if_exception, &var_exception);
@@ -305,8 +307,8 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
305307 }
306308
307309 // Run the promise after/debug hook if enabled.
308- RunPromiseHook (Runtime:: kPromiseHookAfter , microtask_context,
309- promise_or_capability);
310+ RunAllPromiseHooks (PromiseHookType:: kAfter , microtask_context,
311+ promise_or_capability);
310312
311313 Label preserved_data_reset_done (this );
312314 GotoIf (IsUndefined (preserved_embedder_data), &preserved_data_reset_done);
@@ -464,6 +466,32 @@ void MicrotaskQueueBuiltinsAssembler::RewindEnteredContext(
464466 saved_entered_context_count);
465467}
466468
469+ void MicrotaskQueueBuiltinsAssembler::RunAllPromiseHooks (
470+ PromiseHookType type, TNode<Context> context,
471+ TNode<HeapObject> promise_or_capability) {
472+ Label hook (this , Label::kDeferred ), done_hook (this );
473+ Branch (IsAnyPromiseHookEnabled (), &hook, &done_hook);
474+ BIND (&hook);
475+ {
476+ switch (type) {
477+ case PromiseHookType::kBefore :
478+ RunContextPromiseHookBefore (context, promise_or_capability);
479+ RunPromiseHook (Runtime::kPromiseHookBefore , context,
480+ promise_or_capability);
481+ break ;
482+ case PromiseHookType::kAfter :
483+ RunContextPromiseHookAfter (context, promise_or_capability);
484+ RunPromiseHook (Runtime::kPromiseHookAfter , context,
485+ promise_or_capability);
486+ break ;
487+ default :
488+ UNREACHABLE ();
489+ }
490+ Goto (&done_hook);
491+ }
492+ BIND (&done_hook);
493+ }
494+
467495void MicrotaskQueueBuiltinsAssembler::RunPromiseHook (
468496 Runtime::FunctionId id, TNode<Context> context,
469497 TNode<HeapObject> promise_or_capability) {
0 commit comments