src: move InternalMakeCallback and MakeCallback
This commit moves InternalMakeCallback and MakeCallback into callback_scope.cc. Since these are just wrappers on top of `InternalCallbackScope`, this makes the implementations easier to find. https://github.com/nodejs/node/pull/25299 PR-URL: https://github.com/nodejs/node/pull/25299 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
b406c9c4e9
commit
e54d11e2f6
@ -5,11 +5,17 @@
|
|||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
|
using v8::Context;
|
||||||
|
using v8::EscapableHandleScope;
|
||||||
using v8::Function;
|
using v8::Function;
|
||||||
using v8::HandleScope;
|
using v8::HandleScope;
|
||||||
using v8::Isolate;
|
using v8::Isolate;
|
||||||
using v8::Local;
|
using v8::Local;
|
||||||
|
using v8::MaybeLocal;
|
||||||
|
using v8::NewStringType;
|
||||||
using v8::Object;
|
using v8::Object;
|
||||||
|
using v8::String;
|
||||||
|
using v8::Value;
|
||||||
|
|
||||||
using AsyncHooks = Environment::AsyncHooks;
|
using AsyncHooks = Environment::AsyncHooks;
|
||||||
|
|
||||||
@ -126,4 +132,129 @@ void InternalCallbackScope::Close() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MaybeLocal<Value> InternalMakeCallback(Environment* env,
|
||||||
|
Local<Object> recv,
|
||||||
|
const Local<Function> callback,
|
||||||
|
int argc,
|
||||||
|
Local<Value> argv[],
|
||||||
|
async_context asyncContext) {
|
||||||
|
CHECK(!recv.IsEmpty());
|
||||||
|
InternalCallbackScope scope(env, recv, asyncContext);
|
||||||
|
if (scope.Failed()) {
|
||||||
|
return MaybeLocal<Value>();
|
||||||
|
}
|
||||||
|
|
||||||
|
Local<Function> domain_cb = env->domain_callback();
|
||||||
|
MaybeLocal<Value> ret;
|
||||||
|
if (asyncContext.async_id != 0 || domain_cb.IsEmpty() || recv.IsEmpty()) {
|
||||||
|
ret = callback->Call(env->context(), recv, argc, argv);
|
||||||
|
} else {
|
||||||
|
std::vector<Local<Value>> args(1 + argc);
|
||||||
|
args[0] = callback;
|
||||||
|
std::copy(&argv[0], &argv[argc], args.begin() + 1);
|
||||||
|
ret = domain_cb->Call(env->context(), recv, args.size(), &args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret.IsEmpty()) {
|
||||||
|
scope.MarkAsFailed();
|
||||||
|
return MaybeLocal<Value>();
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.Close();
|
||||||
|
if (scope.Failed()) {
|
||||||
|
return MaybeLocal<Value>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public MakeCallback()s
|
||||||
|
|
||||||
|
MaybeLocal<Value> MakeCallback(Isolate* isolate,
|
||||||
|
Local<Object> recv,
|
||||||
|
const char* method,
|
||||||
|
int argc,
|
||||||
|
Local<Value> argv[],
|
||||||
|
async_context asyncContext) {
|
||||||
|
Local<String> method_string =
|
||||||
|
String::NewFromUtf8(isolate, method, NewStringType::kNormal)
|
||||||
|
.ToLocalChecked();
|
||||||
|
return MakeCallback(isolate, recv, method_string, argc, argv, asyncContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
MaybeLocal<Value> MakeCallback(Isolate* isolate,
|
||||||
|
Local<Object> recv,
|
||||||
|
Local<String> symbol,
|
||||||
|
int argc,
|
||||||
|
Local<Value> argv[],
|
||||||
|
async_context asyncContext) {
|
||||||
|
Local<Value> callback_v =
|
||||||
|
recv->Get(isolate->GetCurrentContext(), symbol).ToLocalChecked();
|
||||||
|
if (callback_v.IsEmpty()) return Local<Value>();
|
||||||
|
if (!callback_v->IsFunction()) return Local<Value>();
|
||||||
|
Local<Function> callback = callback_v.As<Function>();
|
||||||
|
return MakeCallback(isolate, recv, callback, argc, argv, asyncContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
MaybeLocal<Value> MakeCallback(Isolate* isolate,
|
||||||
|
Local<Object> recv,
|
||||||
|
Local<Function> callback,
|
||||||
|
int argc,
|
||||||
|
Local<Value> argv[],
|
||||||
|
async_context asyncContext) {
|
||||||
|
// Observe the following two subtleties:
|
||||||
|
//
|
||||||
|
// 1. The environment is retrieved from the callback function's context.
|
||||||
|
// 2. The context to enter is retrieved from the environment.
|
||||||
|
//
|
||||||
|
// Because of the AssignToContext() call in src/node_contextify.cc,
|
||||||
|
// the two contexts need not be the same.
|
||||||
|
Environment* env = Environment::GetCurrent(callback->CreationContext());
|
||||||
|
CHECK_NOT_NULL(env);
|
||||||
|
Context::Scope context_scope(env->context());
|
||||||
|
MaybeLocal<Value> ret =
|
||||||
|
InternalMakeCallback(env, recv, callback, argc, argv, asyncContext);
|
||||||
|
if (ret.IsEmpty() && env->makecallback_depth() == 0) {
|
||||||
|
// This is only for legacy compatiblity and we may want to look into
|
||||||
|
// removing/adjusting it.
|
||||||
|
return Undefined(env->isolate());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Legacy MakeCallback()s
|
||||||
|
|
||||||
|
Local<Value> MakeCallback(Isolate* isolate,
|
||||||
|
Local<Object> recv,
|
||||||
|
const char* method,
|
||||||
|
int argc,
|
||||||
|
Local<Value>* argv) {
|
||||||
|
EscapableHandleScope handle_scope(isolate);
|
||||||
|
return handle_scope.Escape(
|
||||||
|
MakeCallback(isolate, recv, method, argc, argv, {0, 0})
|
||||||
|
.FromMaybe(Local<Value>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Local<Value> MakeCallback(Isolate* isolate,
|
||||||
|
Local<Object> recv,
|
||||||
|
Local<String> symbol,
|
||||||
|
int argc,
|
||||||
|
Local<Value>* argv) {
|
||||||
|
EscapableHandleScope handle_scope(isolate);
|
||||||
|
return handle_scope.Escape(
|
||||||
|
MakeCallback(isolate, recv, symbol, argc, argv, {0, 0})
|
||||||
|
.FromMaybe(Local<Value>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Local<Value> MakeCallback(Isolate* isolate,
|
||||||
|
Local<Object> recv,
|
||||||
|
Local<Function> callback,
|
||||||
|
int argc,
|
||||||
|
Local<Value>* argv) {
|
||||||
|
EscapableHandleScope handle_scope(isolate);
|
||||||
|
return handle_scope.Escape(
|
||||||
|
MakeCallback(isolate, recv, callback, argc, argv, {0, 0})
|
||||||
|
.FromMaybe(Local<Value>()));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace node
|
} // namespace node
|
||||||
|
133
src/node.cc
133
src/node.cc
@ -109,7 +109,6 @@ using v8::Array;
|
|||||||
using v8::Boolean;
|
using v8::Boolean;
|
||||||
using v8::Context;
|
using v8::Context;
|
||||||
using v8::DEFAULT;
|
using v8::DEFAULT;
|
||||||
using v8::EscapableHandleScope;
|
|
||||||
using v8::Exception;
|
using v8::Exception;
|
||||||
using v8::Function;
|
using v8::Function;
|
||||||
using v8::FunctionCallbackInfo;
|
using v8::FunctionCallbackInfo;
|
||||||
@ -556,138 +555,6 @@ void RemoveEnvironmentCleanupHook(Isolate* isolate,
|
|||||||
env->RemoveCleanupHook(fun, arg);
|
env->RemoveCleanupHook(fun, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
MaybeLocal<Value> InternalMakeCallback(Environment* env,
|
|
||||||
Local<Object> recv,
|
|
||||||
const Local<Function> callback,
|
|
||||||
int argc,
|
|
||||||
Local<Value> argv[],
|
|
||||||
async_context asyncContext) {
|
|
||||||
CHECK(!recv.IsEmpty());
|
|
||||||
InternalCallbackScope scope(env, recv, asyncContext);
|
|
||||||
if (scope.Failed()) {
|
|
||||||
return MaybeLocal<Value>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Local<Function> domain_cb = env->domain_callback();
|
|
||||||
MaybeLocal<Value> ret;
|
|
||||||
if (asyncContext.async_id != 0 || domain_cb.IsEmpty() || recv.IsEmpty()) {
|
|
||||||
ret = callback->Call(env->context(), recv, argc, argv);
|
|
||||||
} else {
|
|
||||||
std::vector<Local<Value>> args(1 + argc);
|
|
||||||
args[0] = callback;
|
|
||||||
std::copy(&argv[0], &argv[argc], args.begin() + 1);
|
|
||||||
ret = domain_cb->Call(env->context(), recv, args.size(), &args[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret.IsEmpty()) {
|
|
||||||
scope.MarkAsFailed();
|
|
||||||
return MaybeLocal<Value>();
|
|
||||||
}
|
|
||||||
|
|
||||||
scope.Close();
|
|
||||||
if (scope.Failed()) {
|
|
||||||
return MaybeLocal<Value>();
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Public MakeCallback()s
|
|
||||||
|
|
||||||
|
|
||||||
MaybeLocal<Value> MakeCallback(Isolate* isolate,
|
|
||||||
Local<Object> recv,
|
|
||||||
const char* method,
|
|
||||||
int argc,
|
|
||||||
Local<Value> argv[],
|
|
||||||
async_context asyncContext) {
|
|
||||||
Local<String> method_string =
|
|
||||||
String::NewFromUtf8(isolate, method, NewStringType::kNormal)
|
|
||||||
.ToLocalChecked();
|
|
||||||
return MakeCallback(isolate, recv, method_string, argc, argv, asyncContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MaybeLocal<Value> MakeCallback(Isolate* isolate,
|
|
||||||
Local<Object> recv,
|
|
||||||
Local<String> symbol,
|
|
||||||
int argc,
|
|
||||||
Local<Value> argv[],
|
|
||||||
async_context asyncContext) {
|
|
||||||
Local<Value> callback_v = recv->Get(isolate->GetCurrentContext(),
|
|
||||||
symbol).ToLocalChecked();
|
|
||||||
if (callback_v.IsEmpty()) return Local<Value>();
|
|
||||||
if (!callback_v->IsFunction()) return Local<Value>();
|
|
||||||
Local<Function> callback = callback_v.As<Function>();
|
|
||||||
return MakeCallback(isolate, recv, callback, argc, argv, asyncContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MaybeLocal<Value> MakeCallback(Isolate* isolate,
|
|
||||||
Local<Object> recv,
|
|
||||||
Local<Function> callback,
|
|
||||||
int argc,
|
|
||||||
Local<Value> argv[],
|
|
||||||
async_context asyncContext) {
|
|
||||||
// Observe the following two subtleties:
|
|
||||||
//
|
|
||||||
// 1. The environment is retrieved from the callback function's context.
|
|
||||||
// 2. The context to enter is retrieved from the environment.
|
|
||||||
//
|
|
||||||
// Because of the AssignToContext() call in src/node_contextify.cc,
|
|
||||||
// the two contexts need not be the same.
|
|
||||||
Environment* env = Environment::GetCurrent(callback->CreationContext());
|
|
||||||
CHECK_NOT_NULL(env);
|
|
||||||
Context::Scope context_scope(env->context());
|
|
||||||
MaybeLocal<Value> ret = InternalMakeCallback(env, recv, callback,
|
|
||||||
argc, argv, asyncContext);
|
|
||||||
if (ret.IsEmpty() && env->makecallback_depth() == 0) {
|
|
||||||
// This is only for legacy compatiblity and we may want to look into
|
|
||||||
// removing/adjusting it.
|
|
||||||
return Undefined(env->isolate());
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Legacy MakeCallback()s
|
|
||||||
|
|
||||||
Local<Value> MakeCallback(Isolate* isolate,
|
|
||||||
Local<Object> recv,
|
|
||||||
const char* method,
|
|
||||||
int argc,
|
|
||||||
Local<Value>* argv) {
|
|
||||||
EscapableHandleScope handle_scope(isolate);
|
|
||||||
return handle_scope.Escape(
|
|
||||||
MakeCallback(isolate, recv, method, argc, argv, {0, 0})
|
|
||||||
.FromMaybe(Local<Value>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Local<Value> MakeCallback(Isolate* isolate,
|
|
||||||
Local<Object> recv,
|
|
||||||
Local<String> symbol,
|
|
||||||
int argc,
|
|
||||||
Local<Value>* argv) {
|
|
||||||
EscapableHandleScope handle_scope(isolate);
|
|
||||||
return handle_scope.Escape(
|
|
||||||
MakeCallback(isolate, recv, symbol, argc, argv, {0, 0})
|
|
||||||
.FromMaybe(Local<Value>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Local<Value> MakeCallback(Isolate* isolate,
|
|
||||||
Local<Object> recv,
|
|
||||||
Local<Function> callback,
|
|
||||||
int argc,
|
|
||||||
Local<Value>* argv) {
|
|
||||||
EscapableHandleScope handle_scope(isolate);
|
|
||||||
return handle_scope.Escape(
|
|
||||||
MakeCallback(isolate, recv, callback, argc, argv, {0, 0})
|
|
||||||
.FromMaybe(Local<Value>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void WaitForInspectorDisconnect(Environment* env) {
|
static void WaitForInspectorDisconnect(Environment* env) {
|
||||||
#if HAVE_INSPECTOR
|
#if HAVE_INSPECTOR
|
||||||
if (env->inspector_agent()->IsActive()) {
|
if (env->inspector_agent()->IsActive()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user