diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-04-21 14:06:21 -0700 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-04-27 17:40:06 +0200 |
commit | e5a25cbc8524f0d57c66de85eeb4b1b4eacd6da8 (patch) | |
tree | b402582069f7eb5cc409bc1a7d3e9acb8ae59215 /src | |
parent | dca08152cbb6024376fe6280d5fdc956682a4046 (diff) | |
download | android-node-v8-e5a25cbc8524f0d57c66de85eeb4b1b4eacd6da8.tar.gz android-node-v8-e5a25cbc8524f0d57c66de85eeb4b1b4eacd6da8.tar.bz2 android-node-v8-e5a25cbc8524f0d57c66de85eeb4b1b4eacd6da8.zip |
src: expose `node::AddPromiseHook`
Expose `node::AddPromiseHook`, which wraps V8’s `SetPromiseHook` in
a way that allows multiple hooks to be set up.
PR-URL: https://github.com/nodejs/node/pull/12489
Reviewed-By: Matthew Loring <mattloring@google.com>
Reviewed-By: Julien Gilli <jgilli@nodejs.org>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/env.cc | 16 | ||||
-rw-r--r-- | src/env.h | 13 | ||||
-rw-r--r-- | src/node.cc | 6 | ||||
-rw-r--r-- | src/node.h | 11 |
4 files changed, 46 insertions, 0 deletions
diff --git a/src/env.cc b/src/env.cc index b44b435d4e..034625b375 100644 --- a/src/env.cc +++ b/src/env.cc @@ -188,4 +188,20 @@ void Environment::AtExit(void (*cb)(void* arg), void* arg) { at_exit_functions_.push_back(AtExitCallback{cb, arg}); } +void Environment::AddPromiseHook(promise_hook_func fn, void* arg) { + promise_hooks_.push_back(PromiseHookCallback{fn, arg}); + if (promise_hooks_.size() == 1) { + isolate_->SetPromiseHook(EnvPromiseHook); + } +} + +void Environment::EnvPromiseHook(v8::PromiseHookType type, + v8::Local<v8::Promise> promise, + v8::Local<v8::Value> parent) { + Environment* env = Environment::GetCurrent(promise->CreationContext()); + for (const PromiseHookCallback& hook : env->promise_hooks_) { + hook.cb_(type, promise, parent, hook.arg_); + } +} + } // namespace node @@ -35,6 +35,7 @@ #include "util.h" #include "uv.h" #include "v8.h" +#include "node.h" #include <list> #include <stdint.h> @@ -572,6 +573,8 @@ class Environment { static const int kContextEmbedderDataIndex = NODE_CONTEXT_EMBEDDER_DATA_INDEX; + void AddPromiseHook(promise_hook_func fn, void* arg); + private: inline void ThrowError(v8::Local<v8::Value> (*fun)(v8::Local<v8::String>), const char* errmsg); @@ -620,6 +623,16 @@ class Environment { }; std::list<AtExitCallback> at_exit_functions_; + struct PromiseHookCallback { + promise_hook_func cb_; + void* arg_; + }; + std::vector<PromiseHookCallback> promise_hooks_; + + static void EnvPromiseHook(v8::PromiseHookType type, + v8::Local<v8::Promise> promise, + v8::Local<v8::Value> parent); + #define V(PropertyName, TypeName) \ v8::Persistent<TypeName> PropertyName ## _; ENVIRONMENT_STRONG_PERSISTENT_PROPERTIES(V) diff --git a/src/node.cc b/src/node.cc index bb17a4139a..abb570fb9e 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1233,6 +1233,12 @@ void SetupPromises(const FunctionCallbackInfo<Value>& args) { } // anonymous namespace +void AddPromiseHook(v8::Isolate* isolate, promise_hook_func fn, void* arg) { + Environment* env = Environment::GetCurrent(isolate); + env->AddPromiseHook(fn, arg); +} + + Local<Value> MakeCallback(Environment* env, Local<Value> recv, const Local<Function> callback, diff --git a/src/node.h b/src/node.h index e0109cb14f..7ed4521e87 100644 --- a/src/node.h +++ b/src/node.h @@ -516,6 +516,17 @@ NODE_EXTERN void AtExit(void (*cb)(void* arg), void* arg = 0); */ NODE_EXTERN void AtExit(Environment* env, void (*cb)(void* arg), void* arg = 0); +typedef void (*promise_hook_func) (v8::PromiseHookType type, + v8::Local<v8::Promise> promise, + v8::Local<v8::Value> parent, + void* arg); + +/* Registers an additional v8::PromiseHook wrapper. This API exists because V8 + * itself supports only a single PromiseHook. */ +NODE_EXTERN void AddPromiseHook(v8::Isolate* isolate, + promise_hook_func fn, + void* arg); + } // namespace node #endif // SRC_NODE_H_ |