koffi 2.3.17 → 2.3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/build/2.3.19/koffi_darwin_arm64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_darwin_x64/koffi.node +0 -0
- package/build/2.3.19/koffi_freebsd_arm64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_freebsd_ia32/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_freebsd_x64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_linux_arm32hf/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_linux_arm64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_linux_ia32/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_linux_riscv64hf64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_linux_x64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_openbsd_ia32/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_openbsd_x64/koffi.node +0 -0
- package/build/2.3.19/koffi_win32_arm64/koffi.node +0 -0
- package/build/{2.3.17 → 2.3.19}/koffi_win32_ia32/koffi.node +0 -0
- package/build/2.3.19/koffi_win32_x64/koffi.node +0 -0
- package/package.json +2 -2
- package/src/koffi/src/call.cc +16 -8
- package/src/koffi/src/ffi.cc +3 -4
- package/src/koffi/src/ffi.hh +2 -0
- package/vendor/node-addon-api/CHANGELOG.md +41 -0
- package/vendor/node-addon-api/README.md +1 -1
- package/vendor/node-addon-api/doc/array_buffer.md +10 -0
- package/vendor/node-addon-api/doc/buffer.md +97 -0
- package/vendor/node-addon-api/doc/env.md +2 -2
- package/vendor/node-addon-api/doc/external.md +2 -2
- package/vendor/node-addon-api/doc/external_buffer.md +18 -0
- package/vendor/node-addon-api/doc/hierarchy.md +4 -2
- package/vendor/node-addon-api/doc/object.md +2 -29
- package/vendor/node-addon-api/doc/type_taggable.md +40 -0
- package/vendor/node-addon-api/doc/value.md +7 -1
- package/vendor/node-addon-api/napi-inl.h +317 -22
- package/vendor/node-addon-api/napi.h +84 -7
- package/vendor/node-addon-api/package.json +9 -1
- package/vendor/node-addon-api/test/async_progress_worker.cc +15 -3
- package/vendor/node-addon-api/test/binding.cc +4 -2
- package/vendor/node-addon-api/test/binding.gyp +11 -1
- package/vendor/node-addon-api/test/buffer.cc +13 -19
- package/vendor/node-addon-api/test/buffer.h +26 -0
- package/vendor/node-addon-api/test/buffer.js +82 -0
- package/vendor/node-addon-api/test/buffer_new_or_copy-inl.h +68 -0
- package/vendor/node-addon-api/test/buffer_no_external.cc +24 -0
- package/vendor/node-addon-api/test/error.cc +101 -0
- package/vendor/node-addon-api/test/error.js +15 -1
- package/vendor/node-addon-api/test/index.js +1 -1
- package/vendor/node-addon-api/test/object_reference.cc +220 -22
- package/vendor/node-addon-api/test/object_reference.js +83 -80
- package/vendor/node-addon-api/test/objectwrap.cc +23 -3
- package/vendor/node-addon-api/test/objectwrap.js +14 -2
- package/vendor/node-addon-api/test/reference.cc +55 -1
- package/vendor/node-addon-api/test/reference.js +7 -1
- package/vendor/node-addon-api/test/type_taggable.cc +66 -0
- package/vendor/node-addon-api/test/type_taggable.js +60 -0
- package/vendor/node-addon-api/test/value_type_cast.cc +60 -0
- package/vendor/node-addon-api/test/value_type_cast.js +106 -0
- package/vendor/node-addon-api/tools/eslint-format.js +2 -2
- package/build/2.3.17/koffi_darwin_arm64/koffi.node +0 -0
- package/build/2.3.17/koffi_freebsd_arm64/koffi.node +0 -0
- package/build/2.3.17/koffi_win32_arm64/koffi.node +0 -0
- package/build/2.3.17/koffi_win32_x64/koffi.node +0 -0
- package/vendor/node-addon-api/test/object/object_type_tag.cc +0 -39
- package/vendor/node-addon-api/test/object/object_type_tag.js +0 -55
- /package/build/{2.3.17 → 2.3.19}/koffi_win32_arm64/koffi.exp +0 -0
- /package/build/{2.3.17 → 2.3.19}/koffi_win32_arm64/koffi.lib +0 -0
- /package/build/{2.3.17 → 2.3.19}/koffi_win32_ia32/koffi.exp +0 -0
- /package/build/{2.3.17 → 2.3.19}/koffi_win32_ia32/koffi.lib +0 -0
- /package/build/{2.3.17 → 2.3.19}/koffi_win32_x64/koffi.exp +0 -0
- /package/build/{2.3.17 → 2.3.19}/koffi_win32_x64/koffi.lib +0 -0
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
#include <algorithm>
|
|
14
14
|
#include <cstring>
|
|
15
|
+
#if NAPI_HAS_THREADS
|
|
15
16
|
#include <mutex>
|
|
17
|
+
#endif // NAPI_HAS_THREADS
|
|
16
18
|
#include <type_traits>
|
|
17
19
|
#include <utility>
|
|
18
20
|
|
|
@@ -22,9 +24,13 @@ namespace Napi {
|
|
|
22
24
|
namespace NAPI_CPP_CUSTOM_NAMESPACE {
|
|
23
25
|
#endif
|
|
24
26
|
|
|
25
|
-
// Helpers to handle functions exposed from C
|
|
27
|
+
// Helpers to handle functions exposed from C++ and internal constants.
|
|
26
28
|
namespace details {
|
|
27
29
|
|
|
30
|
+
// New napi_status constants not yet available in all supported versions of
|
|
31
|
+
// Node.js releases. Only necessary when they are used in napi.h and napi-inl.h.
|
|
32
|
+
constexpr int napi_no_external_buffers_allowed = 22;
|
|
33
|
+
|
|
28
34
|
// Attach a data item to an object and delete it when the object gets
|
|
29
35
|
// garbage-collected.
|
|
30
36
|
// TODO: Replace this code with `napi_add_finalizer()` whenever it becomes
|
|
@@ -201,7 +207,7 @@ struct FinalizeData {
|
|
|
201
207
|
Hint* hint;
|
|
202
208
|
};
|
|
203
209
|
|
|
204
|
-
#if (NAPI_VERSION > 3 &&
|
|
210
|
+
#if (NAPI_VERSION > 3 && NAPI_HAS_THREADS)
|
|
205
211
|
template <typename ContextType = void,
|
|
206
212
|
typename Finalizer = std::function<void(Env, void*, ContextType*)>,
|
|
207
213
|
typename FinalizerDataType = void>
|
|
@@ -295,7 +301,7 @@ napi_value DefaultCallbackWrapper(napi_env env, Napi::Function cb) {
|
|
|
295
301
|
return cb;
|
|
296
302
|
}
|
|
297
303
|
#endif // NAPI_VERSION > 4
|
|
298
|
-
#endif // NAPI_VERSION > 3 &&
|
|
304
|
+
#endif // NAPI_VERSION > 3 && NAPI_HAS_THREADS
|
|
299
305
|
|
|
300
306
|
template <typename Getter, typename Setter>
|
|
301
307
|
struct AccessorCallbackData {
|
|
@@ -736,6 +742,9 @@ inline bool Value::IsExternal() const {
|
|
|
736
742
|
|
|
737
743
|
template <typename T>
|
|
738
744
|
inline T Value::As() const {
|
|
745
|
+
#ifdef NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS
|
|
746
|
+
T::CheckCast(_env, _value);
|
|
747
|
+
#endif
|
|
739
748
|
return T(_env, _value);
|
|
740
749
|
}
|
|
741
750
|
|
|
@@ -778,6 +787,16 @@ inline Boolean Boolean::New(napi_env env, bool val) {
|
|
|
778
787
|
return Boolean(env, value);
|
|
779
788
|
}
|
|
780
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
|
+
|
|
781
800
|
inline Boolean::Boolean() : Napi::Value() {}
|
|
782
801
|
|
|
783
802
|
inline Boolean::Boolean(napi_env env, napi_value value)
|
|
@@ -805,6 +824,16 @@ inline Number Number::New(napi_env env, double val) {
|
|
|
805
824
|
return Number(env, value);
|
|
806
825
|
}
|
|
807
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
|
+
|
|
808
837
|
inline Number::Number() : Value() {}
|
|
809
838
|
|
|
810
839
|
inline Number::Number(napi_env env, napi_value value) : Value(env, value) {}
|
|
@@ -891,6 +920,16 @@ inline BigInt BigInt::New(napi_env env,
|
|
|
891
920
|
return BigInt(env, value);
|
|
892
921
|
}
|
|
893
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
|
+
|
|
894
933
|
inline BigInt::BigInt() : Value() {}
|
|
895
934
|
|
|
896
935
|
inline BigInt::BigInt(napi_env env, napi_value value) : Value(env, value) {}
|
|
@@ -940,6 +979,15 @@ inline Date Date::New(napi_env env, double val) {
|
|
|
940
979
|
return Date(env, value);
|
|
941
980
|
}
|
|
942
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
|
+
|
|
943
991
|
inline Date::Date() : Value() {}
|
|
944
992
|
|
|
945
993
|
inline Date::Date(napi_env env, napi_value value) : Value(env, value) {}
|
|
@@ -959,6 +1007,16 @@ inline double Date::ValueOf() const {
|
|
|
959
1007
|
////////////////////////////////////////////////////////////////////////////////
|
|
960
1008
|
// Name class
|
|
961
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
|
+
}
|
|
962
1020
|
|
|
963
1021
|
inline Name::Name() : Value() {}
|
|
964
1022
|
|
|
@@ -1018,6 +1076,16 @@ inline String String::New(napi_env env, const char16_t* val, size_t length) {
|
|
|
1018
1076
|
return String(env, value);
|
|
1019
1077
|
}
|
|
1020
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
|
+
|
|
1021
1089
|
inline String::String() : Name() {}
|
|
1022
1090
|
|
|
1023
1091
|
inline String::String(napi_env env, napi_value value) : Name(env, value) {}
|
|
@@ -1145,6 +1213,16 @@ inline MaybeOrValue<Symbol> Symbol::For(napi_env env, napi_value description) {
|
|
|
1145
1213
|
#endif
|
|
1146
1214
|
}
|
|
1147
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
|
+
|
|
1148
1226
|
inline Symbol::Symbol() : Name() {}
|
|
1149
1227
|
|
|
1150
1228
|
inline Symbol::Symbol(napi_env env, napi_value value) : Name(env, value) {}
|
|
@@ -1242,6 +1320,32 @@ String String::From(napi_env env, const T& value) {
|
|
|
1242
1320
|
return Helper::From(env, value);
|
|
1243
1321
|
}
|
|
1244
1322
|
|
|
1323
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
1324
|
+
// TypeTaggable class
|
|
1325
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
1326
|
+
|
|
1327
|
+
inline TypeTaggable::TypeTaggable() : Value() {}
|
|
1328
|
+
|
|
1329
|
+
inline TypeTaggable::TypeTaggable(napi_env _env, napi_value _value)
|
|
1330
|
+
: Value(_env, _value) {}
|
|
1331
|
+
|
|
1332
|
+
#if NAPI_VERSION >= 8
|
|
1333
|
+
|
|
1334
|
+
inline void TypeTaggable::TypeTag(const napi_type_tag* type_tag) const {
|
|
1335
|
+
napi_status status = napi_type_tag_object(_env, _value, type_tag);
|
|
1336
|
+
NAPI_THROW_IF_FAILED_VOID(_env, status);
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
inline bool TypeTaggable::CheckTypeTag(const napi_type_tag* type_tag) const {
|
|
1340
|
+
bool result;
|
|
1341
|
+
napi_status status =
|
|
1342
|
+
napi_check_object_type_tag(_env, _value, type_tag, &result);
|
|
1343
|
+
NAPI_THROW_IF_FAILED(_env, status, false);
|
|
1344
|
+
return result;
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
#endif // NAPI_VERSION >= 8
|
|
1348
|
+
|
|
1245
1349
|
////////////////////////////////////////////////////////////////////////////////
|
|
1246
1350
|
// Object class
|
|
1247
1351
|
////////////////////////////////////////////////////////////////////////////////
|
|
@@ -1281,9 +1385,20 @@ inline Object Object::New(napi_env env) {
|
|
|
1281
1385
|
return Object(env, value);
|
|
1282
1386
|
}
|
|
1283
1387
|
|
|
1284
|
-
inline Object::
|
|
1388
|
+
inline void Object::CheckCast(napi_env env, napi_value value) {
|
|
1389
|
+
NAPI_CHECK(value != nullptr, "Object::CheckCast", "empty value");
|
|
1285
1390
|
|
|
1286
|
-
|
|
1391
|
+
napi_valuetype type;
|
|
1392
|
+
napi_status status = napi_typeof(env, value, &type);
|
|
1393
|
+
NAPI_CHECK(status == napi_ok, "Object::CheckCast", "napi_typeof failed");
|
|
1394
|
+
NAPI_CHECK(
|
|
1395
|
+
type == napi_object, "Object::CheckCast", "value is not napi_object");
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
inline Object::Object() : TypeTaggable() {}
|
|
1399
|
+
|
|
1400
|
+
inline Object::Object(napi_env env, napi_value value)
|
|
1401
|
+
: TypeTaggable(env, value) {}
|
|
1287
1402
|
|
|
1288
1403
|
inline Object::PropertyLValue<std::string> Object::operator[](
|
|
1289
1404
|
const char* utf8name) {
|
|
@@ -1626,19 +1741,6 @@ inline MaybeOrValue<bool> Object::Seal() const {
|
|
|
1626
1741
|
napi_status status = napi_object_seal(_env, _value);
|
|
1627
1742
|
NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
|
|
1628
1743
|
}
|
|
1629
|
-
|
|
1630
|
-
inline void Object::TypeTag(const napi_type_tag* type_tag) const {
|
|
1631
|
-
napi_status status = napi_type_tag_object(_env, _value, type_tag);
|
|
1632
|
-
NAPI_THROW_IF_FAILED_VOID(_env, status);
|
|
1633
|
-
}
|
|
1634
|
-
|
|
1635
|
-
inline bool Object::CheckTypeTag(const napi_type_tag* type_tag) const {
|
|
1636
|
-
bool result;
|
|
1637
|
-
napi_status status =
|
|
1638
|
-
napi_check_object_type_tag(_env, _value, type_tag, &result);
|
|
1639
|
-
NAPI_THROW_IF_FAILED(_env, status, false);
|
|
1640
|
-
return result;
|
|
1641
|
-
}
|
|
1642
1744
|
#endif // NAPI_VERSION >= 8
|
|
1643
1745
|
|
|
1644
1746
|
////////////////////////////////////////////////////////////////////////////////
|
|
@@ -1700,11 +1802,23 @@ inline External<T> External<T>::New(napi_env env,
|
|
|
1700
1802
|
}
|
|
1701
1803
|
|
|
1702
1804
|
template <typename T>
|
|
1703
|
-
inline External<T>::
|
|
1805
|
+
inline void External<T>::CheckCast(napi_env env, napi_value value) {
|
|
1806
|
+
NAPI_CHECK(value != nullptr, "External::CheckCast", "empty value");
|
|
1807
|
+
|
|
1808
|
+
napi_valuetype type;
|
|
1809
|
+
napi_status status = napi_typeof(env, value, &type);
|
|
1810
|
+
NAPI_CHECK(status == napi_ok, "External::CheckCast", "napi_typeof failed");
|
|
1811
|
+
NAPI_CHECK(type == napi_external,
|
|
1812
|
+
"External::CheckCast",
|
|
1813
|
+
"value is not napi_external");
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
template <typename T>
|
|
1817
|
+
inline External<T>::External() : TypeTaggable() {}
|
|
1704
1818
|
|
|
1705
1819
|
template <typename T>
|
|
1706
1820
|
inline External<T>::External(napi_env env, napi_value value)
|
|
1707
|
-
:
|
|
1821
|
+
: TypeTaggable(env, value) {}
|
|
1708
1822
|
|
|
1709
1823
|
template <typename T>
|
|
1710
1824
|
inline T* External<T>::Data() const {
|
|
@@ -1732,6 +1846,15 @@ inline Array Array::New(napi_env env, size_t length) {
|
|
|
1732
1846
|
return Array(env, value);
|
|
1733
1847
|
}
|
|
1734
1848
|
|
|
1849
|
+
inline void Array::CheckCast(napi_env env, napi_value value) {
|
|
1850
|
+
NAPI_CHECK(value != nullptr, "Array::CheckCast", "empty value");
|
|
1851
|
+
|
|
1852
|
+
bool result;
|
|
1853
|
+
napi_status status = napi_is_array(env, value, &result);
|
|
1854
|
+
NAPI_CHECK(status == napi_ok, "Array::CheckCast", "napi_is_array failed");
|
|
1855
|
+
NAPI_CHECK(result, "Array::CheckCast", "value is not array");
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1735
1858
|
inline Array::Array() : Object() {}
|
|
1736
1859
|
|
|
1737
1860
|
inline Array::Array(napi_env env, napi_value value) : Object(env, value) {}
|
|
@@ -1756,6 +1879,7 @@ inline ArrayBuffer ArrayBuffer::New(napi_env env, size_t byteLength) {
|
|
|
1756
1879
|
return ArrayBuffer(env, value);
|
|
1757
1880
|
}
|
|
1758
1881
|
|
|
1882
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
1759
1883
|
inline ArrayBuffer ArrayBuffer::New(napi_env env,
|
|
1760
1884
|
void* externalData,
|
|
1761
1885
|
size_t byteLength) {
|
|
@@ -1815,6 +1939,18 @@ inline ArrayBuffer ArrayBuffer::New(napi_env env,
|
|
|
1815
1939
|
|
|
1816
1940
|
return ArrayBuffer(env, value);
|
|
1817
1941
|
}
|
|
1942
|
+
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
1943
|
+
|
|
1944
|
+
inline void ArrayBuffer::CheckCast(napi_env env, napi_value value) {
|
|
1945
|
+
NAPI_CHECK(value != nullptr, "ArrayBuffer::CheckCast", "empty value");
|
|
1946
|
+
|
|
1947
|
+
bool result;
|
|
1948
|
+
napi_status status = napi_is_arraybuffer(env, value, &result);
|
|
1949
|
+
NAPI_CHECK(status == napi_ok,
|
|
1950
|
+
"ArrayBuffer::CheckCast",
|
|
1951
|
+
"napi_is_arraybuffer failed");
|
|
1952
|
+
NAPI_CHECK(result, "ArrayBuffer::CheckCast", "value is not arraybuffer");
|
|
1953
|
+
}
|
|
1818
1954
|
|
|
1819
1955
|
inline ArrayBuffer::ArrayBuffer() : Object() {}
|
|
1820
1956
|
|
|
@@ -1883,6 +2019,16 @@ inline DataView DataView::New(napi_env env,
|
|
|
1883
2019
|
return DataView(env, value);
|
|
1884
2020
|
}
|
|
1885
2021
|
|
|
2022
|
+
inline void DataView::CheckCast(napi_env env, napi_value value) {
|
|
2023
|
+
NAPI_CHECK(value != nullptr, "DataView::CheckCast", "empty value");
|
|
2024
|
+
|
|
2025
|
+
bool result;
|
|
2026
|
+
napi_status status = napi_is_dataview(env, value, &result);
|
|
2027
|
+
NAPI_CHECK(
|
|
2028
|
+
status == napi_ok, "DataView::CheckCast", "napi_is_dataview failed");
|
|
2029
|
+
NAPI_CHECK(result, "DataView::CheckCast", "value is not dataview");
|
|
2030
|
+
}
|
|
2031
|
+
|
|
1886
2032
|
inline DataView::DataView() : Object() {}
|
|
1887
2033
|
|
|
1888
2034
|
inline DataView::DataView(napi_env env, napi_value value) : Object(env, value) {
|
|
@@ -2017,6 +2163,15 @@ inline void DataView::WriteData(size_t byteOffset, T value) const {
|
|
|
2017
2163
|
////////////////////////////////////////////////////////////////////////////////
|
|
2018
2164
|
// TypedArray class
|
|
2019
2165
|
////////////////////////////////////////////////////////////////////////////////
|
|
2166
|
+
inline void TypedArray::CheckCast(napi_env env, napi_value value) {
|
|
2167
|
+
NAPI_CHECK(value != nullptr, "TypedArray::CheckCast", "empty value");
|
|
2168
|
+
|
|
2169
|
+
bool result;
|
|
2170
|
+
napi_status status = napi_is_typedarray(env, value, &result);
|
|
2171
|
+
NAPI_CHECK(
|
|
2172
|
+
status == napi_ok, "TypedArray::CheckCast", "napi_is_typedarray failed");
|
|
2173
|
+
NAPI_CHECK(result, "TypedArray::CheckCast", "value is not typedarray");
|
|
2174
|
+
}
|
|
2020
2175
|
|
|
2021
2176
|
inline TypedArray::TypedArray()
|
|
2022
2177
|
: Object(), _type(napi_typedarray_type::napi_int8_array), _length(0) {}
|
|
@@ -2099,6 +2254,23 @@ inline Napi::ArrayBuffer TypedArray::ArrayBuffer() const {
|
|
|
2099
2254
|
////////////////////////////////////////////////////////////////////////////////
|
|
2100
2255
|
// TypedArrayOf<T> class
|
|
2101
2256
|
////////////////////////////////////////////////////////////////////////////////
|
|
2257
|
+
template <typename T>
|
|
2258
|
+
inline void TypedArrayOf<T>::CheckCast(napi_env env, napi_value value) {
|
|
2259
|
+
TypedArray::CheckCast(env, value);
|
|
2260
|
+
napi_typedarray_type type;
|
|
2261
|
+
napi_status status = napi_get_typedarray_info(
|
|
2262
|
+
env, value, &type, nullptr, nullptr, nullptr, nullptr);
|
|
2263
|
+
NAPI_CHECK(status == napi_ok,
|
|
2264
|
+
"TypedArrayOf::CheckCast",
|
|
2265
|
+
"napi_is_typedarray failed");
|
|
2266
|
+
|
|
2267
|
+
NAPI_CHECK(
|
|
2268
|
+
(type == TypedArrayTypeForPrimitiveType<T>() ||
|
|
2269
|
+
(type == napi_uint8_clamped_array && std::is_same<T, uint8_t>::value)),
|
|
2270
|
+
"TypedArrayOf::CheckCast",
|
|
2271
|
+
"Array type must match the template parameter. (Uint8 arrays may "
|
|
2272
|
+
"optionally have the \"clamped\" array type.)");
|
|
2273
|
+
}
|
|
2102
2274
|
|
|
2103
2275
|
template <typename T>
|
|
2104
2276
|
inline TypedArrayOf<T> TypedArrayOf<T>::New(napi_env env,
|
|
@@ -2272,6 +2444,17 @@ inline Function Function::New(napi_env env,
|
|
|
2272
2444
|
return New(env, cb, utf8name.c_str(), data);
|
|
2273
2445
|
}
|
|
2274
2446
|
|
|
2447
|
+
inline void Function::CheckCast(napi_env env, napi_value value) {
|
|
2448
|
+
NAPI_CHECK(value != nullptr, "Function::CheckCast", "empty value");
|
|
2449
|
+
|
|
2450
|
+
napi_valuetype type;
|
|
2451
|
+
napi_status status = napi_typeof(env, value, &type);
|
|
2452
|
+
NAPI_CHECK(status == napi_ok, "Function::CheckCast", "napi_typeof failed");
|
|
2453
|
+
NAPI_CHECK(type == napi_function,
|
|
2454
|
+
"Function::CheckCast",
|
|
2455
|
+
"value is not napi_function");
|
|
2456
|
+
}
|
|
2457
|
+
|
|
2275
2458
|
inline Function::Function() : Object() {}
|
|
2276
2459
|
|
|
2277
2460
|
inline Function::Function(napi_env env, napi_value value)
|
|
@@ -2418,6 +2601,15 @@ inline void Promise::Deferred::Reject(napi_value value) const {
|
|
|
2418
2601
|
NAPI_THROW_IF_FAILED_VOID(_env, status);
|
|
2419
2602
|
}
|
|
2420
2603
|
|
|
2604
|
+
inline void Promise::CheckCast(napi_env env, napi_value value) {
|
|
2605
|
+
NAPI_CHECK(value != nullptr, "Promise::CheckCast", "empty value");
|
|
2606
|
+
|
|
2607
|
+
bool result;
|
|
2608
|
+
napi_status status = napi_is_promise(env, value, &result);
|
|
2609
|
+
NAPI_CHECK(status == napi_ok, "Promise::CheckCast", "napi_is_promise failed");
|
|
2610
|
+
NAPI_CHECK(result, "Promise::CheckCast", "value is not promise");
|
|
2611
|
+
}
|
|
2612
|
+
|
|
2421
2613
|
inline Promise::Promise(napi_env env, napi_value value) : Object(env, value) {}
|
|
2422
2614
|
|
|
2423
2615
|
////////////////////////////////////////////////////////////////////////////////
|
|
@@ -2434,6 +2626,7 @@ inline Buffer<T> Buffer<T>::New(napi_env env, size_t length) {
|
|
|
2434
2626
|
return Buffer(env, value, length, static_cast<T*>(data));
|
|
2435
2627
|
}
|
|
2436
2628
|
|
|
2629
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2437
2630
|
template <typename T>
|
|
2438
2631
|
inline Buffer<T> Buffer<T>::New(napi_env env, T* data, size_t length) {
|
|
2439
2632
|
napi_value value;
|
|
@@ -2491,6 +2684,94 @@ inline Buffer<T> Buffer<T>::New(napi_env env,
|
|
|
2491
2684
|
}
|
|
2492
2685
|
return Buffer(env, value, length, data);
|
|
2493
2686
|
}
|
|
2687
|
+
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2688
|
+
|
|
2689
|
+
template <typename T>
|
|
2690
|
+
inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env, T* data, size_t length) {
|
|
2691
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2692
|
+
napi_value value;
|
|
2693
|
+
napi_status status = napi_create_external_buffer(
|
|
2694
|
+
env, length * sizeof(T), data, nullptr, nullptr, &value);
|
|
2695
|
+
if (status == details::napi_no_external_buffers_allowed) {
|
|
2696
|
+
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2697
|
+
// If we can't create an external buffer, we'll just copy the data.
|
|
2698
|
+
return Buffer<T>::Copy(env, data, length);
|
|
2699
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2700
|
+
}
|
|
2701
|
+
NAPI_THROW_IF_FAILED(env, status, Buffer<T>());
|
|
2702
|
+
return Buffer(env, value, length, data);
|
|
2703
|
+
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2704
|
+
}
|
|
2705
|
+
|
|
2706
|
+
template <typename T>
|
|
2707
|
+
template <typename Finalizer>
|
|
2708
|
+
inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env,
|
|
2709
|
+
T* data,
|
|
2710
|
+
size_t length,
|
|
2711
|
+
Finalizer finalizeCallback) {
|
|
2712
|
+
details::FinalizeData<T, Finalizer>* finalizeData =
|
|
2713
|
+
new details::FinalizeData<T, Finalizer>(
|
|
2714
|
+
{std::move(finalizeCallback), nullptr});
|
|
2715
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2716
|
+
napi_value value;
|
|
2717
|
+
napi_status status =
|
|
2718
|
+
napi_create_external_buffer(env,
|
|
2719
|
+
length * sizeof(T),
|
|
2720
|
+
data,
|
|
2721
|
+
details::FinalizeData<T, Finalizer>::Wrapper,
|
|
2722
|
+
finalizeData,
|
|
2723
|
+
&value);
|
|
2724
|
+
if (status == details::napi_no_external_buffers_allowed) {
|
|
2725
|
+
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2726
|
+
// If we can't create an external buffer, we'll just copy the data.
|
|
2727
|
+
Buffer<T> ret = Buffer<T>::Copy(env, data, length);
|
|
2728
|
+
details::FinalizeData<T, Finalizer>::Wrapper(env, data, finalizeData);
|
|
2729
|
+
return ret;
|
|
2730
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2731
|
+
}
|
|
2732
|
+
if (status != napi_ok) {
|
|
2733
|
+
delete finalizeData;
|
|
2734
|
+
NAPI_THROW_IF_FAILED(env, status, Buffer());
|
|
2735
|
+
}
|
|
2736
|
+
return Buffer(env, value, length, data);
|
|
2737
|
+
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
template <typename T>
|
|
2741
|
+
template <typename Finalizer, typename Hint>
|
|
2742
|
+
inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env,
|
|
2743
|
+
T* data,
|
|
2744
|
+
size_t length,
|
|
2745
|
+
Finalizer finalizeCallback,
|
|
2746
|
+
Hint* finalizeHint) {
|
|
2747
|
+
details::FinalizeData<T, Finalizer, Hint>* finalizeData =
|
|
2748
|
+
new details::FinalizeData<T, Finalizer, Hint>(
|
|
2749
|
+
{std::move(finalizeCallback), finalizeHint});
|
|
2750
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2751
|
+
napi_value value;
|
|
2752
|
+
napi_status status = napi_create_external_buffer(
|
|
2753
|
+
env,
|
|
2754
|
+
length * sizeof(T),
|
|
2755
|
+
data,
|
|
2756
|
+
details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint,
|
|
2757
|
+
finalizeData,
|
|
2758
|
+
&value);
|
|
2759
|
+
if (status == details::napi_no_external_buffers_allowed) {
|
|
2760
|
+
#endif
|
|
2761
|
+
// If we can't create an external buffer, we'll just copy the data.
|
|
2762
|
+
Buffer<T> ret = Buffer<T>::Copy(env, data, length);
|
|
2763
|
+
details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint(
|
|
2764
|
+
env, data, finalizeData);
|
|
2765
|
+
return ret;
|
|
2766
|
+
#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
2767
|
+
}
|
|
2768
|
+
if (status != napi_ok) {
|
|
2769
|
+
delete finalizeData;
|
|
2770
|
+
NAPI_THROW_IF_FAILED(env, status, Buffer());
|
|
2771
|
+
}
|
|
2772
|
+
return Buffer(env, value, length, data);
|
|
2773
|
+
#endif
|
|
2774
|
+
}
|
|
2494
2775
|
|
|
2495
2776
|
template <typename T>
|
|
2496
2777
|
inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) {
|
|
@@ -2501,6 +2782,16 @@ inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) {
|
|
|
2501
2782
|
return Buffer<T>(env, value);
|
|
2502
2783
|
}
|
|
2503
2784
|
|
|
2785
|
+
template <typename T>
|
|
2786
|
+
inline void Buffer<T>::CheckCast(napi_env env, napi_value value) {
|
|
2787
|
+
NAPI_CHECK(value != nullptr, "Buffer::CheckCast", "empty value");
|
|
2788
|
+
|
|
2789
|
+
bool result;
|
|
2790
|
+
napi_status status = napi_is_buffer(env, value, &result);
|
|
2791
|
+
NAPI_CHECK(status == napi_ok, "Buffer::CheckCast", "napi_is_buffer failed");
|
|
2792
|
+
NAPI_CHECK(result, "Buffer::CheckCast", "value is not buffer");
|
|
2793
|
+
}
|
|
2794
|
+
|
|
2504
2795
|
template <typename T>
|
|
2505
2796
|
inline Buffer<T>::Buffer() : Uint8Array(), _length(0), _data(nullptr) {}
|
|
2506
2797
|
|
|
@@ -4733,6 +5024,8 @@ inline Napi::Env AsyncContext::Env() const {
|
|
|
4733
5024
|
// AsyncWorker class
|
|
4734
5025
|
////////////////////////////////////////////////////////////////////////////////
|
|
4735
5026
|
|
|
5027
|
+
#if NAPI_HAS_THREADS
|
|
5028
|
+
|
|
4736
5029
|
inline AsyncWorker::AsyncWorker(const Function& callback)
|
|
4737
5030
|
: AsyncWorker(callback, "generic") {}
|
|
4738
5031
|
|
|
@@ -4911,7 +5204,9 @@ inline void AsyncWorker::OnWorkComplete(Napi::Env /*env*/, napi_status status) {
|
|
|
4911
5204
|
}
|
|
4912
5205
|
}
|
|
4913
5206
|
|
|
4914
|
-
#
|
|
5207
|
+
#endif // NAPI_HAS_THREADS
|
|
5208
|
+
|
|
5209
|
+
#if (NAPI_VERSION > 3 && NAPI_HAS_THREADS)
|
|
4915
5210
|
////////////////////////////////////////////////////////////////////////////////
|
|
4916
5211
|
// TypedThreadSafeFunction<ContextType,DataType,CallJs> class
|
|
4917
5212
|
////////////////////////////////////////////////////////////////////////////////
|
|
@@ -6160,7 +6455,7 @@ inline void AsyncProgressQueueWorker<T>::ExecutionProgress::Send(
|
|
|
6160
6455
|
const T* data, size_t count) const {
|
|
6161
6456
|
_worker->SendProgress_(data, count);
|
|
6162
6457
|
}
|
|
6163
|
-
#endif // NAPI_VERSION > 3 &&
|
|
6458
|
+
#endif // NAPI_VERSION > 3 && NAPI_HAS_THREADS
|
|
6164
6459
|
|
|
6165
6460
|
////////////////////////////////////////////////////////////////////////////////
|
|
6166
6461
|
// Memory Management class
|