@@ -79,43 +79,61 @@ inline napi_status AttachData(napi_env env,
79
79
// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions
80
80
// and rethrow them as JavaScript exceptions before returning from the callback.
81
81
template <typename Callable>
82
- inline napi_value WrapCallback (Callable callback) {
83
- #ifdef NAPI_CPP_EXCEPTIONS
82
+ inline napi_value WrapCallback (napi_env env, Callable callback) {
83
+ #if defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
84
84
try {
85
85
return callback ();
86
86
} catch (const Error& e) {
87
87
e.ThrowAsJavaScriptException ();
88
88
return nullptr ;
89
89
}
90
- #else // NAPI_CPP_EXCEPTIONS
90
+ #ifdef NAPI_CPP_EXCEPTIONS_ALL
91
+ catch (const std::exception& e) {
92
+ Napi::Error::New (env, e.what ()).ThrowAsJavaScriptException ();
93
+ return nullptr ;
94
+ } catch (...) {
95
+ Napi::Error::New (env, " A native exception was thrown" )
96
+ .ThrowAsJavaScriptException ();
97
+ return nullptr ;
98
+ }
99
+ #endif // NAPI_CPP_EXCEPTIONS_ALL
100
+ #else // defined(NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
91
101
// When C++ exceptions are disabled, errors are immediately thrown as JS
92
102
// exceptions, so there is no need to catch and rethrow them here.
93
103
return callback ();
94
- #endif // NAPI_CPP_EXCEPTIONS
104
+ #endif // defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
95
105
}
96
106
97
107
// For use in JS to C++ void callback wrappers to catch any Napi::Error
98
108
// exceptions and rethrow them as JavaScript exceptions before returning from
99
109
// the callback.
100
110
template <typename Callable>
101
- inline void WrapVoidCallback (Callable callback) {
102
- #ifdef NAPI_CPP_EXCEPTIONS
111
+ inline void WrapVoidCallback (napi_env env, Callable callback) {
112
+ #if defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
103
113
try {
104
114
callback ();
105
115
} catch (const Error& e) {
106
116
e.ThrowAsJavaScriptException ();
107
117
}
108
- #else // NAPI_CPP_EXCEPTIONS
118
+ #ifdef NAPI_CPP_EXCEPTIONS_ALL
119
+ catch (const std::exception& e) {
120
+ Napi::Error::New (env, e.what ()).ThrowAsJavaScriptException ();
121
+ } catch (...) {
122
+ Napi::Error::New (env, " A native exception was thrown" )
123
+ .ThrowAsJavaScriptException ();
124
+ }
125
+ #endif // NAPI_CPP_EXCEPTIONS_ALL
126
+ #else // defined(NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
109
127
// When C++ exceptions are disabled, errors are immediately thrown as JS
110
128
// exceptions, so there is no need to catch and rethrow them here.
111
129
callback ();
112
- #endif // NAPI_CPP_EXCEPTIONS
130
+ #endif // defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
113
131
}
114
132
115
133
template <typename Callable, typename Return>
116
134
struct CallbackData {
117
135
static inline napi_value Wrapper (napi_env env, napi_callback_info info) {
118
- return details::WrapCallback ([&] {
136
+ return details::WrapCallback (env, [&] {
119
137
CallbackInfo callbackInfo (env, info);
120
138
CallbackData* callbackData =
121
139
static_cast <CallbackData*>(callbackInfo.Data ());
@@ -131,7 +149,7 @@ struct CallbackData {
131
149
template <typename Callable>
132
150
struct CallbackData <Callable, void > {
133
151
static inline napi_value Wrapper (napi_env env, napi_callback_info info) {
134
- return details::WrapCallback ([&] {
152
+ return details::WrapCallback (env, [&] {
135
153
CallbackInfo callbackInfo (env, info);
136
154
CallbackData* callbackData =
137
155
static_cast <CallbackData*>(callbackInfo.Data ());
@@ -148,7 +166,7 @@ struct CallbackData<Callable, void> {
148
166
template <void (*Callback)(const CallbackInfo& info)>
149
167
napi_value TemplatedVoidCallback (napi_env env,
150
168
napi_callback_info info) NAPI_NOEXCEPT {
151
- return details::WrapCallback ([&] {
169
+ return details::WrapCallback (env, [&] {
152
170
CallbackInfo cbInfo (env, info);
153
171
Callback (cbInfo);
154
172
return nullptr ;
@@ -158,7 +176,7 @@ napi_value TemplatedVoidCallback(napi_env env,
158
176
template <Napi::Value (*Callback)(const CallbackInfo& info)>
159
177
napi_value TemplatedCallback (napi_env env,
160
178
napi_callback_info info) NAPI_NOEXCEPT {
161
- return details::WrapCallback ([&] {
179
+ return details::WrapCallback (env, [&] {
162
180
CallbackInfo cbInfo (env, info);
163
181
// MSVC requires to copy 'Callback' function pointer to a local variable
164
182
// before invoking it.
@@ -171,7 +189,7 @@ template <typename T,
171
189
Napi::Value (T::*UnwrapCallback)(const CallbackInfo& info)>
172
190
napi_value TemplatedInstanceCallback(napi_env env,
173
191
napi_callback_info info) NAPI_NOEXCEPT {
174
- return details::WrapCallback ([&] {
192
+ return details::WrapCallback (env, [&] {
175
193
CallbackInfo cbInfo (env, info);
176
194
T* instance = T::Unwrap (cbInfo.This ().As <Object>());
177
195
return instance ? (instance->*UnwrapCallback)(cbInfo) : Napi::Value ();
@@ -181,7 +199,7 @@ napi_value TemplatedInstanceCallback(napi_env env,
181
199
template <typename T, void (T::*UnwrapCallback)(const CallbackInfo& info)>
182
200
napi_value TemplatedInstanceVoidCallback (napi_env env, napi_callback_info info)
183
201
NAPI_NOEXCEPT {
184
- return details::WrapCallback ([&] {
202
+ return details::WrapCallback (env, [&] {
185
203
CallbackInfo cbInfo (env, info);
186
204
T* instance = T::Unwrap (cbInfo.This ().As <Object>());
187
205
if (instance) (instance->*UnwrapCallback)(cbInfo);
@@ -199,7 +217,7 @@ struct FinalizeData {
199
217
static inline void Wrapper (node_addon_api_basic_env env,
200
218
void * data,
201
219
void * finalizeHint) NAPI_NOEXCEPT {
202
- WrapVoidCallback ([&] {
220
+ WrapVoidCallback (env, [&] {
203
221
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
204
222
finalizeData->callback (env, static_cast <T*>(data));
205
223
delete finalizeData;
@@ -234,7 +252,7 @@ struct FinalizeData {
234
252
static inline void WrapperWithHint (node_addon_api_basic_env env,
235
253
void * data,
236
254
void * finalizeHint) NAPI_NOEXCEPT {
237
- WrapVoidCallback ([&] {
255
+ WrapVoidCallback (env, [&] {
238
256
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
239
257
finalizeData->callback (env, static_cast <T*>(data), finalizeData->hint );
240
258
delete finalizeData;
@@ -264,7 +282,7 @@ struct FinalizeData {
264
282
static inline void WrapperGCWithoutData (napi_env env,
265
283
void * /* data*/ ,
266
284
void * finalizeHint) NAPI_NOEXCEPT {
267
- WrapVoidCallback ([&] {
285
+ WrapVoidCallback (env, [&] {
268
286
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
269
287
finalizeData->callback (env);
270
288
delete finalizeData;
@@ -274,7 +292,7 @@ struct FinalizeData {
274
292
static inline void WrapperGC (napi_env env,
275
293
void * data,
276
294
void * finalizeHint) NAPI_NOEXCEPT {
277
- WrapVoidCallback ([&] {
295
+ WrapVoidCallback (env, [&] {
278
296
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
279
297
finalizeData->callback (env, static_cast <T*>(data));
280
298
delete finalizeData;
@@ -284,7 +302,7 @@ struct FinalizeData {
284
302
static inline void WrapperGCWithHint (napi_env env,
285
303
void * data,
286
304
void * finalizeHint) NAPI_NOEXCEPT {
287
- WrapVoidCallback ([&] {
305
+ WrapVoidCallback (env, [&] {
288
306
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
289
307
finalizeData->callback (env, static_cast <T*>(data), finalizeData->hint );
290
308
delete finalizeData;
@@ -351,7 +369,7 @@ struct ThreadSafeFinalize {
351
369
template <typename ContextType, typename DataType, typename CallJs, CallJs call>
352
370
inline typename std::enable_if<call != static_cast <CallJs>(nullptr )>::type
353
371
CallJsWrapper (napi_env env, napi_value jsCallback, void * context, void * data) {
354
- details::WrapVoidCallback ([&]() {
372
+ details::WrapVoidCallback (env, [&]() {
355
373
call (env,
356
374
Function (env, jsCallback),
357
375
static_cast <ContextType*>(context),
@@ -365,7 +383,7 @@ CallJsWrapper(napi_env env,
365
383
napi_value jsCallback,
366
384
void * /* context*/ ,
367
385
void * /* data*/ ) {
368
- details::WrapVoidCallback ([&]() {
386
+ details::WrapVoidCallback (env, [&]() {
369
387
if (jsCallback != nullptr ) {
370
388
Function (env, jsCallback).Call (0 , nullptr );
371
389
}
@@ -399,7 +417,7 @@ template <typename Getter, typename Setter>
399
417
struct AccessorCallbackData {
400
418
static inline napi_value GetterWrapper (napi_env env,
401
419
napi_callback_info info) {
402
- return details::WrapCallback ([&] {
420
+ return details::WrapCallback (env, [&] {
403
421
CallbackInfo callbackInfo (env, info);
404
422
AccessorCallbackData* callbackData =
405
423
static_cast <AccessorCallbackData*>(callbackInfo.Data ());
@@ -410,7 +428,7 @@ struct AccessorCallbackData {
410
428
411
429
static inline napi_value SetterWrapper (napi_env env,
412
430
napi_callback_info info) {
413
- return details::WrapCallback ([&] {
431
+ return details::WrapCallback (env, [&] {
414
432
CallbackInfo callbackInfo (env, info);
415
433
AccessorCallbackData* callbackData =
416
434
static_cast <AccessorCallbackData*>(callbackInfo.Data ());
@@ -501,7 +519,7 @@ class HasBasicFinalizer {
501
519
inline napi_value RegisterModule (napi_env env,
502
520
napi_value exports,
503
521
ModuleRegisterCallback registerCallback) {
504
- return details::WrapCallback ([&] {
522
+ return details::WrapCallback (env, [&] {
505
523
return napi_value (
506
524
registerCallback (Napi::Env (env), Napi::Object (env, exports)));
507
525
});
@@ -4506,7 +4524,7 @@ inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceValue(
4506
4524
template <typename T>
4507
4525
inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper (
4508
4526
napi_env env, napi_callback_info info) {
4509
- return details::WrapCallback ([&] {
4527
+ return details::WrapCallback (env, [&] {
4510
4528
CallbackInfo callbackInfo (env, info);
4511
4529
InstanceVoidMethodCallbackData* callbackData =
4512
4530
reinterpret_cast <InstanceVoidMethodCallbackData*>(callbackInfo.Data ());
@@ -4521,7 +4539,7 @@ inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper(
4521
4539
template <typename T>
4522
4540
inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper (
4523
4541
napi_env env, napi_callback_info info) {
4524
- return details::WrapCallback ([&] {
4542
+ return details::WrapCallback (env, [&] {
4525
4543
CallbackInfo callbackInfo (env, info);
4526
4544
InstanceMethodCallbackData* callbackData =
4527
4545
reinterpret_cast <InstanceMethodCallbackData*>(callbackInfo.Data ());
@@ -4535,7 +4553,7 @@ inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper(
4535
4553
template <typename T>
4536
4554
inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper (
4537
4555
napi_env env, napi_callback_info info) {
4538
- return details::WrapCallback ([&] {
4556
+ return details::WrapCallback (env, [&] {
4539
4557
CallbackInfo callbackInfo (env, info);
4540
4558
InstanceAccessorCallbackData* callbackData =
4541
4559
reinterpret_cast <InstanceAccessorCallbackData*>(callbackInfo.Data ());
@@ -4549,7 +4567,7 @@ inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper(
4549
4567
template <typename T>
4550
4568
inline napi_value InstanceWrap<T>::InstanceSetterCallbackWrapper (
4551
4569
napi_env env, napi_callback_info info) {
4552
- return details::WrapCallback ([&] {
4570
+ return details::WrapCallback (env, [&] {
4553
4571
CallbackInfo callbackInfo (env, info);
4554
4572
InstanceAccessorCallbackData* callbackData =
4555
4573
reinterpret_cast <InstanceAccessorCallbackData*>(callbackInfo.Data ());
@@ -4565,7 +4583,7 @@ template <typename T>
4565
4583
template <typename InstanceWrap<T>::InstanceSetterCallback method>
4566
4584
inline napi_value InstanceWrap<T>::WrappedMethod (
4567
4585
napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
4568
- return details::WrapCallback ([&] {
4586
+ return details::WrapCallback (env, [&] {
4569
4587
const CallbackInfo cbInfo (env, info);
4570
4588
T* instance = T::Unwrap (cbInfo.This ().As <Object>());
4571
4589
if (instance) (instance->*method)(cbInfo, cbInfo[0 ]);
@@ -4960,10 +4978,10 @@ inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper(
4960
4978
bool isConstructCall = (new_target != nullptr );
4961
4979
if (!isConstructCall) {
4962
4980
return details::WrapCallback (
4963
- [&] { return T::OnCalledAsFunction (CallbackInfo (env, info)); });
4981
+ env, [&] { return T::OnCalledAsFunction (CallbackInfo (env, info)); });
4964
4982
}
4965
4983
4966
- napi_value wrapper = details::WrapCallback ([&] {
4984
+ napi_value wrapper = details::WrapCallback (env, [&] {
4967
4985
CallbackInfo callbackInfo (env, info);
4968
4986
T* instance = new T (callbackInfo);
4969
4987
#ifdef NAPI_CPP_EXCEPTIONS
@@ -4987,7 +5005,7 @@ inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper(
4987
5005
template <typename T>
4988
5006
inline napi_value ObjectWrap<T>::StaticVoidMethodCallbackWrapper (
4989
5007
napi_env env, napi_callback_info info) {
4990
- return details::WrapCallback ([&] {
5008
+ return details::WrapCallback (env, [&] {
4991
5009
CallbackInfo callbackInfo (env, info);
4992
5010
StaticVoidMethodCallbackData* callbackData =
4993
5011
reinterpret_cast <StaticVoidMethodCallbackData*>(callbackInfo.Data ());
@@ -5000,7 +5018,7 @@ inline napi_value ObjectWrap<T>::StaticVoidMethodCallbackWrapper(
5000
5018
template <typename T>
5001
5019
inline napi_value ObjectWrap<T>::StaticMethodCallbackWrapper (
5002
5020
napi_env env, napi_callback_info info) {
5003
- return details::WrapCallback ([&] {
5021
+ return details::WrapCallback (env, [&] {
5004
5022
CallbackInfo callbackInfo (env, info);
5005
5023
StaticMethodCallbackData* callbackData =
5006
5024
reinterpret_cast <StaticMethodCallbackData*>(callbackInfo.Data ());
@@ -5012,7 +5030,7 @@ inline napi_value ObjectWrap<T>::StaticMethodCallbackWrapper(
5012
5030
template <typename T>
5013
5031
inline napi_value ObjectWrap<T>::StaticGetterCallbackWrapper (
5014
5032
napi_env env, napi_callback_info info) {
5015
- return details::WrapCallback ([&] {
5033
+ return details::WrapCallback (env, [&] {
5016
5034
CallbackInfo callbackInfo (env, info);
5017
5035
StaticAccessorCallbackData* callbackData =
5018
5036
reinterpret_cast <StaticAccessorCallbackData*>(callbackInfo.Data ());
@@ -5024,7 +5042,7 @@ inline napi_value ObjectWrap<T>::StaticGetterCallbackWrapper(
5024
5042
template <typename T>
5025
5043
inline napi_value ObjectWrap<T>::StaticSetterCallbackWrapper (
5026
5044
napi_env env, napi_callback_info info) {
5027
- return details::WrapCallback ([&] {
5045
+ return details::WrapCallback (env, [&] {
5028
5046
CallbackInfo callbackInfo (env, info);
5029
5047
StaticAccessorCallbackData* callbackData =
5030
5048
reinterpret_cast <StaticAccessorCallbackData*>(callbackInfo.Data ());
@@ -5097,7 +5115,7 @@ template <typename T>
5097
5115
template <typename ObjectWrap<T>::StaticSetterCallback method>
5098
5116
inline napi_value ObjectWrap<T>::WrappedMethod (
5099
5117
napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
5100
- return details::WrapCallback ([&] {
5118
+ return details::WrapCallback (env, [&] {
5101
5119
const CallbackInfo cbInfo (env, info);
5102
5120
// MSVC requires to copy 'method' function pointer to a local variable
5103
5121
// before invoking it.
@@ -5415,10 +5433,10 @@ inline void AsyncWorker::OnAsyncWorkComplete(napi_env env,
5415
5433
AsyncWorker* self = static_cast <AsyncWorker*>(asyncworker);
5416
5434
self->OnWorkComplete (env, status);
5417
5435
}
5418
- inline void AsyncWorker::OnWorkComplete (Napi::Env /* env*/ , napi_status status) {
5436
+ inline void AsyncWorker::OnWorkComplete (Napi::Env env, napi_status status) {
5419
5437
if (status != napi_cancelled) {
5420
5438
HandleScope scope (_env);
5421
- details::WrapCallback ([&] {
5439
+ details::WrapCallback (env, [&] {
5422
5440
if (_error.size () == 0 ) {
5423
5441
OnOK ();
5424
5442
} else {
@@ -6330,7 +6348,7 @@ inline void ThreadSafeFunction::CallJS(napi_env env,
6330
6348
return ;
6331
6349
}
6332
6350
6333
- details::WrapVoidCallback ([&]() {
6351
+ details::WrapVoidCallback (env, [&]() {
6334
6352
if (data != nullptr ) {
6335
6353
auto * callbackWrapper = static_cast <CallbackWrapper*>(data);
6336
6354
(*callbackWrapper)(env, Function (env, jsCallback));
0 commit comments