|
14 | 14 |
|
15 | 15 | namespace Napi {
|
16 | 16 |
|
| 17 | +// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions |
| 18 | +// and rethrow them as JavaScript exceptions before returning from the callback. |
| 19 | +#define NAPI_RETHROW_JS_ERROR(env) \ |
| 20 | + catch (const Error& e) { \ |
| 21 | + e.ThrowAsJavaScriptException(); \ |
| 22 | + return nullptr; \ |
| 23 | + } |
| 24 | + |
| 25 | +// Helpers to handle functions exposed from C++. |
| 26 | +namespace details { |
| 27 | + |
| 28 | +template <typename Callable, typename Return> |
| 29 | +struct CallbackData { |
| 30 | + static inline |
| 31 | + napi_value Wrapper(napi_env env, napi_callback_info info) { |
| 32 | + try { |
| 33 | + CallbackInfo callbackInfo(env, info); |
| 34 | + CallbackData* callbackData = |
| 35 | + static_cast<CallbackData*>(callbackInfo.Data()); |
| 36 | + callbackInfo.SetData(callbackData->data); |
| 37 | + return callbackData->callback(callbackInfo); |
| 38 | + } |
| 39 | + NAPI_RETHROW_JS_ERROR(env) |
| 40 | + } |
| 41 | + |
| 42 | + Callable callback; |
| 43 | + void* data; |
| 44 | +}; |
| 45 | + |
| 46 | +template <typename Callable> |
| 47 | +struct CallbackData<Callable, void> { |
| 48 | + static inline |
| 49 | + napi_value Wrapper(napi_env env, napi_callback_info info) { |
| 50 | + try { |
| 51 | + CallbackInfo callbackInfo(env, info); |
| 52 | + CallbackData* callbackData = |
| 53 | + static_cast<CallbackData*>(callbackInfo.Data()); |
| 54 | + callbackInfo.SetData(callbackData->data); |
| 55 | + callbackData->callback(callbackInfo); |
| 56 | + return nullptr; |
| 57 | + } |
| 58 | + NAPI_RETHROW_JS_ERROR(env) |
| 59 | + } |
| 60 | + |
| 61 | + Callable callback; |
| 62 | + void* data; |
| 63 | +}; |
| 64 | + |
| 65 | +template <typename T, typename Finalizer, typename Hint = void> |
| 66 | +struct FinalizeData { |
| 67 | + static inline |
| 68 | + void Wrapper(napi_env env, void* data, void* finalizeHint) { |
| 69 | + FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint); |
| 70 | + finalizeData->callback(Env(env), static_cast<T*>(data)); |
| 71 | + delete finalizeData; |
| 72 | + } |
| 73 | + |
| 74 | + static inline |
| 75 | + void WrapperWithHint(napi_env env, void* data, void* finalizeHint) { |
| 76 | + FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint); |
| 77 | + finalizeData->callback(Env(env), static_cast<T*>(data), finalizeData->hint); |
| 78 | + delete finalizeData; |
| 79 | + } |
| 80 | + |
| 81 | + Finalizer callback; |
| 82 | + Hint* hint; |
| 83 | +}; |
| 84 | + |
| 85 | +template <typename Getter, typename Setter> |
| 86 | +struct AccessorCallbackData { |
| 87 | + static inline |
| 88 | + napi_value GetterWrapper(napi_env env, napi_callback_info info) { |
| 89 | + try { |
| 90 | + CallbackInfo callbackInfo(env, info); |
| 91 | + AccessorCallbackData* callbackData = |
| 92 | + static_cast<AccessorCallbackData*>(callbackInfo.Data()); |
| 93 | + return callbackData->getterCallback(callbackInfo); |
| 94 | + } |
| 95 | + NAPI_RETHROW_JS_ERROR(env) |
| 96 | + } |
| 97 | + |
| 98 | + static inline |
| 99 | + napi_value SetterWrapper(napi_env env, napi_callback_info info) { |
| 100 | + try { |
| 101 | + CallbackInfo callbackInfo(env, info); |
| 102 | + AccessorCallbackData* callbackData = |
| 103 | + static_cast<AccessorCallbackData*>(callbackInfo.Data()); |
| 104 | + callbackData->setterCallback(callbackInfo); |
| 105 | + return nullptr; |
| 106 | + } |
| 107 | + NAPI_RETHROW_JS_ERROR(env) |
| 108 | + } |
| 109 | + |
| 110 | + Getter getterCallback; |
| 111 | + Setter setterCallback; |
| 112 | +}; |
| 113 | + |
| 114 | +} // namespace details |
| 115 | + |
17 | 116 | ////////////////////////////////////////////////////////////////////////////////
|
18 | 117 | // Module registration
|
19 | 118 | ////////////////////////////////////////////////////////////////////////////////
|
@@ -44,14 +143,6 @@ inline void RegisterModule(napi_env env,
|
44 | 143 | }
|
45 | 144 | }
|
46 | 145 |
|
47 |
| -// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions |
48 |
| -// and rethrow them as JavaScript exceptions before returning from the callback. |
49 |
| -#define NAPI_RETHROW_JS_ERROR(env) \ |
50 |
| - catch (const Error& e) { \ |
51 |
| - e.ThrowAsJavaScriptException(); \ |
52 |
| - return nullptr; \ |
53 |
| - } |
54 |
| - |
55 | 146 | ////////////////////////////////////////////////////////////////////////////////
|
56 | 147 | // Env class
|
57 | 148 | ////////////////////////////////////////////////////////////////////////////////
|
@@ -1063,97 +1154,6 @@ inline const T* TypedArray_<T,A>::Data() const {
|
1063 | 1154 | // Function class
|
1064 | 1155 | ////////////////////////////////////////////////////////////////////////////////
|
1065 | 1156 |
|
1066 |
| -// Helpers to handle functions exposed from C++. |
1067 |
| -namespace details { |
1068 |
| - |
1069 |
| -template <typename Callable, typename Return> |
1070 |
| -struct CallbackData { |
1071 |
| - static inline |
1072 |
| - napi_value Wrapper(napi_env env, napi_callback_info info) { |
1073 |
| - try { |
1074 |
| - CallbackInfo callbackInfo(env, info); |
1075 |
| - CallbackData* callbackData = |
1076 |
| - static_cast<CallbackData*>(callbackInfo.Data()); |
1077 |
| - callbackInfo.SetData(callbackData->data); |
1078 |
| - return callbackData->callback(callbackInfo); |
1079 |
| - } |
1080 |
| - NAPI_RETHROW_JS_ERROR(env) |
1081 |
| - } |
1082 |
| - |
1083 |
| - Callable callback; |
1084 |
| - void* data; |
1085 |
| -}; |
1086 |
| - |
1087 |
| -template <typename Callable> |
1088 |
| -struct CallbackData<Callable, void> { |
1089 |
| - static inline |
1090 |
| - napi_value Wrapper(napi_env env, napi_callback_info info) { |
1091 |
| - try { |
1092 |
| - CallbackInfo callbackInfo(env, info); |
1093 |
| - CallbackData* callbackData = |
1094 |
| - static_cast<CallbackData*>(callbackInfo.Data()); |
1095 |
| - callbackInfo.SetData(callbackData->data); |
1096 |
| - callbackData->callback(callbackInfo); |
1097 |
| - return nullptr; |
1098 |
| - } |
1099 |
| - NAPI_RETHROW_JS_ERROR(env) |
1100 |
| - } |
1101 |
| - |
1102 |
| - Callable callback; |
1103 |
| - void* data; |
1104 |
| -}; |
1105 |
| - |
1106 |
| -template <typename T, typename Finalizer, typename Hint = void> |
1107 |
| -struct FinalizeData { |
1108 |
| - static inline |
1109 |
| - void Wrapper(napi_env env, void* data, void* finalizeHint) { |
1110 |
| - FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint); |
1111 |
| - finalizeData->callback(Env(env), static_cast<T*>(data)); |
1112 |
| - delete finalizeData; |
1113 |
| - } |
1114 |
| - |
1115 |
| - static inline |
1116 |
| - void WrapperWithHint(napi_env env, void* data, void* finalizeHint) { |
1117 |
| - FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint); |
1118 |
| - finalizeData->callback(Env(env), static_cast<T*>(data), finalizeData->hint); |
1119 |
| - delete finalizeData; |
1120 |
| - } |
1121 |
| - |
1122 |
| - Finalizer callback; |
1123 |
| - Hint* hint; |
1124 |
| -}; |
1125 |
| - |
1126 |
| -template <typename Getter, typename Setter> |
1127 |
| -struct AccessorCallbackData { |
1128 |
| - static inline |
1129 |
| - napi_value GetterWrapper(napi_env env, napi_callback_info info) { |
1130 |
| - try { |
1131 |
| - CallbackInfo callbackInfo(env, info); |
1132 |
| - AccessorCallbackData* callbackData = |
1133 |
| - static_cast<AccessorCallbackData*>(callbackInfo.Data()); |
1134 |
| - return callbackData->getterCallback(callbackInfo); |
1135 |
| - } |
1136 |
| - NAPI_RETHROW_JS_ERROR(env) |
1137 |
| - } |
1138 |
| - |
1139 |
| - static inline |
1140 |
| - napi_value SetterWrapper(napi_env env, napi_callback_info info) { |
1141 |
| - try { |
1142 |
| - CallbackInfo callbackInfo(env, info); |
1143 |
| - AccessorCallbackData* callbackData = |
1144 |
| - static_cast<AccessorCallbackData*>(callbackInfo.Data()); |
1145 |
| - callbackData->setterCallback(callbackInfo); |
1146 |
| - return nullptr; |
1147 |
| - } |
1148 |
| - NAPI_RETHROW_JS_ERROR(env) |
1149 |
| - } |
1150 |
| - |
1151 |
| - Getter getterCallback; |
1152 |
| - Setter setterCallback; |
1153 |
| -}; |
1154 |
| - |
1155 |
| -} // namespace details |
1156 |
| - |
1157 | 1157 | template <typename Callable>
|
1158 | 1158 | inline Function Function::New(napi_env env,
|
1159 | 1159 | Callable cb,
|
@@ -1371,8 +1371,6 @@ inline void Buffer<T>::EnsureInfo() const {
|
1371 | 1371 | ////////////////////////////////////////////////////////////////////////////////
|
1372 | 1372 |
|
1373 | 1373 | inline Error Error::New(napi_env env) {
|
1374 |
| - HandleScope scope(env); |
1375 |
| - |
1376 | 1374 | napi_status status;
|
1377 | 1375 | napi_value error = nullptr;
|
1378 | 1376 | if (Napi::Env(env).IsExceptionPending()) {
|
@@ -2656,7 +2654,7 @@ inline void AsyncWorker::OnOK() {
|
2656 | 2654 | _callback.MakeCallback(_receiver.Value(), {});
|
2657 | 2655 | }
|
2658 | 2656 |
|
2659 |
| -inline void AsyncWorker::OnError(Error& e) { |
| 2657 | +inline void AsyncWorker::OnError(const Error& e) { |
2660 | 2658 | _callback.MakeCallback(_receiver.Value(), { e.Value() });
|
2661 | 2659 | }
|
2662 | 2660 |
|
|
0 commit comments