diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 35ad1e71a3e1ff..af43a2079604d4 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -2254,6 +2254,13 @@ object such that no properties can be set on it, and no prototype. #### `napi_typedarray_type` + + ```c typedef enum { napi_int8_array, @@ -2267,6 +2274,7 @@ typedef enum { napi_float64_array, napi_bigint64_array, napi_biguint64_array, + napi_float16_array, } napi_typedarray_type; ``` diff --git a/src/js_native_api_types.h b/src/js_native_api_types.h index 43e7bb77ff94e7..88b5e2e8331fd6 100644 --- a/src/js_native_api_types.h +++ b/src/js_native_api_types.h @@ -105,6 +105,10 @@ typedef enum { napi_float64_array, napi_bigint64_array, napi_biguint64_array, +#ifdef NAPI_EXPERIMENTAL +#define NODE_API_EXPERIMENTAL_HAS_FLOAT16_ARRAY + napi_float16_array, +#endif // NAPI_EXPERIMENTAL } napi_typedarray_type; typedef enum { diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 260a572ce71a82..d5a56eda464918 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -3165,6 +3165,13 @@ napi_status NAPI_CDECL napi_create_typedarray(napi_env env, CREATE_TYPED_ARRAY( env, BigUint64Array, 8, buffer, byte_offset, length, typedArray); break; + case napi_float16_array: + if (env->module_api_version != NAPI_VERSION_EXPERIMENTAL) { + return napi_set_last_error(env, napi_invalid_arg); + } + CREATE_TYPED_ARRAY( + env, Float16Array, 2, buffer, byte_offset, length, typedArray); + break; default: return napi_set_last_error(env, napi_invalid_arg); } @@ -3203,6 +3210,8 @@ napi_status NAPI_CDECL napi_get_typedarray_info(napi_env env, *type = napi_int32_array; } else if (value->IsUint32Array()) { *type = napi_uint32_array; + } else if (value->IsFloat16Array()) { + *type = napi_float16_array; } else if (value->IsFloat32Array()) { *type = napi_float32_array; } else if (value->IsFloat64Array()) { diff --git a/test/js-native-api/test_typedarray/binding.gyp b/test/js-native-api/test_typedarray/binding.gyp index d708d2d2493bf6..4f0e8e886a555c 100644 --- a/test/js-native-api/test_typedarray/binding.gyp +++ b/test/js-native-api/test_typedarray/binding.gyp @@ -2,6 +2,7 @@ "targets": [ { "target_name": "test_typedarray", + "defines": [ "NAPI_EXPERIMENTAL" ], "sources": [ "test_typedarray.c" ] diff --git a/test/js-native-api/test_typedarray/test.js b/test/js-native-api/test_typedarray/test.js index 3065ed30dd9984..02a6a2acba816a 100644 --- a/test/js-native-api/test_typedarray/test.js +++ b/test/js-native-api/test_typedarray/test.js @@ -41,8 +41,8 @@ assert.strictEqual(externalResult[2], 2); // Validate creation of all kinds of TypedArrays const buffer = new ArrayBuffer(128); const arrayTypes = [ Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, - Uint16Array, Int32Array, Uint32Array, Float32Array, - Float64Array, BigInt64Array, BigUint64Array ]; + Uint16Array, Int32Array, Uint32Array, Float16Array, + Float32Array, Float64Array, BigInt64Array, BigUint64Array ]; arrayTypes.forEach((currentType) => { const template = Reflect.construct(currentType, buffer); @@ -64,7 +64,7 @@ arrayTypes.forEach((currentType) => { }); const nonByteArrayTypes = [ Int16Array, Uint16Array, Int32Array, Uint32Array, - Float32Array, Float64Array, + Float16Array, Float32Array, Float64Array, BigInt64Array, BigUint64Array ]; nonByteArrayTypes.forEach((currentType) => { const template = Reflect.construct(currentType, buffer); diff --git a/test/js-native-api/test_typedarray/test_typedarray.c b/test/js-native-api/test_typedarray/test_typedarray.c index 240d024691e772..04996389700920 100644 --- a/test/js-native-api/test_typedarray/test_typedarray.c +++ b/test/js-native-api/test_typedarray/test_typedarray.c @@ -75,7 +75,7 @@ static napi_value Multiply(napi_env env, napi_callback_info info) { return output_array; } -static void FinalizeCallback(napi_env env, +static void FinalizeCallback(node_api_basic_env env, void* finalize_data, void* finalize_hint) {