src: refactor emit before/after/promiseResolve

Currently EmitBefore, EmitAfter, EmitPromiseResolve are very similar.
This commit suggests extracting the code they have in common to a new
function to reduce code duplication.

PR-URL: https://github.com/nodejs/node/pull/19295
Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
Daniel Bevenius 2018-03-12 10:45:48 +01:00
parent 90b0538273
commit 861285abb5

View File

@ -162,19 +162,25 @@ static void DestroyAsyncIdsCallback(void* arg) {
}
void AsyncWrap::EmitPromiseResolve(Environment* env, double async_id) {
void Emit(Environment* env, double async_id, AsyncHooks::Fields type,
Local<Function> fn) {
AsyncHooks* async_hooks = env->async_hooks();
if (async_hooks->fields()[AsyncHooks::kPromiseResolve] == 0)
if (async_hooks->fields()[type] == 0)
return;
Local<Value> async_id_value = Number::New(env->isolate(), async_id);
Local<Function> fn = env->async_hooks_promise_resolve_function();
FatalTryCatch try_catch(env);
USE(fn->Call(env->context(), Undefined(env->isolate()), 1, &async_id_value));
}
void AsyncWrap::EmitPromiseResolve(Environment* env, double async_id) {
Emit(env, async_id, AsyncHooks::kPromiseResolve,
env->async_hooks_promise_resolve_function());
}
void AsyncWrap::EmitTraceEventBefore() {
switch (provider_type()) {
#define V(PROVIDER) \
@ -192,15 +198,8 @@ void AsyncWrap::EmitTraceEventBefore() {
void AsyncWrap::EmitBefore(Environment* env, double async_id) {
AsyncHooks* async_hooks = env->async_hooks();
if (async_hooks->fields()[AsyncHooks::kBefore] == 0)
return;
Local<Value> async_id_value = Number::New(env->isolate(), async_id);
Local<Function> fn = env->async_hooks_before_function();
FatalTryCatch try_catch(env);
USE(fn->Call(env->context(), Undefined(env->isolate()), 1, &async_id_value));
Emit(env, async_id, AsyncHooks::kBefore,
env->async_hooks_before_function());
}
@ -221,17 +220,10 @@ void AsyncWrap::EmitTraceEventAfter() {
void AsyncWrap::EmitAfter(Environment* env, double async_id) {
AsyncHooks* async_hooks = env->async_hooks();
if (async_hooks->fields()[AsyncHooks::kAfter] == 0)
return;
// If the user's callback failed then the after() hooks will be called at the
// end of _fatalException().
Local<Value> async_id_value = Number::New(env->isolate(), async_id);
Local<Function> fn = env->async_hooks_after_function();
FatalTryCatch try_catch(env);
USE(fn->Call(env->context(), Undefined(env->isolate()), 1, &async_id_value));
Emit(env, async_id, AsyncHooks::kAfter,
env->async_hooks_after_function());
}
class PromiseWrap : public AsyncWrap {