@@ -476,15 +476,6 @@ class TryCatch : public v8::TryCatch {
476
476
477
477
// === Function napi_callback wrapper =================================
478
478
479
- // 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
-
488
479
// Use this data structure to associate callback data with each N-API function
489
480
// exposed to JavaScript. The structure is stored in a v8::External which gets
490
481
// passed into our callback wrapper. This reduces the performance impact of
@@ -501,7 +492,8 @@ struct CallbackBundle {
501
492
502
493
napi_env env; // Necessary to invoke C++ NAPI callback
503
494
void * 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;
505
497
node::Persistent<v8::Value> handle; // Die with this JavaScript object
506
498
507
499
private:
@@ -539,7 +531,7 @@ class CallbackWrapper {
539
531
void * _data;
540
532
};
541
533
542
- template <typename Info, int kInternalFieldIndex >
534
+ template <typename Info, napi_callback CallbackBundle::*FunctionField >
543
535
class CallbackWrapperBase : public CallbackWrapper {
544
536
public:
545
537
CallbackWrapperBase (const Info& cbinfo, const size_t args_length)
@@ -561,7 +553,7 @@ class CallbackWrapperBase : public CallbackWrapper {
561
553
562
554
// All other pointers we need are stored in `_bundle`
563
555
napi_env env = _bundle->env ;
564
- napi_callback cb = _bundle->cb [ kInternalFieldIndex ] ;
556
+ napi_callback cb = _bundle->*FunctionField ;
565
557
566
558
napi_value result;
567
559
NAPI_CALL_INTO_MODULE_THROW (env, result = cb (env, cbinfo_wrapper));
@@ -577,7 +569,7 @@ class CallbackWrapperBase : public CallbackWrapper {
577
569
578
570
class FunctionCallbackWrapper
579
571
: public CallbackWrapperBase<v8::FunctionCallbackInfo<v8::Value>,
580
- kFunctionIndex > {
572
+ &CallbackBundle::function_or_getter > {
581
573
public:
582
574
static void Invoke (const v8::FunctionCallbackInfo<v8::Value>& info) {
583
575
FunctionCallbackWrapper cbwrapper (info);
@@ -623,7 +615,7 @@ class FunctionCallbackWrapper
623
615
624
616
class GetterCallbackWrapper
625
617
: public CallbackWrapperBase<v8::PropertyCallbackInfo<v8::Value>,
626
- kGetterIndex > {
618
+ &CallbackBundle::function_or_getter > {
627
619
public:
628
620
static void Invoke (v8::Local<v8::Name> property,
629
621
const v8::PropertyCallbackInfo<v8::Value>& info) {
@@ -654,7 +646,8 @@ class GetterCallbackWrapper
654
646
};
655
647
656
648
class SetterCallbackWrapper
657
- : public CallbackWrapperBase<v8::PropertyCallbackInfo<void >, kSetterIndex > {
649
+ : public CallbackWrapperBase<v8::PropertyCallbackInfo<void >,
650
+ &CallbackBundle::setter> {
658
651
public:
659
652
static void Invoke (v8::Local<v8::Name> property,
660
653
v8::Local<v8::Value> value,
@@ -698,7 +691,7 @@ v8::Local<v8::Value> CreateFunctionCallbackData(napi_env env,
698
691
napi_callback cb,
699
692
void * data) {
700
693
CallbackBundle* bundle = new CallbackBundle ();
701
- bundle->cb [ kFunctionIndex ] = cb;
694
+ bundle->function_or_getter = cb;
702
695
bundle->cb_data = data;
703
696
bundle->env = env;
704
697
v8::Local<v8::Value> cbdata = v8::External::New (env->isolate , bundle);
@@ -716,8 +709,8 @@ v8::Local<v8::Value> CreateAccessorCallbackData(napi_env env,
716
709
napi_callback setter,
717
710
void * data) {
718
711
CallbackBundle* bundle = new CallbackBundle ();
719
- bundle->cb [ kGetterIndex ] = getter;
720
- bundle->cb [ kSetterIndex ] = setter;
712
+ bundle->function_or_getter = getter;
713
+ bundle->setter = setter;
721
714
bundle->cb_data = data;
722
715
bundle->env = env;
723
716
v8::Local<v8::Value> cbdata = v8::External::New (env->isolate , bundle);
0 commit comments