Skip to content

Commit 5cb8752

Browse files
committed
n-api: implement napi_is_detached_arraybuffer
This implements ArrayBuffer#IsDetachedBuffer operation as per ECMAScript specification Section 24.1.1.2 https://tc39.es/ecma262/#sec-isdetachedbuffer Closes: nodejs#29955
1 parent 8acb646 commit 5cb8752

File tree

5 files changed

+85
-0
lines changed

5 files changed

+85
-0
lines changed

doc/api/n-api.md

+24
Original file line numberDiff line numberDiff line change
@@ -3258,6 +3258,29 @@ that is, created with [`napi_create_external_arraybuffer`][].
32583258
This API represents the invocation of the `ArrayBuffer` detach operation as
32593259
defined in [Section 24.1.1.3][] of the ECMAScript Language Specification.
32603260

3261+
### napi_is_detached_arraybuffer
3262+
<!-- YAML
3263+
added: REPLACEME
3264+
-->
3265+
3266+
```C
3267+
napi_status napi_is_detached_arraybuffer(napi_env env,
3268+
napi_value arraybuffer,
3269+
bool* result)
3270+
```
3271+
3272+
* `[in] env`: The environment that the API is invoked under.
3273+
* `[in] arraybuffer`: The JavaScript `ArrayBuffer` to be checked.
3274+
* `[out] result`: Whether the `arraybuffer` is detached.
3275+
3276+
Returns `napi_ok` if the API succeeded.
3277+
3278+
The `ArrayBuffer` is considered detached if its internal data is `null`.
3279+
3280+
This API represents the invocation of the `ArrayBuffer` `IsDetachedBuffer`
3281+
operation as defined in [Section 24.1.1.2][] of the ECMAScript Language
3282+
Specification.
3283+
32613284
## Working with JavaScript Properties
32623285

32633286
N-API exposes a set of APIs to get and set properties on JavaScript
@@ -5259,6 +5282,7 @@ This API may only be called from the main thread.
52595282
[Section 7]: https://tc39.github.io/ecma262/#sec-abstract-operations
52605283
[Section 8.7]: https://tc39.es/ecma262/#sec-agents
52615284
[Section 9.1.6]: https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-defineownproperty-p-desc
5285+
[Section 24.1.1.2]: https://tc39.es/ecma262/#sec-isdetachedbuffer
52625286
[Travis CI]: https://travis-ci.org
52635287
[Visual Studio]: https://visualstudio.microsoft.com
52645288
[Working with JavaScript Properties]: #n_api_working_with_javascript_properties

src/js_native_api.h

+4
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,10 @@ NAPI_EXTERN napi_status napi_get_instance_data(napi_env env,
518518
// ArrayBuffer detaching
519519
NAPI_EXTERN napi_status napi_detach_arraybuffer(napi_env env,
520520
napi_value arraybuffer);
521+
522+
NAPI_EXTERN napi_status napi_is_detached_arraybuffer(napi_env env,
523+
napi_value value,
524+
bool* result);
521525
#endif // NAPI_EXPERIMENTAL
522526

523527
EXTERN_C_END

src/js_native_api_v8.cc

+14
Original file line numberDiff line numberDiff line change
@@ -3039,3 +3039,17 @@ napi_status napi_detach_arraybuffer(napi_env env, napi_value arraybuffer) {
30393039

30403040
return napi_clear_last_error(env);
30413041
}
3042+
3043+
napi_status napi_is_detached_arraybuffer(napi_env env,
3044+
napi_value arraybuffer,
3045+
bool* result) {
3046+
CHECK_ENV(env);
3047+
CHECK_ARG(env, arraybuffer);
3048+
3049+
v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer);
3050+
3051+
*result = value->IsArrayBuffer() &&
3052+
value.As<v8::ArrayBuffer>()->GetBackingStore()->Data() == nullptr;
3053+
3054+
return napi_clear_last_error(env);
3055+
}

test/js-native-api/test_typedarray/test.js

+13
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,21 @@ arrayTypes.forEach((currentType) => {
8787
assert.ok(externalResult instanceof Int8Array);
8888
assert.strictEqual(externalResult.length, 3);
8989
assert.strictEqual(externalResult.byteLength, 3);
90+
assert.ok(!test_typedarray.IsDetached(buffer.buffer));
9091
test_typedarray.Detach(buffer);
92+
assert.ok(test_typedarray.IsDetached(buffer.buffer));
9193
assert.ok(externalResult instanceof Int8Array);
9294
assert.strictEqual(buffer.length, 0);
9395
assert.strictEqual(buffer.byteLength, 0);
9496
}
97+
98+
{
99+
const buffer = new ArrayBuffer(128);
100+
assert.ok(!test_typedarray.IsDetached(buffer));
101+
}
102+
103+
{
104+
const buffer = test_typedarray.EmptyArrayBuffer();
105+
assert.ok(buffer instanceof ArrayBuffer);
106+
assert.ok(test_typedarray.IsDetached(buffer));
107+
}

test/js-native-api/test_typedarray/test_typedarray.c

+30
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ static napi_value External(napi_env env, napi_callback_info info) {
9797
return output_array;
9898
}
9999

100+
101+
static napi_value EmptyArrayBuffer(napi_env env, napi_callback_info info) {
102+
void* null_data = NULL;
103+
napi_value array_buffer;
104+
NAPI_CALL(env, napi_create_arraybuffer(env, 0, &null_data, &array_buffer));
105+
return array_buffer;
106+
}
107+
100108
static napi_value CreateTypedArray(napi_env env, napi_callback_info info) {
101109
size_t argc = 4;
102110
napi_value args[4];
@@ -183,13 +191,35 @@ static napi_value Detach(napi_env env, napi_callback_info info) {
183191
return NULL;
184192
}
185193

194+
static napi_value IsDetached(napi_env env, napi_callback_info info) {
195+
size_t argc = 1;
196+
napi_value args[1];
197+
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
198+
NAPI_ASSERT(env, argc == 1, "Wrong number of arguments.");
199+
200+
napi_value array_buffer = args[0];
201+
bool is_arraybuffer;
202+
NAPI_CALL(env, napi_is_arraybuffer(env, array_buffer, &is_arraybuffer));
203+
NAPI_ASSERT(env, is_arraybuffer, "Wrong type of arguments. Expects an array buffer as first argument.");
204+
205+
bool is_detached;
206+
NAPI_CALL(env, napi_is_detached_arraybuffer(env, array_buffer, &is_detached));
207+
208+
napi_value result;
209+
NAPI_CALL(env, napi_get_boolean(env, is_detached, &result));
210+
211+
return result;
212+
}
213+
186214
EXTERN_C_START
187215
napi_value Init(napi_env env, napi_value exports) {
188216
napi_property_descriptor descriptors[] = {
189217
DECLARE_NAPI_PROPERTY("Multiply", Multiply),
190218
DECLARE_NAPI_PROPERTY("External", External),
219+
DECLARE_NAPI_PROPERTY("EmptyArrayBuffer", EmptyArrayBuffer),
191220
DECLARE_NAPI_PROPERTY("CreateTypedArray", CreateTypedArray),
192221
DECLARE_NAPI_PROPERTY("Detach", Detach),
222+
DECLARE_NAPI_PROPERTY("IsDetached", IsDetached),
193223
};
194224

195225
NAPI_CALL(env, napi_define_properties(

0 commit comments

Comments
 (0)