@@ -27,6 +27,9 @@ namespace details {
27
27
#define NAPI_THROW_IF_FAILED (env, status, ...) \
28
28
if ((status) != napi_ok) throw Error::New (env);
29
29
30
+ #define NAPI_THROW_IF_FAILED_VOID (env, status ) \
31
+ if ((status) != napi_ok) throw Error::New (env);
32
+
30
33
#else // NAPI_CPP_EXCEPTIONS
31
34
32
35
#define NAPI_THROW (e ) (e).ThrowAsJavaScriptException();
@@ -40,6 +43,14 @@ namespace details {
40
43
return __VA_ARGS__; \
41
44
}
42
45
46
+ // We need a _VOID version of this macro to avoid warnings resulting from
47
+ // leaving the NAPI_THROW_IF_FAILED `...` argument empty.
48
+ #define NAPI_THROW_IF_FAILED_VOID (env, status ) \
49
+ if ((status) != napi_ok) { \
50
+ Error::New (env).ThrowAsJavaScriptException (); \
51
+ return ; \
52
+ }
53
+
43
54
#endif // NAPI_CPP_EXCEPTIONS
44
55
45
56
#define NAPI_FATAL_IF_FAILED (status, location, message ) \
@@ -160,7 +171,7 @@ struct AccessorCallbackData {
160
171
napi_value exports) { \
161
172
return Napi::RegisterModule (env, exports, regfunc); \
162
173
} \
163
- NAPI_MODULE (modname, __napi_ ## regfunc);
174
+ NAPI_MODULE (modname, __napi_ ## regfunc)
164
175
165
176
// Adapt the NAPI_MODULE registration function:
166
177
// - Wrap the arguments in NAPI wrappers.
@@ -867,21 +878,21 @@ template <typename ValueType>
867
878
inline void Object::Set (napi_value key, const ValueType& value) {
868
879
napi_status status =
869
880
napi_set_property (_env, _value, key, Value::From (_env, value));
870
- NAPI_THROW_IF_FAILED (_env, status);
881
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
871
882
}
872
883
873
884
template <typename ValueType>
874
885
inline void Object::Set (Value key, const ValueType& value) {
875
886
napi_status status =
876
887
napi_set_property (_env, _value, key, Value::From (_env, value));
877
- NAPI_THROW_IF_FAILED (_env, status);
888
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
878
889
}
879
890
880
891
template <typename ValueType>
881
892
inline void Object::Set (const char * utf8name, const ValueType& value) {
882
893
napi_status status =
883
894
napi_set_named_property (_env, _value, utf8name, Value::From (_env, value));
884
- NAPI_THROW_IF_FAILED (_env, status);
895
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
885
896
}
886
897
887
898
template <typename ValueType>
@@ -929,7 +940,7 @@ template <typename ValueType>
929
940
inline void Object::Set (uint32_t index, const ValueType& value) {
930
941
napi_status status =
931
942
napi_set_element (_env, _value, index, Value::From (_env, value));
932
- NAPI_THROW_IF_FAILED (_env, status);
943
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
933
944
}
934
945
935
946
inline bool Object::Delete (uint32_t index) {
@@ -949,19 +960,19 @@ inline Array Object::GetPropertyNames() {
949
960
inline void Object::DefineProperty (const PropertyDescriptor& property) {
950
961
napi_status status = napi_define_properties (_env, _value, 1 ,
951
962
reinterpret_cast <const napi_property_descriptor*>(&property));
952
- NAPI_THROW_IF_FAILED (_env, status);
963
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
953
964
}
954
965
955
966
inline void Object::DefineProperties (const std::initializer_list<PropertyDescriptor>& properties) {
956
967
napi_status status = napi_define_properties (_env, _value, properties.size (),
957
968
reinterpret_cast <const napi_property_descriptor*>(properties.begin ()));
958
- NAPI_THROW_IF_FAILED (_env, status);
969
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
959
970
}
960
971
961
972
inline void Object::DefineProperties (const std::vector<PropertyDescriptor>& properties) {
962
973
napi_status status = napi_define_properties (_env, _value, properties.size (),
963
974
reinterpret_cast <const napi_property_descriptor*>(properties.data ()));
964
- NAPI_THROW_IF_FAILED (_env, status);
975
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
965
976
}
966
977
967
978
inline bool Object::InstanceOf (const Function& constructor) const {
@@ -1171,7 +1182,7 @@ inline void ArrayBuffer::EnsureInfo() const {
1171
1182
// since they can never change during the lifetime of the ArrayBuffer.
1172
1183
if (_data == nullptr ) {
1173
1184
napi_status status = napi_get_arraybuffer_info (_env, _value, &_data, &_length);
1174
- NAPI_THROW_IF_FAILED (_env, status);
1185
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1175
1186
}
1176
1187
}
1177
1188
@@ -1222,7 +1233,7 @@ inline DataView::DataView(napi_env env, napi_value value) : Object(env, value) {
1222
1233
&_data /* data */ ,
1223
1234
nullptr /* arrayBuffer */ ,
1224
1235
nullptr /* byteOffset */ );
1225
- NAPI_THROW_IF_FAILED (_env, status);
1236
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1226
1237
}
1227
1238
1228
1239
inline Napi::ArrayBuffer DataView::ArrayBuffer () const {
@@ -1466,7 +1477,7 @@ inline TypedArrayOf<T>::TypedArrayOf(napi_env env, napi_value value)
1466
1477
: TypedArray(env, value), _data(nullptr ) {
1467
1478
napi_status status = napi_get_typedarray_info (
1468
1479
_env, _value, &_type, &_length, reinterpret_cast <void **>(&_data), nullptr , nullptr );
1469
- NAPI_THROW_IF_FAILED (_env, status);
1480
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1470
1481
}
1471
1482
1472
1483
template <typename T>
@@ -1615,7 +1626,7 @@ inline Promise::Deferred Promise::Deferred::New(napi_env env) {
1615
1626
1616
1627
inline Promise::Deferred::Deferred (napi_env env) : _env(env) {
1617
1628
napi_status status = napi_create_promise (_env, &_deferred, &_promise);
1618
- NAPI_THROW_IF_FAILED (_env, status);
1629
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1619
1630
}
1620
1631
1621
1632
inline Promise Promise::Deferred::Promise () const {
@@ -1628,12 +1639,12 @@ inline Napi::Env Promise::Deferred::Env() const {
1628
1639
1629
1640
inline void Promise::Deferred::Resolve (napi_value value) const {
1630
1641
napi_status status = napi_resolve_deferred (_env, _deferred, value);
1631
- NAPI_THROW_IF_FAILED (_env, status);
1642
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1632
1643
}
1633
1644
1634
1645
inline void Promise::Deferred::Reject (napi_value value) const {
1635
1646
napi_status status = napi_reject_deferred (_env, _deferred, value);
1636
- NAPI_THROW_IF_FAILED (_env, status);
1647
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1637
1648
}
1638
1649
1639
1650
inline Promise::Promise (napi_env env, napi_value value) : Object(env, value) {
@@ -1752,7 +1763,7 @@ inline void Buffer<T>::EnsureInfo() const {
1752
1763
size_t byteLength;
1753
1764
void * voidData;
1754
1765
napi_status status = napi_get_buffer_info (_env, _value, &voidData, &byteLength);
1755
- NAPI_THROW_IF_FAILED (_env, status);
1766
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1756
1767
_length = byteLength / sizeof (T);
1757
1768
_data = static_cast <T*>(voidData);
1758
1769
}
@@ -1888,7 +1899,7 @@ inline void Error::ThrowAsJavaScriptException() const {
1888
1899
HandleScope scope (_env);
1889
1900
if (!IsEmpty ()) {
1890
1901
napi_status status = napi_throw (_env, Value ());
1891
- NAPI_THROW_IF_FAILED (_env, status);
1902
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1892
1903
}
1893
1904
}
1894
1905
@@ -2077,7 +2088,7 @@ template <typename T>
2077
2088
inline void Reference<T>::Reset() {
2078
2089
if (_ref != nullptr ) {
2079
2090
napi_status status = napi_delete_reference (_env, _ref);
2080
- NAPI_THROW_IF_FAILED (_env, status);
2091
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
2081
2092
_ref = nullptr ;
2082
2093
}
2083
2094
}
@@ -2090,7 +2101,7 @@ inline void Reference<T>::Reset(const T& value, uint32_t refcount) {
2090
2101
napi_value val = value;
2091
2102
if (val != nullptr ) {
2092
2103
napi_status status = napi_create_reference (_env, value, refcount, &_ref);
2093
- NAPI_THROW_IF_FAILED (_env, status);
2104
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
2094
2105
}
2095
2106
}
2096
2107
@@ -2364,7 +2375,7 @@ inline CallbackInfo::CallbackInfo(napi_env env, napi_callback_info info)
2364
2375
_argc = _staticArgCount;
2365
2376
_argv = _staticArgs;
2366
2377
napi_status status = napi_get_cb_info (env, info, &_argc, _argv, &_this, &_data);
2367
- NAPI_THROW_IF_FAILED (_env, status);
2378
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
2368
2379
2369
2380
if (_argc > _staticArgCount) {
2370
2381
// Use either a fixed-size array (on the stack) or a dynamically-allocated
@@ -2373,7 +2384,7 @@ inline CallbackInfo::CallbackInfo(napi_env env, napi_callback_info info)
2373
2384
_argv = _dynamicArgs;
2374
2385
2375
2386
status = napi_get_cb_info (env, info, &_argc, _argv, nullptr , nullptr );
2376
- NAPI_THROW_IF_FAILED (_env, status);
2387
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
2377
2388
}
2378
2389
}
2379
2390
@@ -2430,7 +2441,7 @@ inline PropertyDescriptor
2430
2441
PropertyDescriptor::Accessor (const char * utf8name,
2431
2442
Getter getter,
2432
2443
napi_property_attributes attributes,
2433
- void * data) {
2444
+ void * /* data*/ ) {
2434
2445
typedef details::CallbackData<Getter, Napi::Value> CbData;
2435
2446
// TODO: Delete when the function is destroyed
2436
2447
auto callbackData = new CbData ({ getter, nullptr });
@@ -2459,7 +2470,7 @@ template <typename Getter>
2459
2470
inline PropertyDescriptor PropertyDescriptor::Accessor (napi_value name,
2460
2471
Getter getter,
2461
2472
napi_property_attributes attributes,
2462
- void * data) {
2473
+ void * /* data*/ ) {
2463
2474
typedef details::CallbackData<Getter, Napi::Value> CbData;
2464
2475
// TODO: Delete when the function is destroyed
2465
2476
auto callbackData = new CbData ({ getter, nullptr });
@@ -2490,7 +2501,7 @@ inline PropertyDescriptor PropertyDescriptor::Accessor(const char* utf8name,
2490
2501
Getter getter,
2491
2502
Setter setter,
2492
2503
napi_property_attributes attributes,
2493
- void * data) {
2504
+ void * /* data*/ ) {
2494
2505
typedef details::AccessorCallbackData<Getter, Setter> CbData;
2495
2506
// TODO: Delete when the function is destroyed
2496
2507
auto callbackData = new CbData ({ getter, setter });
@@ -2521,7 +2532,7 @@ inline PropertyDescriptor PropertyDescriptor::Accessor(napi_value name,
2521
2532
Getter getter,
2522
2533
Setter setter,
2523
2534
napi_property_attributes attributes,
2524
- void * data) {
2535
+ void * /* data*/ ) {
2525
2536
typedef details::AccessorCallbackData<Getter, Setter> CbData;
2526
2537
// TODO: Delete when the function is destroyed
2527
2538
auto callbackData = new CbData ({ getter, setter });
@@ -2552,7 +2563,7 @@ template <typename Callable>
2552
2563
inline PropertyDescriptor PropertyDescriptor::Function (const char * utf8name,
2553
2564
Callable cb,
2554
2565
napi_property_attributes attributes,
2555
- void * data) {
2566
+ void * /* data*/ ) {
2556
2567
typedef decltype (cb (CallbackInfo (nullptr , nullptr ))) ReturnType;
2557
2568
typedef details::CallbackData<Callable, ReturnType> CbData;
2558
2569
// TODO: Delete when the function is destroyed
@@ -2582,7 +2593,7 @@ template <typename Callable>
2582
2593
inline PropertyDescriptor PropertyDescriptor::Function (napi_value name,
2583
2594
Callable cb,
2584
2595
napi_property_attributes attributes,
2585
- void * data) {
2596
+ void * /* data*/ ) {
2586
2597
typedef decltype (cb (CallbackInfo (nullptr , nullptr ))) ReturnType;
2587
2598
typedef details::CallbackData<Callable, ReturnType> CbData;
2588
2599
// TODO: Delete when the function is destroyed
@@ -2663,7 +2674,7 @@ inline ObjectWrap<T>::ObjectWrap(const Napi::CallbackInfo& callbackInfo) {
2663
2674
napi_ref ref;
2664
2675
T* instance = static_cast <T*>(this );
2665
2676
status = napi_wrap (env, wrapper, instance, FinalizeCallback, nullptr , &ref);
2666
- NAPI_THROW_IF_FAILED (env, status)
2677
+ NAPI_THROW_IF_FAILED_VOID (env, status);
2667
2678
2668
2679
Reference<Object>* instanceRef = instance;
2669
2680
*instanceRef = Reference<Object>(env, ref);
@@ -3031,7 +3042,7 @@ inline HandleScope::HandleScope(napi_env env, napi_handle_scope scope)
3031
3042
3032
3043
inline HandleScope::HandleScope (Napi::Env env) : _env(env) {
3033
3044
napi_status status = napi_open_handle_scope (_env, &_scope);
3034
- NAPI_THROW_IF_FAILED (_env, status);
3045
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3035
3046
}
3036
3047
3037
3048
inline HandleScope::~HandleScope () {
@@ -3056,7 +3067,7 @@ inline EscapableHandleScope::EscapableHandleScope(
3056
3067
3057
3068
inline EscapableHandleScope::EscapableHandleScope (Napi::Env env) : _env(env) {
3058
3069
napi_status status = napi_open_escapable_handle_scope (_env, &_scope);
3059
- NAPI_THROW_IF_FAILED (_env, status);
3070
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3060
3071
}
3061
3072
3062
3073
inline EscapableHandleScope::~EscapableHandleScope () {
@@ -3124,11 +3135,11 @@ inline AsyncWorker::AsyncWorker(const Object& receiver,
3124
3135
napi_value resource_id;
3125
3136
napi_status status = napi_create_string_latin1 (
3126
3137
_env, resource_name, NAPI_AUTO_LENGTH, &resource_id);
3127
- NAPI_THROW_IF_FAILED (_env, status);
3138
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3128
3139
3129
3140
status = napi_create_async_work (_env, resource, resource_id, OnExecute,
3130
3141
OnWorkComplete, this , &_work);
3131
- NAPI_THROW_IF_FAILED (_env, status);
3142
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3132
3143
}
3133
3144
3134
3145
inline AsyncWorker::~AsyncWorker () {
@@ -3169,12 +3180,12 @@ inline Napi::Env AsyncWorker::Env() const {
3169
3180
3170
3181
inline void AsyncWorker::Queue () {
3171
3182
napi_status status = napi_queue_async_work (_env, _work);
3172
- NAPI_THROW_IF_FAILED (_env, status);
3183
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3173
3184
}
3174
3185
3175
3186
inline void AsyncWorker::Cancel () {
3176
3187
napi_status status = napi_cancel_async_work (_env, _work);
3177
- NAPI_THROW_IF_FAILED (_env, status);
3188
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3178
3189
}
3179
3190
3180
3191
inline ObjectReference& AsyncWorker::Receiver () {
@@ -3197,7 +3208,7 @@ inline void AsyncWorker::SetError(const std::string& error) {
3197
3208
_error = error;
3198
3209
}
3199
3210
3200
- inline void AsyncWorker::OnExecute (napi_env env, void * this_pointer) {
3211
+ inline void AsyncWorker::OnExecute (napi_env /* env*/ , void * this_pointer) {
3201
3212
AsyncWorker* self = static_cast <AsyncWorker*>(this_pointer);
3202
3213
#ifdef NAPI_CPP_EXCEPTIONS
3203
3214
try {
@@ -3211,7 +3222,7 @@ inline void AsyncWorker::OnExecute(napi_env env, void* this_pointer) {
3211
3222
}
3212
3223
3213
3224
inline void AsyncWorker::OnWorkComplete (
3214
- napi_env env, napi_status status, void * this_pointer) {
3225
+ napi_env /* env*/ , napi_status status, void * this_pointer) {
3215
3226
AsyncWorker* self = static_cast <AsyncWorker*>(this_pointer);
3216
3227
if (status != napi_cancelled) {
3217
3228
HandleScope scope (self->_env );
0 commit comments