@@ -742,6 +742,9 @@ inline bool Value::IsExternal() const {
742
742
743
743
template <typename T>
744
744
inline T Value::As () const {
745
+ #ifdef NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS
746
+ T::CheckCast (_env, _value);
747
+ #endif
745
748
return T (_env, _value);
746
749
}
747
750
@@ -784,6 +787,16 @@ inline Boolean Boolean::New(napi_env env, bool val) {
784
787
return Boolean (env, value);
785
788
}
786
789
790
+ inline void Boolean::CheckCast (napi_env env, napi_value value) {
791
+ NAPI_CHECK (value != nullptr , " Boolean::CheckCast" , " empty value" );
792
+
793
+ napi_valuetype type;
794
+ napi_status status = napi_typeof (env, value, &type);
795
+ NAPI_CHECK (status == napi_ok, " Boolean::CheckCast" , " napi_typeof failed" );
796
+ NAPI_CHECK (
797
+ type == napi_boolean, " Boolean::CheckCast" , " value is not napi_boolean" );
798
+ }
799
+
787
800
inline Boolean::Boolean () : Napi::Value() {}
788
801
789
802
inline Boolean::Boolean (napi_env env, napi_value value)
@@ -811,6 +824,16 @@ inline Number Number::New(napi_env env, double val) {
811
824
return Number (env, value);
812
825
}
813
826
827
+ inline void Number::CheckCast (napi_env env, napi_value value) {
828
+ NAPI_CHECK (value != nullptr , " Number::CheckCast" , " empty value" );
829
+
830
+ napi_valuetype type;
831
+ napi_status status = napi_typeof (env, value, &type);
832
+ NAPI_CHECK (status == napi_ok, " Number::CheckCast" , " napi_typeof failed" );
833
+ NAPI_CHECK (
834
+ type == napi_number, " Number::CheckCast" , " value is not napi_number" );
835
+ }
836
+
814
837
inline Number::Number () : Value() {}
815
838
816
839
inline Number::Number (napi_env env, napi_value value) : Value(env, value) {}
@@ -897,6 +920,16 @@ inline BigInt BigInt::New(napi_env env,
897
920
return BigInt (env, value);
898
921
}
899
922
923
+ inline void BigInt::CheckCast (napi_env env, napi_value value) {
924
+ NAPI_CHECK (value != nullptr , " BigInt::CheckCast" , " empty value" );
925
+
926
+ napi_valuetype type;
927
+ napi_status status = napi_typeof (env, value, &type);
928
+ NAPI_CHECK (status == napi_ok, " BigInt::CheckCast" , " napi_typeof failed" );
929
+ NAPI_CHECK (
930
+ type == napi_bigint, " BigInt::CheckCast" , " value is not napi_bigint" );
931
+ }
932
+
900
933
inline BigInt::BigInt () : Value() {}
901
934
902
935
inline BigInt::BigInt (napi_env env, napi_value value) : Value(env, value) {}
@@ -946,6 +979,15 @@ inline Date Date::New(napi_env env, double val) {
946
979
return Date (env, value);
947
980
}
948
981
982
+ inline void Date::CheckCast (napi_env env, napi_value value) {
983
+ NAPI_CHECK (value != nullptr , " Date::CheckCast" , " empty value" );
984
+
985
+ bool result;
986
+ napi_status status = napi_is_date (env, value, &result);
987
+ NAPI_CHECK (status == napi_ok, " Date::CheckCast" , " napi_is_date failed" );
988
+ NAPI_CHECK (result, " Date::CheckCast" , " value is not date" );
989
+ }
990
+
949
991
inline Date::Date () : Value() {}
950
992
951
993
inline Date::Date (napi_env env, napi_value value) : Value(env, value) {}
@@ -965,6 +1007,16 @@ inline double Date::ValueOf() const {
965
1007
// //////////////////////////////////////////////////////////////////////////////
966
1008
// Name class
967
1009
// //////////////////////////////////////////////////////////////////////////////
1010
+ inline void Name::CheckCast (napi_env env, napi_value value) {
1011
+ NAPI_CHECK (value != nullptr , " Name::CheckCast" , " empty value" );
1012
+
1013
+ napi_valuetype type;
1014
+ napi_status status = napi_typeof (env, value, &type);
1015
+ NAPI_CHECK (status == napi_ok, " Name::CheckCast" , " napi_typeof failed" );
1016
+ NAPI_CHECK (type == napi_string || type == napi_symbol,
1017
+ " Name::CheckCast" ,
1018
+ " value is not napi_string or napi_symbol" );
1019
+ }
968
1020
969
1021
inline Name::Name () : Value() {}
970
1022
@@ -1024,6 +1076,16 @@ inline String String::New(napi_env env, const char16_t* val, size_t length) {
1024
1076
return String (env, value);
1025
1077
}
1026
1078
1079
+ inline void String::CheckCast (napi_env env, napi_value value) {
1080
+ NAPI_CHECK (value != nullptr , " String::CheckCast" , " empty value" );
1081
+
1082
+ napi_valuetype type;
1083
+ napi_status status = napi_typeof (env, value, &type);
1084
+ NAPI_CHECK (status == napi_ok, " String::CheckCast" , " napi_typeof failed" );
1085
+ NAPI_CHECK (
1086
+ type == napi_string, " String::CheckCast" , " value is not napi_string" );
1087
+ }
1088
+
1027
1089
inline String::String () : Name() {}
1028
1090
1029
1091
inline String::String (napi_env env, napi_value value) : Name(env, value) {}
@@ -1151,6 +1213,16 @@ inline MaybeOrValue<Symbol> Symbol::For(napi_env env, napi_value description) {
1151
1213
#endif
1152
1214
}
1153
1215
1216
+ inline void Symbol::CheckCast (napi_env env, napi_value value) {
1217
+ NAPI_CHECK (value != nullptr , " Symbol::CheckCast" , " empty value" );
1218
+
1219
+ napi_valuetype type;
1220
+ napi_status status = napi_typeof (env, value, &type);
1221
+ NAPI_CHECK (status == napi_ok, " Symbol::CheckCast" , " napi_typeof failed" );
1222
+ NAPI_CHECK (
1223
+ type == napi_symbol, " Symbol::CheckCast" , " value is not napi_symbol" );
1224
+ }
1225
+
1154
1226
inline Symbol::Symbol () : Name() {}
1155
1227
1156
1228
inline Symbol::Symbol (napi_env env, napi_value value) : Name(env, value) {}
@@ -1287,6 +1359,16 @@ inline Object Object::New(napi_env env) {
1287
1359
return Object (env, value);
1288
1360
}
1289
1361
1362
+ inline void Object::CheckCast (napi_env env, napi_value value) {
1363
+ NAPI_CHECK (value != nullptr , " Object::CheckCast" , " empty value" );
1364
+
1365
+ napi_valuetype type;
1366
+ napi_status status = napi_typeof (env, value, &type);
1367
+ NAPI_CHECK (status == napi_ok, " Object::CheckCast" , " napi_typeof failed" );
1368
+ NAPI_CHECK (
1369
+ type == napi_object, " Object::CheckCast" , " value is not napi_object" );
1370
+ }
1371
+
1290
1372
inline Object::Object () : Value() {}
1291
1373
1292
1374
inline Object::Object (napi_env env, napi_value value) : Value(env, value) {}
@@ -1705,6 +1787,18 @@ inline External<T> External<T>::New(napi_env env,
1705
1787
return External (env, value);
1706
1788
}
1707
1789
1790
+ template <typename T>
1791
+ inline void External<T>::CheckCast(napi_env env, napi_value value) {
1792
+ NAPI_CHECK (value != nullptr , " External::CheckCast" , " empty value" );
1793
+
1794
+ napi_valuetype type;
1795
+ napi_status status = napi_typeof (env, value, &type);
1796
+ NAPI_CHECK (status == napi_ok, " External::CheckCast" , " napi_typeof failed" );
1797
+ NAPI_CHECK (type == napi_external,
1798
+ " External::CheckCast" ,
1799
+ " value is not napi_external" );
1800
+ }
1801
+
1708
1802
template <typename T>
1709
1803
inline External<T>::External() : Value() {}
1710
1804
@@ -1738,6 +1832,15 @@ inline Array Array::New(napi_env env, size_t length) {
1738
1832
return Array (env, value);
1739
1833
}
1740
1834
1835
+ inline void Array::CheckCast (napi_env env, napi_value value) {
1836
+ NAPI_CHECK (value != nullptr , " Array::CheckCast" , " empty value" );
1837
+
1838
+ bool result;
1839
+ napi_status status = napi_is_array (env, value, &result);
1840
+ NAPI_CHECK (status == napi_ok, " Array::CheckCast" , " napi_is_array failed" );
1841
+ NAPI_CHECK (result, " Array::CheckCast" , " value is not array" );
1842
+ }
1843
+
1741
1844
inline Array::Array () : Object() {}
1742
1845
1743
1846
inline Array::Array (napi_env env, napi_value value) : Object(env, value) {}
@@ -1824,6 +1927,17 @@ inline ArrayBuffer ArrayBuffer::New(napi_env env,
1824
1927
}
1825
1928
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1826
1929
1930
+ inline void ArrayBuffer::CheckCast (napi_env env, napi_value value) {
1931
+ NAPI_CHECK (value != nullptr , " ArrayBuffer::CheckCast" , " empty value" );
1932
+
1933
+ bool result;
1934
+ napi_status status = napi_is_arraybuffer (env, value, &result);
1935
+ NAPI_CHECK (status == napi_ok,
1936
+ " ArrayBuffer::CheckCast" ,
1937
+ " napi_is_arraybuffer failed" );
1938
+ NAPI_CHECK (result, " ArrayBuffer::CheckCast" , " value is not arraybuffer" );
1939
+ }
1940
+
1827
1941
inline ArrayBuffer::ArrayBuffer () : Object() {}
1828
1942
1829
1943
inline ArrayBuffer::ArrayBuffer (napi_env env, napi_value value)
@@ -1891,6 +2005,16 @@ inline DataView DataView::New(napi_env env,
1891
2005
return DataView (env, value);
1892
2006
}
1893
2007
2008
+ inline void DataView::CheckCast (napi_env env, napi_value value) {
2009
+ NAPI_CHECK (value != nullptr , " DataView::CheckCast" , " empty value" );
2010
+
2011
+ bool result;
2012
+ napi_status status = napi_is_dataview (env, value, &result);
2013
+ NAPI_CHECK (
2014
+ status == napi_ok, " DataView::CheckCast" , " napi_is_dataview failed" );
2015
+ NAPI_CHECK (result, " DataView::CheckCast" , " value is not dataview" );
2016
+ }
2017
+
1894
2018
inline DataView::DataView () : Object() {}
1895
2019
1896
2020
inline DataView::DataView (napi_env env, napi_value value) : Object(env, value) {
@@ -2025,6 +2149,15 @@ inline void DataView::WriteData(size_t byteOffset, T value) const {
2025
2149
// //////////////////////////////////////////////////////////////////////////////
2026
2150
// TypedArray class
2027
2151
// //////////////////////////////////////////////////////////////////////////////
2152
+ inline void TypedArray::CheckCast (napi_env env, napi_value value) {
2153
+ NAPI_CHECK (value != nullptr , " TypedArray::CheckCast" , " empty value" );
2154
+
2155
+ bool result;
2156
+ napi_status status = napi_is_typedarray (env, value, &result);
2157
+ NAPI_CHECK (
2158
+ status == napi_ok, " TypedArray::CheckCast" , " napi_is_typedarray failed" );
2159
+ NAPI_CHECK (result, " TypedArray::CheckCast" , " value is not typedarray" );
2160
+ }
2028
2161
2029
2162
inline TypedArray::TypedArray ()
2030
2163
: Object(), _type(napi_typedarray_type::napi_int8_array), _length(0 ) {}
@@ -2107,6 +2240,23 @@ inline Napi::ArrayBuffer TypedArray::ArrayBuffer() const {
2107
2240
// //////////////////////////////////////////////////////////////////////////////
2108
2241
// TypedArrayOf<T> class
2109
2242
// //////////////////////////////////////////////////////////////////////////////
2243
+ template <typename T>
2244
+ inline void TypedArrayOf<T>::CheckCast(napi_env env, napi_value value) {
2245
+ TypedArray::CheckCast (env, value);
2246
+ napi_typedarray_type type;
2247
+ napi_status status = napi_get_typedarray_info (
2248
+ env, value, &type, nullptr , nullptr , nullptr , nullptr );
2249
+ NAPI_CHECK (status == napi_ok,
2250
+ " TypedArrayOf::CheckCast" ,
2251
+ " napi_is_typedarray failed" );
2252
+
2253
+ NAPI_CHECK (
2254
+ (type == TypedArrayTypeForPrimitiveType<T>() ||
2255
+ (type == napi_uint8_clamped_array && std::is_same<T, uint8_t >::value)),
2256
+ " TypedArrayOf::CheckCast" ,
2257
+ " Array type must match the template parameter. (Uint8 arrays may "
2258
+ " optionally have the \" clamped\" array type.)" );
2259
+ }
2110
2260
2111
2261
template <typename T>
2112
2262
inline TypedArrayOf<T> TypedArrayOf<T>::New(napi_env env,
@@ -2280,6 +2430,17 @@ inline Function Function::New(napi_env env,
2280
2430
return New (env, cb, utf8name.c_str (), data);
2281
2431
}
2282
2432
2433
+ inline void Function::CheckCast (napi_env env, napi_value value) {
2434
+ NAPI_CHECK (value != nullptr , " Function::CheckCast" , " empty value" );
2435
+
2436
+ napi_valuetype type;
2437
+ napi_status status = napi_typeof (env, value, &type);
2438
+ NAPI_CHECK (status == napi_ok, " Function::CheckCast" , " napi_typeof failed" );
2439
+ NAPI_CHECK (type == napi_function,
2440
+ " Function::CheckCast" ,
2441
+ " value is not napi_function" );
2442
+ }
2443
+
2283
2444
inline Function::Function () : Object() {}
2284
2445
2285
2446
inline Function::Function (napi_env env, napi_value value)
@@ -2426,6 +2587,15 @@ inline void Promise::Deferred::Reject(napi_value value) const {
2426
2587
NAPI_THROW_IF_FAILED_VOID (_env, status);
2427
2588
}
2428
2589
2590
+ inline void Promise::CheckCast (napi_env env, napi_value value) {
2591
+ NAPI_CHECK (value != nullptr , " Promise::CheckCast" , " empty value" );
2592
+
2593
+ bool result;
2594
+ napi_status status = napi_is_promise (env, value, &result);
2595
+ NAPI_CHECK (status == napi_ok, " Promise::CheckCast" , " napi_is_promise failed" );
2596
+ NAPI_CHECK (result, " Promise::CheckCast" , " value is not promise" );
2597
+ }
2598
+
2429
2599
inline Promise::Promise (napi_env env, napi_value value) : Object(env, value) {}
2430
2600
2431
2601
// //////////////////////////////////////////////////////////////////////////////
@@ -2598,6 +2768,16 @@ inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) {
2598
2768
return Buffer<T>(env, value);
2599
2769
}
2600
2770
2771
+ template <typename T>
2772
+ inline void Buffer<T>::CheckCast (napi_env env, napi_value value) {
2773
+ NAPI_CHECK (value != nullptr , " Buffer::CheckCast" , " empty value" );
2774
+
2775
+ bool result;
2776
+ napi_status status = napi_is_buffer (env, value, &result);
2777
+ NAPI_CHECK (status == napi_ok, " Buffer::CheckCast" , " napi_is_buffer failed" );
2778
+ NAPI_CHECK (result, " Buffer::CheckCast" , " value is not buffer" );
2779
+ }
2780
+
2601
2781
template <typename T>
2602
2782
inline Buffer<T>::Buffer () : Uint8Array (), _length (0 ), _data (nullptr ) {}
2603
2783
0 commit comments