summaryrefslogtreecommitdiff
path: root/deps/v8/src/execution/isolate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/execution/isolate.cc')
-rw-r--r--deps/v8/src/execution/isolate.cc41
1 files changed, 29 insertions, 12 deletions
diff --git a/deps/v8/src/execution/isolate.cc b/deps/v8/src/execution/isolate.cc
index 6f7efe3986..7fa6d7774d 100644
--- a/deps/v8/src/execution/isolate.cc
+++ b/deps/v8/src/execution/isolate.cc
@@ -4045,19 +4045,23 @@ void Isolate::FireCallCompletedCallback(MicrotaskQueue* microtask_queue) {
}
}
-void Isolate::PromiseHookStateUpdated() {
- bool promise_hook_or_async_event_delegate =
- promise_hook_ || async_event_delegate_;
- bool promise_hook_or_debug_is_active_or_async_event_delegate =
- promise_hook_or_async_event_delegate || debug()->is_active();
- if (promise_hook_or_debug_is_active_or_async_event_delegate &&
- Protectors::IsPromiseHookIntact(this)) {
+void Isolate::UpdatePromiseHookProtector() {
+ if (Protectors::IsPromiseHookIntact(this)) {
HandleScope scope(this);
Protectors::InvalidatePromiseHook(this);
}
- promise_hook_or_async_event_delegate_ = promise_hook_or_async_event_delegate;
- promise_hook_or_debug_is_active_or_async_event_delegate_ =
- promise_hook_or_debug_is_active_or_async_event_delegate;
+}
+
+void Isolate::PromiseHookStateUpdated() {
+ promise_hook_flags_ =
+ (promise_hook_flags_ & PromiseHookFields::HasContextPromiseHook::kMask) |
+ PromiseHookFields::HasIsolatePromiseHook::encode(promise_hook_) |
+ PromiseHookFields::HasAsyncEventDelegate::encode(async_event_delegate_) |
+ PromiseHookFields::IsDebugActive::encode(debug()->is_active());
+
+ if (promise_hook_flags_ != 0) {
+ UpdatePromiseHookProtector();
+ }
}
namespace {
@@ -4357,17 +4361,30 @@ void Isolate::SetPromiseHook(PromiseHook hook) {
PromiseHookStateUpdated();
}
+void Isolate::RunAllPromiseHooks(PromiseHookType type,
+ Handle<JSPromise> promise,
+ Handle<Object> parent) {
+ if (HasContextPromiseHooks()) {
+ native_context()->RunPromiseHook(type, promise, parent);
+ }
+ if (HasIsolatePromiseHooks() || HasAsyncEventDelegate()) {
+ RunPromiseHook(type, promise, parent);
+ }
+}
+
void Isolate::RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise,
Handle<Object> parent) {
RunPromiseHookForAsyncEventDelegate(type, promise);
- if (promise_hook_ == nullptr) return;
+ if (!HasIsolatePromiseHooks()) return;
+ DCHECK(promise_hook_ != nullptr);
promise_hook_(type, v8::Utils::PromiseToLocal(promise),
v8::Utils::ToLocal(parent));
}
void Isolate::RunPromiseHookForAsyncEventDelegate(PromiseHookType type,
Handle<JSPromise> promise) {
- if (!async_event_delegate_) return;
+ if (!HasAsyncEventDelegate()) return;
+ DCHECK(async_event_delegate_ != nullptr);
switch (type) {
case PromiseHookType::kResolve:
return;