n-api: name CallbackBundle function fields · nodejs/node@169bff3
@@ -476,15 +476,6 @@ class TryCatch : public v8::TryCatch {
476476477477//=== Function napi_callback wrapper =================================
478478479-// TODO(somebody): these constants can be removed with relevant changes
480-// in CallbackWrapperBase<> and CallbackBundle.
481-// Leave them for now just to keep the change set and cognitive load minimal.
482-static const int kFunctionIndex = 0; // Used in CallbackBundle::cb[]
483-static const int kGetterIndex = 0; // Used in CallbackBundle::cb[]
484-static const int kSetterIndex = 1; // Used in CallbackBundle::cb[]
485-static const int kCallbackCount = 2; // Used in CallbackBundle::cb[]
486-// Max is "getter + setter" case
487-488479// Use this data structure to associate callback data with each N-API function
489480// exposed to JavaScript. The structure is stored in a v8::External which gets
490481// passed into our callback wrapper. This reduces the performance impact of
@@ -501,7 +492,8 @@ struct CallbackBundle {
501492502493 napi_env env; // Necessary to invoke C++ NAPI callback
503494void* cb_data; // The user provided callback data
504- napi_callback cb[kCallbackCount]; // Max capacity is 2 (getter + setter)
495+ napi_callback function_or_getter;
496+ napi_callback setter;
505497 node::Persistent<v8::Value> handle; // Die with this JavaScript object
506498507499private:
@@ -539,7 +531,7 @@ class CallbackWrapper {
539531void* _data;
540532};
541533542-template <typename Info, int kInternalFieldIndex>
534+template <typename Info, napi_callback CallbackBundle::*FunctionField>
543535class CallbackWrapperBase : public CallbackWrapper {
544536public:
545537CallbackWrapperBase(const Info& cbinfo, const size_t args_length)
@@ -561,7 +553,7 @@ class CallbackWrapperBase : public CallbackWrapper {
561553562554// All other pointers we need are stored in `_bundle`
563555 napi_env env = _bundle->env;
564- napi_callback cb = _bundle->cb[kInternalFieldIndex];
556+ napi_callback cb = _bundle->*FunctionField;
565557566558 napi_value result;
567559NAPI_CALL_INTO_MODULE_THROW(env, result = cb(env, cbinfo_wrapper));
@@ -577,7 +569,7 @@ class CallbackWrapperBase : public CallbackWrapper {
577569578570class FunctionCallbackWrapper
579571 : public CallbackWrapperBase<v8::FunctionCallbackInfo<v8::Value>,
580-kFunctionIndex> {
572+&CallbackBundle::function_or_getter> {
581573public:
582574static void Invoke(const v8::FunctionCallbackInfo<v8::Value>& info) {
583575 FunctionCallbackWrapper cbwrapper(info);
@@ -623,7 +615,7 @@ class FunctionCallbackWrapper
623615624616class GetterCallbackWrapper
625617 : public CallbackWrapperBase<v8::PropertyCallbackInfo<v8::Value>,
626-kGetterIndex> {
618+&CallbackBundle::function_or_getter> {
627619public:
628620static void Invoke(v8::Local<v8::Name> property,
629621const v8::PropertyCallbackInfo<v8::Value>& info) {
@@ -654,7 +646,8 @@ class GetterCallbackWrapper
654646};
655647656648class SetterCallbackWrapper
657- : public CallbackWrapperBase<v8::PropertyCallbackInfo<void>, kSetterIndex> {
649+ : public CallbackWrapperBase<v8::PropertyCallbackInfo<void>,
650+ &CallbackBundle::setter> {
658651public:
659652static void Invoke(v8::Local<v8::Name> property,
660653 v8::Local<v8::Value> value,
@@ -698,7 +691,7 @@ v8::Local<v8::Value> CreateFunctionCallbackData(napi_env env,
698691 napi_callback cb,
699692void* data) {
700693 CallbackBundle* bundle = new CallbackBundle();
701- bundle->cb[kFunctionIndex] = cb;
694+ bundle->function_or_getter = cb;
702695 bundle->cb_data = data;
703696 bundle->env = env;
704697 v8::Local<v8::Value> cbdata = v8::External::New(env->isolate, bundle);
@@ -716,8 +709,8 @@ v8::Local<v8::Value> CreateAccessorCallbackData(napi_env env,
716709 napi_callback setter,
717710void* data) {
718711 CallbackBundle* bundle = new CallbackBundle();
719- bundle->cb[kGetterIndex] = getter;
720- bundle->cb[kSetterIndex] = setter;
712+ bundle->function_or_getter = getter;
713+ bundle->setter = setter;
721714 bundle->cb_data = data;
722715 bundle->env = env;
723716 v8::Local<v8::Value> cbdata = v8::External::New(env->isolate, bundle);