|
11 | 11 | #endif
|
12 | 12 |
|
13 | 13 | #include <stdio.h>
|
| 14 | +#include <algorithm> |
14 | 15 |
|
15 | 16 | namespace node {
|
16 | 17 |
|
@@ -178,12 +179,36 @@ void Environment::AtExit(void (*cb)(void* arg), void* arg) {
|
178 | 179 | }
|
179 | 180 |
|
180 | 181 | void Environment::AddPromiseHook(promise_hook_func fn, void* arg) {
|
| 182 | + auto it = std::find_if( |
| 183 | + promise_hooks_.begin(), promise_hooks_.end(), |
| 184 | + [&](const PromiseHookCallback& hook) { |
| 185 | + return hook.cb_ == fn && hook.arg_ == arg; |
| 186 | + }); |
| 187 | + CHECK_EQ(it, promise_hooks_.end()); |
181 | 188 | promise_hooks_.push_back(PromiseHookCallback{fn, arg});
|
| 189 | + |
182 | 190 | if (promise_hooks_.size() == 1) {
|
183 | 191 | isolate_->SetPromiseHook(EnvPromiseHook);
|
184 | 192 | }
|
185 | 193 | }
|
186 | 194 |
|
| 195 | +bool Environment::RemovePromiseHook(promise_hook_func fn, void* arg) { |
| 196 | + auto it = std::find_if( |
| 197 | + promise_hooks_.begin(), promise_hooks_.end(), |
| 198 | + [&](const PromiseHookCallback& hook) { |
| 199 | + return hook.cb_ == fn && hook.arg_ == arg; |
| 200 | + }); |
| 201 | + |
| 202 | + if (it == promise_hooks_.end()) return false; |
| 203 | + |
| 204 | + promise_hooks_.erase(it); |
| 205 | + if (promise_hooks_.empty()) { |
| 206 | + isolate_->SetPromiseHook(nullptr); |
| 207 | + } |
| 208 | + |
| 209 | + return true; |
| 210 | +} |
| 211 | + |
187 | 212 | void Environment::EnvPromiseHook(v8::PromiseHookType type,
|
188 | 213 | v8::Local<v8::Promise> promise,
|
189 | 214 | v8::Local<v8::Value> parent) {
|
|
0 commit comments