n-api: name CallbackBundle function fields
Use field names rather than indices. Refs: https://github.com/nodejs/node/pull/21072 PR-URL: https://github.com/nodejs/node/pull/21240 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Minwoo Jung <minwoo@nodesource.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
This commit is contained in:
parent
52bb84b47d
commit
2a08925896
@ -476,15 +476,6 @@ class TryCatch : public v8::TryCatch {
|
|||||||
|
|
||||||
//=== Function napi_callback wrapper =================================
|
//=== Function napi_callback wrapper =================================
|
||||||
|
|
||||||
// TODO(somebody): these constants can be removed with relevant changes
|
|
||||||
// in CallbackWrapperBase<> and CallbackBundle.
|
|
||||||
// Leave them for now just to keep the change set and cognitive load minimal.
|
|
||||||
static const int kFunctionIndex = 0; // Used in CallbackBundle::cb[]
|
|
||||||
static const int kGetterIndex = 0; // Used in CallbackBundle::cb[]
|
|
||||||
static const int kSetterIndex = 1; // Used in CallbackBundle::cb[]
|
|
||||||
static const int kCallbackCount = 2; // Used in CallbackBundle::cb[]
|
|
||||||
// Max is "getter + setter" case
|
|
||||||
|
|
||||||
// Use this data structure to associate callback data with each N-API function
|
// Use this data structure to associate callback data with each N-API function
|
||||||
// exposed to JavaScript. The structure is stored in a v8::External which gets
|
// exposed to JavaScript. The structure is stored in a v8::External which gets
|
||||||
// passed into our callback wrapper. This reduces the performance impact of
|
// passed into our callback wrapper. This reduces the performance impact of
|
||||||
@ -501,7 +492,8 @@ struct CallbackBundle {
|
|||||||
|
|
||||||
napi_env env; // Necessary to invoke C++ NAPI callback
|
napi_env env; // Necessary to invoke C++ NAPI callback
|
||||||
void* cb_data; // The user provided callback data
|
void* cb_data; // The user provided callback data
|
||||||
napi_callback cb[kCallbackCount]; // Max capacity is 2 (getter + setter)
|
napi_callback function_or_getter;
|
||||||
|
napi_callback setter;
|
||||||
node::Persistent<v8::Value> handle; // Die with this JavaScript object
|
node::Persistent<v8::Value> handle; // Die with this JavaScript object
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -539,7 +531,7 @@ class CallbackWrapper {
|
|||||||
void* _data;
|
void* _data;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Info, int kInternalFieldIndex>
|
template <typename Info, napi_callback CallbackBundle::*FunctionField>
|
||||||
class CallbackWrapperBase : public CallbackWrapper {
|
class CallbackWrapperBase : public CallbackWrapper {
|
||||||
public:
|
public:
|
||||||
CallbackWrapperBase(const Info& cbinfo, const size_t args_length)
|
CallbackWrapperBase(const Info& cbinfo, const size_t args_length)
|
||||||
@ -561,7 +553,7 @@ class CallbackWrapperBase : public CallbackWrapper {
|
|||||||
|
|
||||||
// All other pointers we need are stored in `_bundle`
|
// All other pointers we need are stored in `_bundle`
|
||||||
napi_env env = _bundle->env;
|
napi_env env = _bundle->env;
|
||||||
napi_callback cb = _bundle->cb[kInternalFieldIndex];
|
napi_callback cb = _bundle->*FunctionField;
|
||||||
|
|
||||||
napi_value result;
|
napi_value result;
|
||||||
NAPI_CALL_INTO_MODULE_THROW(env, result = cb(env, cbinfo_wrapper));
|
NAPI_CALL_INTO_MODULE_THROW(env, result = cb(env, cbinfo_wrapper));
|
||||||
@ -577,7 +569,7 @@ class CallbackWrapperBase : public CallbackWrapper {
|
|||||||
|
|
||||||
class FunctionCallbackWrapper
|
class FunctionCallbackWrapper
|
||||||
: public CallbackWrapperBase<v8::FunctionCallbackInfo<v8::Value>,
|
: public CallbackWrapperBase<v8::FunctionCallbackInfo<v8::Value>,
|
||||||
kFunctionIndex> {
|
&CallbackBundle::function_or_getter> {
|
||||||
public:
|
public:
|
||||||
static void Invoke(const v8::FunctionCallbackInfo<v8::Value>& info) {
|
static void Invoke(const v8::FunctionCallbackInfo<v8::Value>& info) {
|
||||||
FunctionCallbackWrapper cbwrapper(info);
|
FunctionCallbackWrapper cbwrapper(info);
|
||||||
@ -623,7 +615,7 @@ class FunctionCallbackWrapper
|
|||||||
|
|
||||||
class GetterCallbackWrapper
|
class GetterCallbackWrapper
|
||||||
: public CallbackWrapperBase<v8::PropertyCallbackInfo<v8::Value>,
|
: public CallbackWrapperBase<v8::PropertyCallbackInfo<v8::Value>,
|
||||||
kGetterIndex> {
|
&CallbackBundle::function_or_getter> {
|
||||||
public:
|
public:
|
||||||
static void Invoke(v8::Local<v8::Name> property,
|
static void Invoke(v8::Local<v8::Name> property,
|
||||||
const v8::PropertyCallbackInfo<v8::Value>& info) {
|
const v8::PropertyCallbackInfo<v8::Value>& info) {
|
||||||
@ -654,7 +646,8 @@ class GetterCallbackWrapper
|
|||||||
};
|
};
|
||||||
|
|
||||||
class SetterCallbackWrapper
|
class SetterCallbackWrapper
|
||||||
: public CallbackWrapperBase<v8::PropertyCallbackInfo<void>, kSetterIndex> {
|
: public CallbackWrapperBase<v8::PropertyCallbackInfo<void>,
|
||||||
|
&CallbackBundle::setter> {
|
||||||
public:
|
public:
|
||||||
static void Invoke(v8::Local<v8::Name> property,
|
static void Invoke(v8::Local<v8::Name> property,
|
||||||
v8::Local<v8::Value> value,
|
v8::Local<v8::Value> value,
|
||||||
@ -698,7 +691,7 @@ v8::Local<v8::Value> CreateFunctionCallbackData(napi_env env,
|
|||||||
napi_callback cb,
|
napi_callback cb,
|
||||||
void* data) {
|
void* data) {
|
||||||
CallbackBundle* bundle = new CallbackBundle();
|
CallbackBundle* bundle = new CallbackBundle();
|
||||||
bundle->cb[kFunctionIndex] = cb;
|
bundle->function_or_getter = cb;
|
||||||
bundle->cb_data = data;
|
bundle->cb_data = data;
|
||||||
bundle->env = env;
|
bundle->env = env;
|
||||||
v8::Local<v8::Value> cbdata = v8::External::New(env->isolate, bundle);
|
v8::Local<v8::Value> cbdata = v8::External::New(env->isolate, bundle);
|
||||||
@ -716,8 +709,8 @@ v8::Local<v8::Value> CreateAccessorCallbackData(napi_env env,
|
|||||||
napi_callback setter,
|
napi_callback setter,
|
||||||
void* data) {
|
void* data) {
|
||||||
CallbackBundle* bundle = new CallbackBundle();
|
CallbackBundle* bundle = new CallbackBundle();
|
||||||
bundle->cb[kGetterIndex] = getter;
|
bundle->function_or_getter = getter;
|
||||||
bundle->cb[kSetterIndex] = setter;
|
bundle->setter = setter;
|
||||||
bundle->cb_data = data;
|
bundle->cb_data = data;
|
||||||
bundle->env = env;
|
bundle->env = env;
|
||||||
v8::Local<v8::Value> cbdata = v8::External::New(env->isolate, bundle);
|
v8::Local<v8::Value> cbdata = v8::External::New(env->isolate, bundle);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user