From 7ff9f51404231089c558817cdeb8e48ab685b487 Mon Sep 17 00:00:00 2001 From: benzunfu Date: Tue, 17 Jun 2025 15:37:42 +0800 Subject: [PATCH 1/2] Fix 1.2 napi_serialize problem Issue:https://gitee.com/openharmony/arkcompiler_runtime_core/issues/ICD87M Change-Id: I04cf971adeb7df8fba2d19be68e898a001834e1c Signed-off-by: benzunfu --- interfaces/inner_api/napi/native_node_api.h | 5 ++++- native_engine/native_api.cpp | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index 5dbcd8dc5..743ac175e 100644 --- a/interfaces/inner_api/napi/native_node_api.h +++ b/interfaces/inner_api/napi/native_node_api.h @@ -209,11 +209,14 @@ NAPI_EXTERN napi_status napi_create_xref(napi_env env, napi_value value, uint32_t initial_refcount, napi_ref* result); + +typedef napi_value (*proxy_object_attach_cb)(napi_env env, void* data); NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, napi_value js_object, void* native_object, napi_finalize finalize_cb, - napi_ref* result); + napi_ref* result, + proxy_object_attach_cb proxy_cb); NAPI_EXTERN napi_status napi_is_alive_object(napi_env env, napi_ref ref, bool* result); NAPI_EXTERN napi_status napi_is_contain_object(napi_env env, napi_ref ref, bool* result); NAPI_EXTERN napi_status napi_is_xref_type(napi_env env, napi_value js_object, bool* result); diff --git a/native_engine/native_api.cpp b/native_engine/native_api.cpp index d3d17439f..9f4e82e34 100644 --- a/native_engine/native_api.cpp +++ b/native_engine/native_api.cpp @@ -4474,19 +4474,26 @@ NAPI_EXTERN napi_status napi_create_xref(napi_env env, napi_value value, uint32_ *result = reinterpret_cast(ref); return napi_clear_last_error(env); } +using FunctionPtr = napi_value(*)(napi_env, void*); +using ResourcePair = std::pair; +static void DeletePairRefCallback([[maybe_unused]] void *env, [[maybe_unused]] void *data, [[maybe_unused]] void *hint) +{ + delete static_cast(hint); +} +typedef napi_value (*proxy_object_attach_cb)(napi_env env, void* data); NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, napi_value js_object, void* native_object, napi_finalize finalize_cb, - napi_ref* result) + napi_ref* result, + proxy_object_attach_cb proxy_cb = nullptr) { NAPI_PREAMBLE(env); CHECK_ARG(env, js_object); CHECK_ARG(env, native_object); CHECK_ARG(env, finalize_cb); CHECK_ARG(env, result); - auto nativeValue = LocalValueFromJsValue(js_object); auto callback = reinterpret_cast(finalize_cb); auto engine = reinterpret_cast(env); @@ -4501,8 +4508,12 @@ NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, // Create strong reference now, will update to weak reference after interop support ref = engine->CreateXRefReference(js_object, 1, false, callback, native_object); *reference = ref; + auto dynamicPair = new std::pair{ + proxy_cb, + native_object + }; object->SetNativePointerFieldCount(vm, 1); - object->SetNativePointerField(vm, 0, ref, nullptr, nullptr, nativeBindingSize); + object->SetNativePointerField(vm, 0, ref, DeletePairRefCallback, (void *)dynamicPair, nativeBindingSize); PropertyAttribute attr(object, true, false, true); nativeObject->DefineProperty(vm, key, attr); return GET_RETURN_STATUS(env); -- Gitee From 31e39522707665f3f9c3774ea94009175e090b35 Mon Sep 17 00:00:00 2001 From: chentianyu Date: Wed, 18 Jun 2025 09:33:53 +0800 Subject: [PATCH 2/2] tmp Issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICDFSB Signed-off-by: chentianyu Change-Id: I0751ab33fbc5f4c3a39f0a06d649f6296885f242 --- native_engine/native_api.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/native_engine/native_api.cpp b/native_engine/native_api.cpp index 9f4e82e34..a1d661050 100644 --- a/native_engine/native_api.cpp +++ b/native_engine/native_api.cpp @@ -4474,12 +4474,6 @@ NAPI_EXTERN napi_status napi_create_xref(napi_env env, napi_value value, uint32_ *result = reinterpret_cast(ref); return napi_clear_last_error(env); } -using FunctionPtr = napi_value(*)(napi_env, void*); -using ResourcePair = std::pair; -static void DeletePairRefCallback([[maybe_unused]] void *env, [[maybe_unused]] void *data, [[maybe_unused]] void *hint) -{ - delete static_cast(hint); -} typedef napi_value (*proxy_object_attach_cb)(napi_env env, void* data); NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, @@ -4508,12 +4502,20 @@ NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, // Create strong reference now, will update to weak reference after interop support ref = engine->CreateXRefReference(js_object, 1, false, callback, native_object); *reference = ref; - auto dynamicPair = new std::pair{ - proxy_cb, - native_object - }; + panda::JSNApi::XRefBindingInfo* data = panda::JSNApi::XRefBindingInfo::CreateNewInstance(); + if (data == nullptr) { + HILOG_ERROR("data is nullptr"); + return napi_set_last_error(env, napi_invalid_arg); + } + data->attachXRefFunc = reinterpret_cast(proxy_cb); + data->attachXRefData = native_object; object->SetNativePointerFieldCount(vm, 1); - object->SetNativePointerField(vm, 0, ref, DeletePairRefCallback, (void *)dynamicPair, nativeBindingSize); + object->SetNativePointerField(vm, 0, ref, + [](void* env, void* data, void* info) { + panda::JSNApi::XRefBindingInfo* externalInfo = reinterpret_cast(info); + delete externalInfo; + }, + reinterpret_cast(data), nativeBindingSize); PropertyAttribute attr(object, true, false, true); nativeObject->DefineProperty(vm, key, attr); return GET_RETURN_STATUS(env); -- Gitee