node-addon-api 8.5.0 → 8.6.0

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/README.md CHANGED
@@ -19,7 +19,7 @@ and exception handling semantics with low overhead.
19
19
  API references are available in the [doc](doc/README.md) directory.
20
20
 
21
21
  <!-- x-release-please-start-version -->
22
- ## Current version: 8.5.0
22
+ ## Current version: 8.6.0
23
23
  <!-- x-release-please-end -->
24
24
 
25
25
  (See [CHANGELOG.md](CHANGELOG.md) for complete Changelog)
package/common.gypi CHANGED
@@ -5,7 +5,7 @@
5
5
  },
6
6
  'conditions': [
7
7
  ['NAPI_VERSION!=""', { 'defines': ['NAPI_VERSION=<@(NAPI_VERSION)'] } ],
8
- ['NAPI_VERSION==2147483647', { 'defines': ['NAPI_EXPERIMENTAL'] } ],
8
+ ['NAPI_VERSION==2147483647', { 'defines': ['NAPI_EXPERIMENTAL', 'NODE_API_EXPERIMENTAL_NO_WARNING'] } ],
9
9
  ['disable_deprecated=="true"', {
10
10
  'defines': ['NODE_ADDON_API_DISABLE_DEPRECATED']
11
11
  }],
package/napi-inl.h CHANGED
@@ -21,6 +21,12 @@
21
21
  #include <type_traits>
22
22
  #include <utility>
23
23
 
24
+ #if defined(__clang__) || defined(__GNUC__)
25
+ #define NAPI_NO_SANITIZE_VPTR __attribute__((no_sanitize("vptr")))
26
+ #else
27
+ #define NAPI_NO_SANITIZE_VPTR
28
+ #endif
29
+
24
30
  namespace Napi {
25
31
 
26
32
  #ifdef NAPI_CPP_CUSTOM_NAMESPACE
@@ -934,6 +940,19 @@ inline bool Value::IsExternal() const {
934
940
  return Type() == napi_external;
935
941
  }
936
942
 
943
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
944
+ inline bool Value::IsSharedArrayBuffer() const {
945
+ if (IsEmpty()) {
946
+ return false;
947
+ }
948
+
949
+ bool result;
950
+ napi_status status = node_api_is_sharedarraybuffer(_env, _value, &result);
951
+ NAPI_THROW_IF_FAILED(_env, status, false);
952
+ return result;
953
+ }
954
+ #endif
955
+
937
956
  template <typename T>
938
957
  inline T Value::As() const {
939
958
  #ifdef NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS
@@ -2068,6 +2087,55 @@ inline uint32_t Array::Length() const {
2068
2087
  return result;
2069
2088
  }
2070
2089
 
2090
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
2091
+ ////////////////////////////////////////////////////////////////////////////////
2092
+ // SharedArrayBuffer class
2093
+ ////////////////////////////////////////////////////////////////////////////////
2094
+
2095
+ inline SharedArrayBuffer::SharedArrayBuffer() : Object() {}
2096
+
2097
+ inline SharedArrayBuffer::SharedArrayBuffer(napi_env env, napi_value value)
2098
+ : Object(env, value) {}
2099
+
2100
+ inline void SharedArrayBuffer::CheckCast(napi_env env, napi_value value) {
2101
+ NAPI_CHECK(value != nullptr, "SharedArrayBuffer::CheckCast", "empty value");
2102
+
2103
+ bool result;
2104
+ napi_status status = node_api_is_sharedarraybuffer(env, value, &result);
2105
+ NAPI_CHECK(status == napi_ok,
2106
+ "SharedArrayBuffer::CheckCast",
2107
+ "node_api_is_sharedarraybuffer failed");
2108
+ NAPI_CHECK(
2109
+ result, "SharedArrayBuffer::CheckCast", "value is not sharedarraybuffer");
2110
+ }
2111
+
2112
+ inline SharedArrayBuffer SharedArrayBuffer::New(napi_env env,
2113
+ size_t byteLength) {
2114
+ napi_value value;
2115
+ void* data;
2116
+ napi_status status =
2117
+ node_api_create_sharedarraybuffer(env, byteLength, &data, &value);
2118
+ NAPI_THROW_IF_FAILED(env, status, SharedArrayBuffer());
2119
+
2120
+ return SharedArrayBuffer(env, value);
2121
+ }
2122
+
2123
+ inline void* SharedArrayBuffer::Data() {
2124
+ void* data;
2125
+ napi_status status = napi_get_arraybuffer_info(_env, _value, &data, nullptr);
2126
+ NAPI_THROW_IF_FAILED(_env, status, nullptr);
2127
+ return data;
2128
+ }
2129
+
2130
+ inline size_t SharedArrayBuffer::ByteLength() {
2131
+ size_t length;
2132
+ napi_status status =
2133
+ napi_get_arraybuffer_info(_env, _value, nullptr, &length);
2134
+ NAPI_THROW_IF_FAILED(_env, status, 0);
2135
+ return length;
2136
+ }
2137
+ #endif // NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
2138
+
2071
2139
  ////////////////////////////////////////////////////////////////////////////////
2072
2140
  // ArrayBuffer class
2073
2141
  ////////////////////////////////////////////////////////////////////////////////
@@ -4717,7 +4785,8 @@ inline napi_value InstanceWrap<T>::WrappedMethod(
4717
4785
  ////////////////////////////////////////////////////////////////////////////////
4718
4786
 
4719
4787
  template <typename T>
4720
- inline ObjectWrap<T>::ObjectWrap(const Napi::CallbackInfo& callbackInfo) {
4788
+ inline NAPI_NO_SANITIZE_VPTR ObjectWrap<T>::ObjectWrap(
4789
+ const Napi::CallbackInfo& callbackInfo) {
4721
4790
  napi_env env = callbackInfo.Env();
4722
4791
  napi_value wrapper = callbackInfo.This();
4723
4792
  napi_status status;
@@ -4731,7 +4800,7 @@ inline ObjectWrap<T>::ObjectWrap(const Napi::CallbackInfo& callbackInfo) {
4731
4800
  }
4732
4801
 
4733
4802
  template <typename T>
4734
- inline ObjectWrap<T>::~ObjectWrap() {
4803
+ inline NAPI_NO_SANITIZE_VPTR ObjectWrap<T>::~ObjectWrap() {
4735
4804
  // If the JS object still exists at this point, remove the finalizer added
4736
4805
  // through `napi_wrap()`.
4737
4806
  if (!IsEmpty() && !_finalized) {
@@ -4744,8 +4813,12 @@ inline ObjectWrap<T>::~ObjectWrap() {
4744
4813
  }
4745
4814
  }
4746
4815
 
4816
+ // with RTTI turned on, modern compilers check to see if virtual function
4817
+ // pointers are stripped of RTTI by void casts. this is intrinsic to how Unwrap
4818
+ // works, so we inject a compiler pragma to turn off that check just for the
4819
+ // affected methods. this compiler check is on by default in Android NDK 29.
4747
4820
  template <typename T>
4748
- inline T* ObjectWrap<T>::Unwrap(Object wrapper) {
4821
+ inline NAPI_NO_SANITIZE_VPTR T* ObjectWrap<T>::Unwrap(Object wrapper) {
4749
4822
  void* unwrapped;
4750
4823
  napi_status status = napi_unwrap(wrapper.Env(), wrapper, &unwrapped);
4751
4824
  NAPI_THROW_IF_FAILED(wrapper.Env(), status, nullptr);
@@ -7030,4 +7103,6 @@ inline void BasicEnv::PostFinalizer(FinalizerType finalizeCallback,
7030
7103
 
7031
7104
  } // namespace Napi
7032
7105
 
7106
+ #undef NAPI_NO_SANITIZE_VPTR
7107
+
7033
7108
  #endif // SRC_NAPI_INL_H_
package/napi.h CHANGED
@@ -543,6 +543,9 @@ class Value {
543
543
  bool IsDataView() const; ///< Tests if a value is a JavaScript data view.
544
544
  bool IsBuffer() const; ///< Tests if a value is a Node buffer.
545
545
  bool IsExternal() const; ///< Tests if a value is a pointer to external data.
546
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
547
+ bool IsSharedArrayBuffer() const;
548
+ #endif
546
549
 
547
550
  /// Casts to another type of `Napi::Value`, when the actual type is known or
548
551
  /// assumed.
@@ -1202,6 +1205,21 @@ class Object::iterator {
1202
1205
  };
1203
1206
  #endif // NODE_ADDON_API_CPP_EXCEPTIONS
1204
1207
 
1208
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
1209
+ class SharedArrayBuffer : public Object {
1210
+ public:
1211
+ SharedArrayBuffer();
1212
+ SharedArrayBuffer(napi_env env, napi_value value);
1213
+
1214
+ static SharedArrayBuffer New(napi_env env, size_t byteLength);
1215
+
1216
+ static void CheckCast(napi_env env, napi_value value);
1217
+
1218
+ void* Data();
1219
+ size_t ByteLength();
1220
+ };
1221
+ #endif
1222
+
1205
1223
  /// A JavaScript array buffer value.
1206
1224
  class ArrayBuffer : public Object {
1207
1225
  public:
package/package.json CHANGED
@@ -472,7 +472,7 @@
472
472
  "lint:fix": "eslint --fix && node tools/clang-format --fix"
473
473
  },
474
474
  "pre-commit": "lint",
475
- "version": "8.5.0",
475
+ "version": "8.6.0",
476
476
  "support": true,
477
477
  "engines": {
478
478
  "node": "^18 || ^20 || >= 21"