@@ -898,47 +898,66 @@ inline const T* TypedArray_<T,A>::Data() const {
898
898
// Function class
899
899
// //////////////////////////////////////////////////////////////////////////////
900
900
901
- inline Function Function::New (napi_env env,
902
- VoidFunctionCallback cb,
903
- const char * utf8name,
904
- void * data) {
905
- // TODO: Delete when the function is destroyed
906
- VoidFunctionCallbackData* callbackData = new VoidFunctionCallbackData ({ cb, data });
901
+ // Helpers to handle functions exposed from C++.
902
+ namespace details {
907
903
908
- // TODO: set the function name
909
- napi_value value;
910
- napi_status status = napi_create_function (
911
- env, utf8name, VoidFunctionCallbackWrapper, callbackData, &value);
912
- if (status != napi_ok) throw Error::New (env);
913
- return Function (env, value);
914
- }
904
+ template <typename Callable, typename Return>
905
+ struct CallbackData {
906
+ static inline
907
+ napi_value Wrapper (napi_env env, napi_callback_info info) {
908
+ try {
909
+ CallbackInfo callbackInfo (env, info);
910
+ CallbackData* callbackData =
911
+ static_cast <CallbackData*>(callbackInfo.Data ());
912
+ return callbackData->callback (callbackInfo);
913
+ }
914
+ NAPI_RETHROW_JS_ERROR (env)
915
+ }
916
+
917
+ Callable callback;
918
+ };
915
919
920
+ template <typename Callable>
921
+ struct CallbackData <Callable, void > {
922
+ static inline
923
+ napi_value Wrapper (napi_env env, napi_callback_info info) {
924
+ try {
925
+ CallbackInfo callbackInfo (env, info);
926
+ CallbackData* callbackData =
927
+ static_cast <CallbackData*>(callbackInfo.Data ());
928
+ callbackData->callback (callbackInfo);
929
+ return nullptr ;
930
+ }
931
+ NAPI_RETHROW_JS_ERROR (env)
932
+ }
933
+
934
+ Callable callback;
935
+ };
936
+
937
+ } // namespace details
938
+
939
+ template <typename Callable>
916
940
inline Function Function::New (napi_env env,
917
- FunctionCallback cb,
918
- const char * utf8name,
919
- void * data) {
941
+ Callable cb,
942
+ const char * utf8name) {
943
+ typedef decltype (cb (CallbackInfo (nullptr , nullptr ))) ReturnType;
944
+ typedef details::CallbackData<Callable, ReturnType> CbData;
920
945
// TODO: Delete when the function is destroyed
921
- FunctionCallbackData* callbackData = new FunctionCallbackData ({cb, data });
946
+ auto callbackData = new CbData ({ cb });
922
947
948
+ // TODO: set the function name
923
949
napi_value value;
924
950
napi_status status = napi_create_function (
925
- env, utf8name, FunctionCallbackWrapper , callbackData, &value);
951
+ env, utf8name, CbData::Wrapper , callbackData, &value);
926
952
if (status != napi_ok) throw Error::New (env);
927
953
return Function (env, value);
928
954
}
929
955
956
+ template <typename Callable>
930
957
inline Function Function::New (napi_env env,
931
- VoidFunctionCallback cb,
932
- const std::string& utf8name,
933
- void * data) {
934
- return New (env, cb, utf8name.c_str (), data);
935
- }
936
-
937
- inline Function Function::New (napi_env env,
938
- FunctionCallback cb,
939
- const std::string& utf8name,
940
- void * data) {
941
- return New (env, cb, utf8name.c_str (), data);
958
+ Callable cb,
959
+ const std::string& utf8name) {
960
+ return New (env, cb, utf8name.c_str ());
942
961
}
943
962
944
963
inline Function::Function () : Object() {
@@ -1017,27 +1036,6 @@ inline Object Function::New(const std::vector<napi_value>& args) const {
1017
1036
return Object (_env, result);
1018
1037
}
1019
1038
1020
- inline napi_value Function::VoidFunctionCallbackWrapper (napi_env env, napi_callback_info info) {
1021
- try {
1022
- CallbackInfo callbackInfo (env, info);
1023
- VoidFunctionCallbackData* callbackData =
1024
- reinterpret_cast <VoidFunctionCallbackData*>(callbackInfo.Data ());
1025
- callbackData->callback (callbackInfo);
1026
- return nullptr ;
1027
- }
1028
- NAPI_RETHROW_JS_ERROR (env)
1029
- }
1030
-
1031
- inline napi_value Function::FunctionCallbackWrapper (napi_env env, napi_callback_info info) {
1032
- try {
1033
- CallbackInfo callbackInfo (env, info);
1034
- FunctionCallbackData* callbackData =
1035
- reinterpret_cast <FunctionCallbackData*>(callbackInfo.Data ());
1036
- return callbackData->callback (callbackInfo);
1037
- }
1038
- NAPI_RETHROW_JS_ERROR (env)
1039
- }
1040
-
1041
1039
// //////////////////////////////////////////////////////////////////////////////
1042
1040
// Buffer<T> class
1043
1041
// //////////////////////////////////////////////////////////////////////////////
0 commit comments