@@ -136,42 +136,6 @@ napi_status NewExternalString(napi_env env,
136136 return status;
137137}
138138
139- napi_status NewExternalSharedArrayBuffer (
140- napi_env env,
141- void * external_data,
142- size_t byte_length,
143- void (*finalize_cb)(void * external_data, void * finalize_hint),
144- void* finalize_hint,
145- napi_value* result) {
146- struct FinalizerData {
147- void (*cb)(void * external_data, void * finalize_hint);
148- void * hint;
149- };
150- auto deleter = [](void * external_data, size_t length, void * deleter_data) {
151- if (auto fd = static_cast <FinalizerData*>(deleter_data)) {
152- fd->cb (external_data, fd->hint );
153- delete fd;
154- }
155- };
156- FinalizerData* deleter_data = nullptr ;
157- if (finalize_cb != nullptr ) {
158- deleter_data = new FinalizerData{finalize_cb, finalize_hint};
159- }
160- auto unique_backing_store = v8::SharedArrayBuffer::NewBackingStore (
161- external_data,
162- byte_length,
163- deleter,
164- reinterpret_cast <void *>(deleter_data));
165- CHECK (!!unique_backing_store); // Cannot fail.
166- auto shared_backing_store =
167- std::shared_ptr<v8::BackingStore>(std::move (unique_backing_store));
168- auto shared_array_buffer =
169- v8::SharedArrayBuffer::New (env->isolate , shared_backing_store);
170- CHECK_MAYBE_EMPTY (env, shared_array_buffer, napi_generic_failure);
171- *result = v8impl::JsValueFromV8LocalValue (shared_array_buffer);
172- return napi_clear_last_error (env);
173- }
174-
175139class TrackedStringResource : private RefTracker {
176140 public:
177141 TrackedStringResource (napi_env env,
@@ -3170,15 +3134,45 @@ napi_create_external_arraybuffer(napi_env env,
31703134 env, buffer, nullptr , nullptr , nullptr , result, nullptr );
31713135}
31723136
3173- napi_status NAPI_CDECL napi_create_external_sharedarraybuffer (
3137+ napi_status NAPI_CDECL node_api_create_external_sharedarraybuffer (
31743138 napi_env env,
31753139 void * external_data,
31763140 size_t byte_length,
31773141 void (*finalize_cb)(void * external_data, void * finalize_hint),
31783142 void* finalize_hint,
31793143 napi_value* result) {
3180- return v8impl::NewExternalSharedArrayBuffer (
3181- env, external_data, byte_length, finalize_cb, finalize_hint, result);
3144+ #ifdef V8_ENABLE_SANDBOX
3145+ return napi_set_last_error (env, napi_no_external_buffers_allowed);
3146+ #else
3147+ struct FinalizerData {
3148+ void (*cb)(void * external_data, void * finalize_hint);
3149+ void * hint;
3150+ };
3151+ auto deleter = [](void * external_data, size_t length, void * deleter_data) {
3152+ if (auto fd = static_cast <FinalizerData*>(deleter_data)) {
3153+ fd->cb (external_data, fd->hint );
3154+ delete fd;
3155+ }
3156+ };
3157+ FinalizerData* deleter_data = nullptr ;
3158+ if (finalize_cb != nullptr ) {
3159+ deleter_data = new FinalizerData{finalize_cb, finalize_hint};
3160+ }
3161+ auto unique_backing_store = v8::SharedArrayBuffer::NewBackingStore (
3162+ external_data,
3163+ byte_length,
3164+ deleter,
3165+ reinterpret_cast <void *>(deleter_data));
3166+ CHECK (!!unique_backing_store); // Cannot fail.
3167+ auto shared_backing_store =
3168+ std::shared_ptr<v8::BackingStore>(std::move (unique_backing_store));
3169+ auto shared_array_buffer = v8::SharedArrayBuffer::New (
3170+ env->isolate ,
3171+ std::move (shared_backing_store));
3172+ CHECK_MAYBE_EMPTY (env, shared_array_buffer, napi_generic_failure);
3173+ *result = v8impl::JsValueFromV8LocalValue (shared_array_buffer);
3174+ return napi_clear_last_error (env);
3175+ #endif // V8_ENABLE_SANDBOX
31823176}
31833177
31843178napi_status NAPI_CDECL napi_get_arraybuffer_info (napi_env env,
0 commit comments