Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
toyobayashi committed Oct 12, 2024
1 parent bedaacf commit c3fbe02
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 62 deletions.
12 changes: 6 additions & 6 deletions packages/emnapi/src/value/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,10 +229,10 @@ export function napi_create_typedarray (
$CHECK_ARG!(envObject, result)

const handle = emnapiCtx.handleStore.get(arraybuffer)!
const buffer = handle.value
if (!(buffer instanceof ArrayBuffer)) {
if (!handle.isArrayBuffer()) {
return envObject.setLastError(napi_status.napi_invalid_arg)
}
const buffer = handle.value

from64('byte_offset')
from64('length')
Expand Down Expand Up @@ -433,10 +433,10 @@ export function node_api_create_buffer_from_arraybuffer (
byte_offset = byte_offset >>> 0
byte_length = byte_length >>> 0
const handle = emnapiCtx.handleStore.get(arraybuffer)!
const buffer = handle.value
if (!(buffer instanceof ArrayBuffer)) {
if (!handle.isArrayBuffer()) {
return envObject.setLastError(napi_status.napi_invalid_arg)
}
const buffer = handle.value

if ((byte_length + byte_offset) > buffer.byteLength) {
const err: RangeError & { code?: string } = new RangeError('The byte offset + length is out of range')
Expand Down Expand Up @@ -490,10 +490,10 @@ export function napi_create_dataview (
byte_length = byte_length >>> 0
byte_offset = byte_offset >>> 0
const handle = emnapiCtx.handleStore.get(arraybuffer)!
const buffer = handle.value
if (!(buffer instanceof ArrayBuffer)) {
if (!handle.isArrayBuffer()) {
return envObject.setLastError(napi_status.napi_invalid_arg)
}
const buffer = handle.value

if ((byte_length + byte_offset) > buffer.byteLength) {
const err: RangeError & { code?: string } = new RangeError('byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in')
Expand Down
1 change: 1 addition & 0 deletions packages/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ add_test("number" "./number/binding.c;./number/test_null.c" OFF)
add_test("symbol" "./symbol/binding.c" OFF)
add_test("typedarray" "./typedarray/binding.c" OFF)
add_test("buffer" "./buffer/binding.c" OFF)
target_compile_definitions("buffer" PRIVATE "NAPI_EXPERIMENTAL")
add_test("buffer_finalizer" "./buffer_finalizer/binding.c" OFF)
add_test("fatal_exception" "./fatal_exception/binding.c" OFF)
add_test("cleanup_hook" "./cleanup_hook/binding.c" OFF)
Expand Down
87 changes: 33 additions & 54 deletions packages/test/buffer/binding.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,23 @@ static const char theText[] =
const unsigned int theTextSize = sizeof(theText);

static int deleterCallCount = 0;
static void deleteTheText(napi_env env, void* data, void* finalize_hint) {
NODE_API_ASSERT_RETURN_VOID(
env, data != NULL && strcmp(data, theText) == 0, "invalid data");

static void deleteTheText(node_api_basic_env env,
void* data,
void* finalize_hint) {
NODE_API_BASIC_ASSERT_RETURN_VOID(data != NULL && strcmp(data, theText) == 0,
"invalid data");

(void)finalize_hint;
free(data);
deleterCallCount++;
}

static void noopDeleter(napi_env env, void* data, void* finalize_hint) {
NODE_API_ASSERT_RETURN_VOID(
env, data != NULL && strcmp(data, theText) == 0, "invalid data");
static void noopDeleter(node_api_basic_env env,
void* data,
void* finalize_hint) {
NODE_API_BASIC_ASSERT_RETURN_VOID(data != NULL && strcmp(data, theText) == 0,
"invalid data");
(void)finalize_hint;
deleterCallCount++;
}
Expand All @@ -75,9 +81,12 @@ static napi_value newExternalBuffer(napi_env env, napi_callback_info info) {
NODE_API_ASSERT(
env, theCopy, "Failed to copy static text for newExternalBuffer");
NODE_API_CALL(env,
napi_create_external_buffer(
env, theTextSize, theCopy, deleteTheText,
NULL /* finalize_hint */, &theBuffer));
napi_create_external_buffer(env,
sizeof(theText),
theCopy,
deleteTheText,
NULL /* finalize_hint */,
&theBuffer));

return theBuffer;
}
Expand Down Expand Up @@ -134,9 +143,12 @@ static napi_value bufferInfo(napi_env env, napi_callback_info info) {
static napi_value staticBuffer(napi_env env, napi_callback_info info) {
napi_value theBuffer;
NODE_API_CALL(env,
napi_create_external_buffer(
env, sizeof(theText), (void*)theText, noopDeleter,
NULL /* finalize_hint */, &theBuffer));
napi_create_external_buffer(env,
sizeof(theText),
(void*)theText,
noopDeleter,
NULL /* finalize_hint */,
&theBuffer));
return theBuffer;
}

Expand Down Expand Up @@ -190,62 +202,30 @@ static napi_value getMemoryDataAsArray(napi_env env, napi_callback_info info) {
return ret;
}

NAPI_EXTERN napi_status NAPI_CDECL
node_api_create_buffer_from_arraybuffer(napi_env env,
napi_value arraybuffer,
size_t byte_offset,
size_t byte_length,
napi_value* result);

static napi_value testBufferFromArrayBuffer(napi_env env,
napi_callback_info info) {
static napi_value bufferFromArrayBuffer(napi_env env,
napi_callback_info info) {
napi_status status;
napi_value arraybuffer;
void* data;
napi_value buffer;
size_t byte_length = 1024;
size_t byte_offset = 0;
void* data = NULL;
size_t buffer_length = 0;
void* buffer_data = NULL;

status = napi_create_arraybuffer(env, byte_length, &data, &arraybuffer);
NODE_API_ASSERT(env, status == napi_ok, "Failed to create arraybuffer");

status = node_api_create_buffer_from_arraybuffer(
env, arraybuffer, byte_offset, byte_length, &buffer);
env, arraybuffer, 0, byte_length, &buffer);
NODE_API_ASSERT(
env, status == napi_ok, "Failed to create buffer from arraybuffer");

void* buffer_data;
size_t buffer_length;
status = napi_get_buffer_info(env, buffer, &buffer_data, &buffer_length);
NODE_API_ASSERT(env, status == napi_ok, "Failed to get buffer info");
NODE_API_ASSERT(env, buffer_length == byte_length, "Buffer length mismatch");

bool is_buffer;
status = napi_is_buffer(env, buffer, &is_buffer);
NODE_API_ASSERT(env, status == napi_ok, "Failed to check if value is buffer");
NODE_API_ASSERT(env, is_buffer, "Expected a Buffer but did not get one");

status = node_api_create_buffer_from_arraybuffer(
env, arraybuffer, byte_length, byte_length + 1, &buffer);
NODE_API_ASSERT(env,
status == 10,
"Expected range error for invalid byte offset");
napi_value last_error;
status = napi_get_and_clear_last_exception(env, &last_error);
NODE_API_ASSERT(env, status == napi_ok, "Failed to call napi_get_and_clear_last_exception");

napi_value non_arraybuffer;
status = napi_create_uint32(env, 123, &non_arraybuffer);
NODE_API_ASSERT(
env, status == napi_ok, "Failed to create non-arraybuffer value");

status = node_api_create_buffer_from_arraybuffer(
env, non_arraybuffer, byte_offset, byte_length, &buffer);
NODE_API_ASSERT(env,
status == napi_invalid_arg,
"Expected invalid arg error for non-arraybuffer input");
NODE_API_ASSERT(env, buffer_length == byte_length, "Buffer length mismatch");

return arraybuffer;
return buffer;
}

static napi_value Init(napi_env env, napi_value exports) {
Expand All @@ -266,8 +246,7 @@ static napi_value Init(napi_env env, napi_value exports) {
DECLARE_NODE_API_PROPERTY("staticBuffer", staticBuffer),
DECLARE_NODE_API_PROPERTY("invalidObjectAsBuffer", invalidObjectAsBuffer),
DECLARE_NODE_API_PROPERTY("getMemoryDataAsArray", getMemoryDataAsArray),
DECLARE_NODE_API_PROPERTY("testBufferFromArrayBuffer",
testBufferFromArrayBuffer),
DECLARE_NODE_API_PROPERTY("bufferFromArrayBuffer", bufferFromArrayBuffer),
};

NODE_API_CALL(env, napi_define_properties(
Expand Down
5 changes: 3 additions & 2 deletions packages/test/buffer/buffer.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ module.exports = load('buffer').then(async binding => {

// To test this doesn't crash
binding.invalidObjectAsBuffer({})

const testBuffer = binding.bufferFromArrayBuffer()
assert(testBuffer instanceof Buffer, 'Expected a Buffer')
})().then(common.mustCall())

process.externalBuffer = binding.newExternalBuffer()
Expand Down Expand Up @@ -58,6 +61,4 @@ module.exports = load('buffer').then(async binding => {
assert.deepStrictEqual(binding.getMemoryDataAsArray(buffer), Array(6).fill(99))
assert.deepStrictEqual(binding.getMemoryDataAsArray(typedArray), Array(6).fill(99))
assert.deepStrictEqual(binding.getMemoryDataAsArray(dataView), Array(6).fill(99))

binding.testBufferFromArrayBuffer()
})

0 comments on commit c3fbe02

Please sign in to comment.