@@ -82,6 +82,24 @@ inline napi_value WrapCallback(Callable callback) {
82
82
#endif // NAPI_CPP_EXCEPTIONS
83
83
}
84
84
85
+ // For use in JS to C++ void callback wrappers to catch any Napi::Error
86
+ // exceptions and rethrow them as JavaScript exceptions before returning from the
87
+ // callback.
88
+ template <typename Callable>
89
+ inline void WrapVoidCallback (Callable callback) {
90
+ #ifdef NAPI_CPP_EXCEPTIONS
91
+ try {
92
+ callback ();
93
+ } catch (const Error& e) {
94
+ e.ThrowAsJavaScriptException ();
95
+ }
96
+ #else // NAPI_CPP_EXCEPTIONS
97
+ // When C++ exceptions are disabled, errors are immediately thrown as JS
98
+ // exceptions, so there is no need to catch and rethrow them here.
99
+ callback ();
100
+ #endif // NAPI_CPP_EXCEPTIONS
101
+ }
102
+
85
103
template <typename Callable, typename Return>
86
104
struct CallbackData {
87
105
static inline
@@ -120,17 +138,21 @@ struct CallbackData<Callable, void> {
120
138
template <typename T, typename Finalizer, typename Hint = void >
121
139
struct FinalizeData {
122
140
static inline
123
- void Wrapper (napi_env env, void * data, void * finalizeHint) {
124
- FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
125
- finalizeData->callback (Env (env), static_cast <T*>(data));
126
- delete finalizeData;
141
+ void Wrapper (napi_env env, void * data, void * finalizeHint) noexcept {
142
+ WrapVoidCallback ([&] {
143
+ FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
144
+ finalizeData->callback (Env (env), static_cast <T*>(data));
145
+ delete finalizeData;
146
+ });
127
147
}
128
148
129
149
static inline
130
- void WrapperWithHint (napi_env env, void * data, void * finalizeHint) {
131
- FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
132
- finalizeData->callback (Env (env), static_cast <T*>(data), finalizeData->hint );
133
- delete finalizeData;
150
+ void WrapperWithHint (napi_env env, void * data, void * finalizeHint) noexcept {
151
+ WrapVoidCallback ([&] {
152
+ FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
153
+ finalizeData->callback (Env (env), static_cast <T*>(data), finalizeData->hint );
154
+ delete finalizeData;
155
+ });
134
156
}
135
157
136
158
Finalizer callback;
0 commit comments