diff options
author | legendecas <legendecas@gmail.com> | 2019-09-30 09:42:58 +0800 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-10-14 16:05:58 -0700 |
commit | 6afed1dc853cf2b040502d858caadc17575a7fdf (patch) | |
tree | 4162edee603f8a83ab4afd9b2a72c3ab1cc0ff17 /src | |
parent | f9caee986cae09cd4cb47e0a02a5b8672ab2c16d (diff) | |
download | android-node-v8-6afed1dc853cf2b040502d858caadc17575a7fdf.tar.gz android-node-v8-6afed1dc853cf2b040502d858caadc17575a7fdf.tar.bz2 android-node-v8-6afed1dc853cf2b040502d858caadc17575a7fdf.zip |
n-api: add `napi_detach_arraybuffer`
As ArrayBuffer#detach is an ecma spec operation
([Section 24.1.1.3](https://tc39.es/ecma262/#sec-detacharraybuffer)),
it might be good to have it in N-API.
Fixes https://github.com/nodejs/node/issues/29674
PR-URL: https://github.com/nodejs/node/pull/29768
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gabriel Schulhof <gabriel.schulhof@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/js_native_api.h | 4 | ||||
-rw-r--r-- | src/js_native_api_types.h | 2 | ||||
-rw-r--r-- | src/js_native_api_v8.cc | 23 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/js_native_api.h b/src/js_native_api.h index 162c816517..cf1596be80 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -514,6 +514,10 @@ NAPI_EXTERN napi_status napi_set_instance_data(napi_env env, NAPI_EXTERN napi_status napi_get_instance_data(napi_env env, void** data); + +// ArrayBuffer detaching +NAPI_EXTERN napi_status napi_detach_arraybuffer(napi_env env, + napi_value arraybuffer); #endif // NAPI_EXPERIMENTAL EXTERN_C_END diff --git a/src/js_native_api_types.h b/src/js_native_api_types.h index ae8fedb146..a81e76a649 100644 --- a/src/js_native_api_types.h +++ b/src/js_native_api_types.h @@ -80,6 +80,8 @@ typedef enum { napi_closing, napi_bigint_expected, napi_date_expected, + napi_arraybuffer_expected, + napi_detachable_arraybuffer_expected, } napi_status; // Note: when adding a new enum value to `napi_status`, please also update // `const int last_status` in `napi_get_last_error_info()' definition, diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index eea8adea37..1f5b6c012f 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -671,6 +671,8 @@ const char* error_messages[] = {nullptr, "Thread-safe function handle is closing", "A bigint was expected", "A date was expected", + "An arraybuffer was expected", + "A detachable arraybuffer was expected", }; napi_status napi_get_last_error_info(napi_env env, @@ -682,7 +684,7 @@ napi_status napi_get_last_error_info(napi_env env, // message in the `napi_status` enum each time a new error message is added. // We don't have a napi_status_last as this would result in an ABI // change each time a message was added. - const int last_status = napi_date_expected; + const int last_status = napi_detachable_arraybuffer_expected; static_assert( NAPI_ARRAYSIZE(error_messages) == last_status + 1, @@ -3003,3 +3005,22 @@ napi_status napi_get_instance_data(napi_env env, return napi_clear_last_error(env); } + +napi_status napi_detach_arraybuffer(napi_env env, napi_value arraybuffer) { + CHECK_ENV(env); + CHECK_ARG(env, arraybuffer); + + v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer); + RETURN_STATUS_IF_FALSE( + env, value->IsArrayBuffer(), napi_arraybuffer_expected); + + v8::Local<v8::ArrayBuffer> it = value.As<v8::ArrayBuffer>(); + RETURN_STATUS_IF_FALSE( + env, it->IsExternal(), napi_detachable_arraybuffer_expected); + RETURN_STATUS_IF_FALSE( + env, it->IsDetachable(), napi_detachable_arraybuffer_expected); + + it->Detach(); + + return napi_clear_last_error(env); +} |