summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlegendecas <legendecas@gmail.com>2019-09-30 09:42:58 +0800
committerRich Trott <rtrott@gmail.com>2019-10-14 16:05:58 -0700
commit6afed1dc853cf2b040502d858caadc17575a7fdf (patch)
tree4162edee603f8a83ab4afd9b2a72c3ab1cc0ff17 /src
parentf9caee986cae09cd4cb47e0a02a5b8672ab2c16d (diff)
downloadandroid-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.h4
-rw-r--r--src/js_native_api_types.h2
-rw-r--r--src/js_native_api_v8.cc23
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);
+}