Skip to content

Commit c1cdb39

Browse files
author
Gabriel Schulhof
committed
src: wrap finalizer callback
1 parent 27bf245 commit c1cdb39

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

napi-inl.h

+30-8
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,24 @@ inline napi_value WrapCallback(Callable callback) {
8282
#endif // NAPI_CPP_EXCEPTIONS
8383
}
8484

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+
85103
template <typename Callable, typename Return>
86104
struct CallbackData {
87105
static inline
@@ -120,17 +138,21 @@ struct CallbackData<Callable, void> {
120138
template <typename T, typename Finalizer, typename Hint = void>
121139
struct FinalizeData {
122140
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+
});
127147
}
128148

129149
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+
});
134156
}
135157

136158
Finalizer callback;

0 commit comments

Comments
 (0)