Skip to content

Commit 30da58a

Browse files
authored
napi: Add finalize cb to external arraybuffer (#110)
1 parent 5042fc7 commit 30da58a

4 files changed

Lines changed: 36 additions & 1 deletion

File tree

src/node_jsvmapi.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2054,6 +2054,7 @@ napi_status napi_create_arraybuffer(napi_env e,
20542054
napi_status napi_create_external_arraybuffer(napi_env e,
20552055
void* external_data,
20562056
size_t byte_length,
2057+
napi_finalize finalize_cb,
20572058
napi_value* result) {
20582059
NAPI_PREAMBLE(e);
20592060
CHECK_ARG(result);
@@ -2062,6 +2063,11 @@ napi_status napi_create_external_arraybuffer(napi_env e,
20622063
v8::Local<v8::ArrayBuffer> buffer =
20632064
v8::ArrayBuffer::New(isolate, external_data, byte_length);
20642065

2066+
if (finalize_cb != nullptr) {
2067+
// Create a self-deleting weak reference that invokes the finalizer callback.
2068+
new v8impl::Reference(isolate, buffer, 0, true, finalize_cb, external_data);
2069+
}
2070+
20652071
*result = v8impl::JsValueFromV8LocalValue(buffer);
20662072
return GET_RETURN_STATUS();
20672073
}

src/node_jsvmapi.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,9 @@ NODE_EXTERN napi_status napi_is_arraybuffer(napi_env env, napi_value value, bool
336336
NODE_EXTERN napi_status napi_create_arraybuffer(napi_env env, size_t byte_length, void** data,
337337
napi_value* result);
338338
NODE_EXTERN napi_status napi_create_external_arraybuffer(napi_env env, void* external_data,
339-
size_t byte_length, napi_value* result);
339+
size_t byte_length,
340+
napi_finalize finalize_cb,
341+
napi_value* result);
340342
NODE_EXTERN napi_status napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer,
341343
void** data, size_t* byte_length);
342344
NODE_EXTERN napi_status napi_is_typedarray(napi_env env, napi_value value, bool* result);

test/addons-abi/test_typedarray/test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@ doubleArray[2] = 2.2;
1818
assert.equal(doubleArray.length, 3);
1919

2020
var byteResult = test_typedarray.Multiply(byteArray, 3);
21+
assert.ok(byteResult instanceof Uint8Array);
2122
assert.equal(byteResult.length, 3);
2223
assert.equal(byteResult[0], 0);
2324
assert.equal(byteResult[1], 3);
2425
assert.equal(byteResult[2], 6);
2526

2627
var doubleResult = test_typedarray.Multiply(doubleArray, -3);
28+
assert.ok(doubleResult instanceof Float64Array);
2729
assert.equal(doubleResult.length, 3);
2830
assert.equal(doubleResult[0], 0);
2931
assert.equal(Math.round(10 * doubleResult[1]) / 10, -3.3);
3032
assert.equal(Math.round(10 * doubleResult[2]) / 10, -6.6);
33+
34+
var externalResult = test_typedarray.External();
35+
assert.ok(externalResult instanceof Int8Array);
36+
assert.equal(externalResult.length, 3);
37+
assert.equal(externalResult[0], 0);
38+
assert.equal(externalResult[1], 1);
39+
assert.equal(externalResult[2], 2);

test/addons-abi/test_typedarray/test_typedarray.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,29 @@ void Multiply(napi_env env, napi_callback_info info) {
9898
if (status != napi_ok) return;
9999
}
100100

101+
void External(napi_env env, napi_callback_info info) {
102+
static int8_t externalData[] = { 0, 1, 2 };
103+
104+
napi_value output_buffer;
105+
napi_status status = napi_create_external_arraybuffer(
106+
env, externalData, sizeof(externalData), nullptr, &output_buffer);
107+
if (status != napi_ok) return;
108+
109+
napi_value output_array;
110+
status = napi_create_typedarray(
111+
env, napi_int8, sizeof(externalData) / sizeof(uint8_t), output_buffer, 0, &output_array);
112+
if (status != napi_ok) return;
113+
114+
status = napi_set_return_value(env, info, output_array);
115+
if (status != napi_ok) return;
116+
}
117+
101118
void Init(napi_env env, napi_value exports, napi_value module) {
102119
napi_status status;
103120

104121
napi_property_descriptor descriptors[] = {
105122
{ "Multiply", Multiply },
123+
{ "External", External },
106124
};
107125

108126
status = napi_define_properties(

0 commit comments

Comments
 (0)