@@ -78,43 +78,61 @@ inline napi_status AttachData(napi_env env,
78
78
// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions
79
79
// and rethrow them as JavaScript exceptions before returning from the callback.
80
80
template <typename Callable>
81
- inline napi_value WrapCallback (Callable callback) {
82
- #ifdef NAPI_CPP_EXCEPTIONS
81
+ inline napi_value WrapCallback (napi_env env, Callable callback) {
82
+ #if defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
83
83
try {
84
84
return callback ();
85
85
} catch (const Error& e) {
86
86
e.ThrowAsJavaScriptException ();
87
87
return nullptr ;
88
88
}
89
- #else // NAPI_CPP_EXCEPTIONS
89
+ #ifdef NAPI_CPP_EXCEPTIONS_ALL
90
+ catch (const std::exception& e) {
91
+ Napi::Error::New (env, e.what ()).ThrowAsJavaScriptException ();
92
+ return nullptr ;
93
+ } catch (...) {
94
+ Napi::Error::New (env, " A native exception was thrown" )
95
+ .ThrowAsJavaScriptException ();
96
+ return nullptr ;
97
+ }
98
+ #endif // NAPI_CPP_EXCEPTIONS_ALL
99
+ #else // defined(NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
90
100
// When C++ exceptions are disabled, errors are immediately thrown as JS
91
101
// exceptions, so there is no need to catch and rethrow them here.
92
102
return callback ();
93
- #endif // NAPI_CPP_EXCEPTIONS
103
+ #endif // defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
94
104
}
95
105
96
106
// For use in JS to C++ void callback wrappers to catch any Napi::Error
97
107
// exceptions and rethrow them as JavaScript exceptions before returning from
98
108
// the callback.
99
109
template <typename Callable>
100
- inline void WrapVoidCallback (Callable callback) {
101
- #ifdef NAPI_CPP_EXCEPTIONS
110
+ inline void WrapVoidCallback (napi_env env, Callable callback) {
111
+ #if defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
102
112
try {
103
113
callback ();
104
114
} catch (const Error& e) {
105
115
e.ThrowAsJavaScriptException ();
106
116
}
107
- #else // NAPI_CPP_EXCEPTIONS
117
+ #ifdef NAPI_CPP_EXCEPTIONS_ALL
118
+ catch (const std::exception& e) {
119
+ Napi::Error::New (env, e.what ()).ThrowAsJavaScriptException ();
120
+ } catch (...) {
121
+ Napi::Error::New (env, " A native exception was thrown" )
122
+ .ThrowAsJavaScriptException ();
123
+ }
124
+ #endif // NAPI_CPP_EXCEPTIONS_ALL
125
+ #else // defined(NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
108
126
// When C++ exceptions are disabled, errors are immediately thrown as JS
109
127
// exceptions, so there is no need to catch and rethrow them here.
110
128
callback ();
111
- #endif // NAPI_CPP_EXCEPTIONS
129
+ #endif // defined( NAPI_CPP_EXCEPTIONS) || defined(NAPI_CPP_EXCEPTIONS_ALL)
112
130
}
113
131
114
132
template <typename Callable, typename Return>
115
133
struct CallbackData {
116
134
static inline napi_value Wrapper (napi_env env, napi_callback_info info) {
117
- return details::WrapCallback ([&] {
135
+ return details::WrapCallback (env, [&] {
118
136
CallbackInfo callbackInfo (env, info);
119
137
CallbackData* callbackData =
120
138
static_cast <CallbackData*>(callbackInfo.Data ());
@@ -130,7 +148,7 @@ struct CallbackData {
130
148
template <typename Callable>
131
149
struct CallbackData <Callable, void > {
132
150
static inline napi_value Wrapper (napi_env env, napi_callback_info info) {
133
- return details::WrapCallback ([&] {
151
+ return details::WrapCallback (env, [&] {
134
152
CallbackInfo callbackInfo (env, info);
135
153
CallbackData* callbackData =
136
154
static_cast <CallbackData*>(callbackInfo.Data ());
@@ -147,7 +165,7 @@ struct CallbackData<Callable, void> {
147
165
template <void (*Callback)(const CallbackInfo& info)>
148
166
napi_value TemplatedVoidCallback (napi_env env,
149
167
napi_callback_info info) NAPI_NOEXCEPT {
150
- return details::WrapCallback ([&] {
168
+ return details::WrapCallback (env, [&] {
151
169
CallbackInfo cbInfo (env, info);
152
170
Callback (cbInfo);
153
171
return nullptr ;
@@ -157,7 +175,7 @@ napi_value TemplatedVoidCallback(napi_env env,
157
175
template <Napi::Value (*Callback)(const CallbackInfo& info)>
158
176
napi_value TemplatedCallback (napi_env env,
159
177
napi_callback_info info) NAPI_NOEXCEPT {
160
- return details::WrapCallback ([&] {
178
+ return details::WrapCallback (env, [&] {
161
179
CallbackInfo cbInfo (env, info);
162
180
// MSVC requires to copy 'Callback' function pointer to a local variable
163
181
// before invoking it.
@@ -170,7 +188,7 @@ template <typename T,
170
188
Napi::Value (T::*UnwrapCallback)(const CallbackInfo& info)>
171
189
napi_value TemplatedInstanceCallback(napi_env env,
172
190
napi_callback_info info) NAPI_NOEXCEPT {
173
- return details::WrapCallback ([&] {
191
+ return details::WrapCallback (env, [&] {
174
192
CallbackInfo cbInfo (env, info);
175
193
T* instance = T::Unwrap (cbInfo.This ().As <Object>());
176
194
return instance ? (instance->*UnwrapCallback)(cbInfo) : Napi::Value ();
@@ -180,7 +198,7 @@ napi_value TemplatedInstanceCallback(napi_env env,
180
198
template <typename T, void (T::*UnwrapCallback)(const CallbackInfo& info)>
181
199
napi_value TemplatedInstanceVoidCallback (napi_env env, napi_callback_info info)
182
200
NAPI_NOEXCEPT {
183
- return details::WrapCallback ([&] {
201
+ return details::WrapCallback (env, [&] {
184
202
CallbackInfo cbInfo (env, info);
185
203
T* instance = T::Unwrap (cbInfo.This ().As <Object>());
186
204
if (instance) (instance->*UnwrapCallback)(cbInfo);
@@ -198,7 +216,7 @@ struct FinalizeData {
198
216
static inline void Wrapper (node_api_nogc_env env,
199
217
void * data,
200
218
void * finalizeHint) NAPI_NOEXCEPT {
201
- WrapVoidCallback ([&] {
219
+ WrapVoidCallback (env, [&] {
202
220
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
203
221
finalizeData->callback (env, static_cast <T*>(data));
204
222
delete finalizeData;
@@ -228,7 +246,7 @@ struct FinalizeData {
228
246
static inline void WrapperWithHint (node_api_nogc_env env,
229
247
void * data,
230
248
void * finalizeHint) NAPI_NOEXCEPT {
231
- WrapVoidCallback ([&] {
249
+ WrapVoidCallback (env, [&] {
232
250
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
233
251
finalizeData->callback (env, static_cast <T*>(data), finalizeData->hint );
234
252
delete finalizeData;
@@ -253,7 +271,7 @@ struct FinalizeData {
253
271
static inline void WrapperGCWithoutData (napi_env env,
254
272
void * /* data*/ ,
255
273
void * finalizeHint) NAPI_NOEXCEPT {
256
- WrapVoidCallback ([&] {
274
+ WrapVoidCallback (env, [&] {
257
275
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
258
276
finalizeData->callback (env);
259
277
delete finalizeData;
@@ -263,7 +281,7 @@ struct FinalizeData {
263
281
static inline void WrapperGC (napi_env env,
264
282
void * data,
265
283
void * finalizeHint) NAPI_NOEXCEPT {
266
- WrapVoidCallback ([&] {
284
+ WrapVoidCallback (env, [&] {
267
285
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
268
286
finalizeData->callback (env, static_cast <T*>(data));
269
287
delete finalizeData;
@@ -273,7 +291,7 @@ struct FinalizeData {
273
291
static inline void WrapperGCWithHint (napi_env env,
274
292
void * data,
275
293
void * finalizeHint) NAPI_NOEXCEPT {
276
- WrapVoidCallback ([&] {
294
+ WrapVoidCallback (env, [&] {
277
295
FinalizeData* finalizeData = static_cast <FinalizeData*>(finalizeHint);
278
296
finalizeData->callback (env, static_cast <T*>(data), finalizeData->hint );
279
297
delete finalizeData;
@@ -340,7 +358,7 @@ struct ThreadSafeFinalize {
340
358
template <typename ContextType, typename DataType, typename CallJs, CallJs call>
341
359
inline typename std::enable_if<call != static_cast <CallJs>(nullptr )>::type
342
360
CallJsWrapper (napi_env env, napi_value jsCallback, void * context, void * data) {
343
- details::WrapVoidCallback ([&]() {
361
+ details::WrapVoidCallback (env, [&]() {
344
362
call (env,
345
363
Function (env, jsCallback),
346
364
static_cast <ContextType*>(context),
@@ -354,7 +372,7 @@ CallJsWrapper(napi_env env,
354
372
napi_value jsCallback,
355
373
void * /* context*/ ,
356
374
void * /* data*/ ) {
357
- details::WrapVoidCallback ([&]() {
375
+ details::WrapVoidCallback (env, [&]() {
358
376
if (jsCallback != nullptr ) {
359
377
Function (env, jsCallback).Call (0 , nullptr );
360
378
}
@@ -388,7 +406,7 @@ template <typename Getter, typename Setter>
388
406
struct AccessorCallbackData {
389
407
static inline napi_value GetterWrapper (napi_env env,
390
408
napi_callback_info info) {
391
- return details::WrapCallback ([&] {
409
+ return details::WrapCallback (env, [&] {
392
410
CallbackInfo callbackInfo (env, info);
393
411
AccessorCallbackData* callbackData =
394
412
static_cast <AccessorCallbackData*>(callbackInfo.Data ());
@@ -399,7 +417,7 @@ struct AccessorCallbackData {
399
417
400
418
static inline napi_value SetterWrapper (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 ());
@@ -490,7 +508,7 @@ class HasBasicFinalizer {
490
508
inline napi_value RegisterModule (napi_env env,
491
509
napi_value exports,
492
510
ModuleRegisterCallback registerCallback) {
493
- return details::WrapCallback ([&] {
511
+ return details::WrapCallback (env, [&] {
494
512
return napi_value (
495
513
registerCallback (Napi::Env (env), Napi::Object (env, exports)));
496
514
});
@@ -4479,7 +4497,7 @@ inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceValue(
4479
4497
template <typename T>
4480
4498
inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper (
4481
4499
napi_env env, napi_callback_info info) {
4482
- return details::WrapCallback ([&] {
4500
+ return details::WrapCallback (env, [&] {
4483
4501
CallbackInfo callbackInfo (env, info);
4484
4502
InstanceVoidMethodCallbackData* callbackData =
4485
4503
reinterpret_cast <InstanceVoidMethodCallbackData*>(callbackInfo.Data ());
@@ -4494,7 +4512,7 @@ inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper(
4494
4512
template <typename T>
4495
4513
inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper (
4496
4514
napi_env env, napi_callback_info info) {
4497
- return details::WrapCallback ([&] {
4515
+ return details::WrapCallback (env, [&] {
4498
4516
CallbackInfo callbackInfo (env, info);
4499
4517
InstanceMethodCallbackData* callbackData =
4500
4518
reinterpret_cast <InstanceMethodCallbackData*>(callbackInfo.Data ());
@@ -4508,7 +4526,7 @@ inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper(
4508
4526
template <typename T>
4509
4527
inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper (
4510
4528
napi_env env, napi_callback_info info) {
4511
- return details::WrapCallback ([&] {
4529
+ return details::WrapCallback (env, [&] {
4512
4530
CallbackInfo callbackInfo (env, info);
4513
4531
InstanceAccessorCallbackData* callbackData =
4514
4532
reinterpret_cast <InstanceAccessorCallbackData*>(callbackInfo.Data ());
@@ -4522,7 +4540,7 @@ inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper(
4522
4540
template <typename T>
4523
4541
inline napi_value InstanceWrap<T>::InstanceSetterCallbackWrapper (
4524
4542
napi_env env, napi_callback_info info) {
4525
- return details::WrapCallback ([&] {
4543
+ return details::WrapCallback (env, [&] {
4526
4544
CallbackInfo callbackInfo (env, info);
4527
4545
InstanceAccessorCallbackData* callbackData =
4528
4546
reinterpret_cast <InstanceAccessorCallbackData*>(callbackInfo.Data ());
@@ -4538,7 +4556,7 @@ template <typename T>
4538
4556
template <typename InstanceWrap<T>::InstanceSetterCallback method>
4539
4557
inline napi_value InstanceWrap<T>::WrappedMethod (
4540
4558
napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
4541
- return details::WrapCallback ([&] {
4559
+ return details::WrapCallback (env, [&] {
4542
4560
const CallbackInfo cbInfo (env, info);
4543
4561
T* instance = T::Unwrap (cbInfo.This ().As <Object>());
4544
4562
if (instance) (instance->*method)(cbInfo, cbInfo[0 ]);
@@ -4933,10 +4951,10 @@ inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper(
4933
4951
bool isConstructCall = (new_target != nullptr );
4934
4952
if (!isConstructCall) {
4935
4953
return details::WrapCallback (
4936
- [&] { return T::OnCalledAsFunction (CallbackInfo (env, info)); });
4954
+ env, [&] { return T::OnCalledAsFunction (CallbackInfo (env, info)); });
4937
4955
}
4938
4956
4939
- napi_value wrapper = details::WrapCallback ([&] {
4957
+ napi_value wrapper = details::WrapCallback (env, [&] {
4940
4958
CallbackInfo callbackInfo (env, info);
4941
4959
T* instance = new T (callbackInfo);
4942
4960
#ifdef NAPI_CPP_EXCEPTIONS
@@ -4960,7 +4978,7 @@ inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper(
4960
4978
template <typename T>
4961
4979
inline napi_value ObjectWrap<T>::StaticVoidMethodCallbackWrapper (
4962
4980
napi_env env, napi_callback_info info) {
4963
- return details::WrapCallback ([&] {
4981
+ return details::WrapCallback (env, [&] {
4964
4982
CallbackInfo callbackInfo (env, info);
4965
4983
StaticVoidMethodCallbackData* callbackData =
4966
4984
reinterpret_cast <StaticVoidMethodCallbackData*>(callbackInfo.Data ());
@@ -4973,7 +4991,7 @@ inline napi_value ObjectWrap<T>::StaticVoidMethodCallbackWrapper(
4973
4991
template <typename T>
4974
4992
inline napi_value ObjectWrap<T>::StaticMethodCallbackWrapper (
4975
4993
napi_env env, napi_callback_info info) {
4976
- return details::WrapCallback ([&] {
4994
+ return details::WrapCallback (env, [&] {
4977
4995
CallbackInfo callbackInfo (env, info);
4978
4996
StaticMethodCallbackData* callbackData =
4979
4997
reinterpret_cast <StaticMethodCallbackData*>(callbackInfo.Data ());
@@ -4985,7 +5003,7 @@ inline napi_value ObjectWrap<T>::StaticMethodCallbackWrapper(
4985
5003
template <typename T>
4986
5004
inline napi_value ObjectWrap<T>::StaticGetterCallbackWrapper (
4987
5005
napi_env env, napi_callback_info info) {
4988
- return details::WrapCallback ([&] {
5006
+ return details::WrapCallback (env, [&] {
4989
5007
CallbackInfo callbackInfo (env, info);
4990
5008
StaticAccessorCallbackData* callbackData =
4991
5009
reinterpret_cast <StaticAccessorCallbackData*>(callbackInfo.Data ());
@@ -4997,7 +5015,7 @@ inline napi_value ObjectWrap<T>::StaticGetterCallbackWrapper(
4997
5015
template <typename T>
4998
5016
inline napi_value ObjectWrap<T>::StaticSetterCallbackWrapper (
4999
5017
napi_env env, napi_callback_info info) {
5000
- return details::WrapCallback ([&] {
5018
+ return details::WrapCallback (env, [&] {
5001
5019
CallbackInfo callbackInfo (env, info);
5002
5020
StaticAccessorCallbackData* callbackData =
5003
5021
reinterpret_cast <StaticAccessorCallbackData*>(callbackInfo.Data ());
@@ -5066,7 +5084,7 @@ template <typename T>
5066
5084
template <typename ObjectWrap<T>::StaticSetterCallback method>
5067
5085
inline napi_value ObjectWrap<T>::WrappedMethod (
5068
5086
napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
5069
- return details::WrapCallback ([&] {
5087
+ return details::WrapCallback (env, [&] {
5070
5088
const CallbackInfo cbInfo (env, info);
5071
5089
// MSVC requires to copy 'method' function pointer to a local variable
5072
5090
// before invoking it.
@@ -5384,10 +5402,10 @@ inline void AsyncWorker::OnAsyncWorkComplete(napi_env env,
5384
5402
AsyncWorker* self = static_cast <AsyncWorker*>(asyncworker);
5385
5403
self->OnWorkComplete (env, status);
5386
5404
}
5387
- inline void AsyncWorker::OnWorkComplete (Napi::Env /* env*/ , napi_status status) {
5405
+ inline void AsyncWorker::OnWorkComplete (Napi::Env env, napi_status status) {
5388
5406
if (status != napi_cancelled) {
5389
5407
HandleScope scope (_env);
5390
- details::WrapCallback ([&] {
5408
+ details::WrapCallback (env, [&] {
5391
5409
if (_error.size () == 0 ) {
5392
5410
OnOK ();
5393
5411
} else {
@@ -6299,7 +6317,7 @@ inline void ThreadSafeFunction::CallJS(napi_env env,
6299
6317
return ;
6300
6318
}
6301
6319
6302
- details::WrapVoidCallback ([&]() {
6320
+ details::WrapVoidCallback (env, [&]() {
6303
6321
if (data != nullptr ) {
6304
6322
auto * callbackWrapper = static_cast <CallbackWrapper*>(data);
6305
6323
(*callbackWrapper)(env, Function (env, jsCallback));
0 commit comments