node-api: added SharedArrayBuffer api · nodejs/node@be48760 · GitHub
Skip to content

Commit be48760

Browse files
mertcanaltintargos
authored andcommitted
node-api: added SharedArrayBuffer api
PR-URL: #59071 Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent 97c4e1b commit be48760

6 files changed

Lines changed: 334 additions & 13 deletions

File tree

doc/api/n-api.md

Lines changed: 67 additions & 6 deletions

src/js_native_api.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,14 @@ napi_get_dataview_info(napi_env env,
474474
napi_value* arraybuffer,
475475
size_t* byte_offset);
476476

477+
#ifdef NAPI_EXPERIMENTAL
478+
#define NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
479+
NAPI_EXTERN napi_status NAPI_CDECL
480+
node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result);
481+
NAPI_EXTERN napi_status NAPI_CDECL node_api_create_sharedarraybuffer(
482+
napi_env env, size_t byte_length, void** data, napi_value* result);
483+
#endif // NAPI_EXPERIMENTAL
484+
477485
// version management
478486
NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env,
479487
uint32_t* result);

src/js_native_api_v8.cc

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3077,21 +3077,68 @@ napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env,
30773077
CHECK_ARG(env, arraybuffer);
30783078

30793079
v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer);
3080-
RETURN_STATUS_IF_FALSE(env, value->IsArrayBuffer(), napi_invalid_arg);
30813080

3082-
v8::Local<v8::ArrayBuffer> ab = value.As<v8::ArrayBuffer>();
3081+
if (value->IsArrayBuffer()) {
3082+
v8::Local<v8::ArrayBuffer> ab = value.As<v8::ArrayBuffer>();
30833083

3084-
if (data != nullptr) {
3085-
*data = ab->Data();
3086-
}
3084+
if (data != nullptr) {
3085+
*data = ab->Data();
3086+
}
30873087

3088-
if (byte_length != nullptr) {
3089-
*byte_length = ab->ByteLength();
3088+
if (byte_length != nullptr) {
3089+
*byte_length = ab->ByteLength();
3090+
}
3091+
} else if (value->IsSharedArrayBuffer()) {
3092+
v8::Local<v8::SharedArrayBuffer> sab = value.As<v8::SharedArrayBuffer>();
3093+
3094+
if (data != nullptr) {
3095+
*data = sab->Data();
3096+
}
3097+
3098+
if (byte_length != nullptr) {
3099+
*byte_length = sab->ByteLength();
3100+
}
3101+
} else {
3102+
return napi_set_last_error(env, napi_invalid_arg);
30903103
}
30913104

30923105
return napi_clear_last_error(env);
30933106
}
30943107

3108+
napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env,
3109+
napi_value value,
3110+
bool* result) {
3111+
CHECK_ENV_NOT_IN_GC(env);
3112+
CHECK_ARG(env, value);
3113+
CHECK_ARG(env, result);
3114+
3115+
v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
3116+
*result = val->IsSharedArrayBuffer();
3117+
3118+
return napi_clear_last_error(env);
3119+
}
3120+
3121+
napi_status NAPI_CDECL node_api_create_sharedarraybuffer(napi_env env,
3122+
size_t byte_length,
3123+
void** data,
3124+
napi_value* result) {
3125+
NAPI_PREAMBLE(env);
3126+
CHECK_ARG(env, result);
3127+
3128+
v8::Isolate* isolate = env->isolate;
3129+
v8::Local<v8::SharedArrayBuffer> buffer =
3130+
v8::SharedArrayBuffer::New(isolate, byte_length);
3131+
3132+
// Optionally return a pointer to the buffer's data, to avoid another call to
3133+
// retrieve it.
3134+
if (data != nullptr) {
3135+
*data = buffer->Data();
3136+
}
3137+
3138+
*result = v8impl::JsValueFromV8LocalValue(buffer);
3139+
return GET_RETURN_STATUS(env);
3140+
}
3141+
30953142
napi_status NAPI_CDECL napi_is_typedarray(napi_env env,
30963143
napi_value value,
30973144
bool* result) {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"targets": [
3+
{
4+
"target_name": "test_sharedarraybuffer",
5+
"sources": [ "test_sharedarraybuffer.c" ]
6+
}
7+
]
8+
}
Lines changed: 67 additions & 0 deletions

0 commit comments

Comments
 (0)