diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index 6c3e080f6684e0d433860f60f635260d93134f7b..100d4726d760c9f128bb151cbd40fc591c0a6c8b 100644 --- a/interfaces/inner_api/napi/native_node_api.h +++ b/interfaces/inner_api/napi/native_node_api.h @@ -176,6 +176,14 @@ NAPI_EXTERN napi_status napi_get_shared_array_buffer_info(napi_env env, napi_value arraybuffer, void** data, size_t* byte_length); +NAPI_EXTERN napi_status napi_get_arraybuffer_finalizer(napi_env env, + napi_value arraybuffer, + napi_finalize* finalize_cb_ptr, + void** finalize_hint_ptr); +NAPI_EXTERN napi_status napi_set_arraybuffer_finalizer(napi_env env, + napi_value arraybuffer, + napi_finalize finalize_cb, + void* finalize_hint); NAPI_EXTERN napi_status napi_encode(napi_env env, napi_value src, napi_value* result); NAPI_EXTERN napi_status napi_is_bitvector(napi_env env, napi_value value, bool* result); NAPI_EXTERN napi_status napi_set_stackinfo(napi_env env, napi_stack_info *napi_info); diff --git a/native_engine/native_api.cpp b/native_engine/native_api.cpp index 0228afa0714ae40a94c2271a6bd6476a497931e4..ed2f9f0e565a8719508cea5c65f7be3e6e2fee0e 100644 --- a/native_engine/native_api.cpp +++ b/native_engine/native_api.cpp @@ -2637,6 +2637,63 @@ NAPI_EXTERN napi_status napi_get_arraybuffer_info(napi_env env, return napi_clear_last_error(env); } +NAPI_EXTERN napi_status napi_get_arraybuffer_finalizer(napi_env env, + napi_value arraybuffer, + napi_finalize* finalize_cb_ptr, + void** finalize_hint_ptr) +{ + CHECK_ENV(env); + CHECK_ARG(env, arraybuffer); + CHECK_ARG(env, finalize_cb_ptr); + CHECK_ARG(env, finalize_hint_ptr); + + auto nativeValue = LocalValueFromJsValue(arraybuffer); + auto vm = reinterpret_cast(env)->GetEcmaVm(); + panda::JsiFastNativeScope fastNativeScope(vm); + if (LIKELY(nativeValue->IsArrayBuffer(vm))) { + Local res(nativeValue); + auto [finalize_cb, finalize_hint] = res->GetFinalizer(vm); + + if (finalize_cb_ptr != nullptr) { + *finalize_cb_ptr = reinterpret_cast(finalize_cb); + } + if (finalize_hint_ptr != nullptr) { + *finalize_hint_ptr = finalize_hint; + } + } else if (nativeValue->IsSendableArrayBuffer(vm)) { + // TODO + } else { + return napi_set_last_error(env, napi_arraybuffer_expected); + } + + return napi_clear_last_error(env); +} + +NAPI_EXTERN napi_status napi_set_arraybuffer_finalizer(napi_env env, + napi_value arraybuffer, + napi_finalize finalize_cb, + void* finalize_hint) +{ + CHECK_ENV(env); + CHECK_ARG(env, arraybuffer); + // CHECK_ARG(env, finalize_cb); + // CHECK_ARG(env, finalize_hint); + + auto nativeValue = LocalValueFromJsValue(arraybuffer); + auto vm = reinterpret_cast(env)->GetEcmaVm(); + panda::JsiFastNativeScope fastNativeScope(vm); + if (LIKELY(nativeValue->IsArrayBuffer(vm))) { + Local res(nativeValue); + res->SetFinalizer(vm, reinterpret_cast(finalize_cb), finalize_hint); + } else if (nativeValue->IsSendableArrayBuffer(vm)) { + // TODO + } else { + return napi_set_last_error(env, napi_arraybuffer_expected); + } + + return napi_clear_last_error(env); +} + NAPI_EXTERN napi_status napi_is_typedarray(napi_env env, napi_value value, bool* result) { CHECK_ENV(env);