From 242d6ffa7532278481944b2572286d4ac9219ff0 Mon Sep 17 00:00:00 2001 From: MockMockBlack Date: Mon, 25 Aug 2025 09:56:43 +0800 Subject: [PATCH] [Interop] saves a raw pointer to Xref Issue: https://gitee.com/openharmony/arkcompiler_runtime_core/issues/ICUGI1 Change-Id: Ifb339b96613c53925f226ebfca703e6eecba86d0 Signed-off-by: MockMockBlack --- native_engine/native_node_hybrid_api.cpp | 25 ++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/native_engine/native_node_hybrid_api.cpp b/native_engine/native_node_hybrid_api.cpp index 4bed014ce..3bb7aa136 100644 --- a/native_engine/native_node_hybrid_api.cpp +++ b/native_engine/native_node_hybrid_api.cpp @@ -143,7 +143,7 @@ NAPI_EXTERN napi_status napi_xref_unwrap(napi_env env, napi_value js_object, voi auto vm = reinterpret_cast(env)->GetEcmaVm(); panda::JsiFastNativeScope fastNativeScope(vm); CHECK_AND_CONVERT_TO_OBJECT(env, vm, nativeValue, nativeObject); - Local key = panda::StringRef::GetProxyNapiWrapperString(vm); + Local key = panda::StringRef::GetSharedReferencePointer(vm); Local val = {}; if (UNLIKELY(nativeValue->IsProxy(vm))) { @@ -154,11 +154,12 @@ NAPI_EXTERN napi_status napi_xref_unwrap(napi_env env, napi_value js_object, voi val = property.GetValue(vm); } - *result = nullptr; - if (val->IsObject(vm)) { - Local ext(val); - auto ref = reinterpret_cast(ext->GetNativePointerField(vm, 0)); - *result = ref != nullptr ? ref->GetData() : nullptr; + bool isNumber = false; + auto sharedReferencePointer = reinterpret_cast(val->GetValueInt64(isNumber)); + if (isNumber) { + *result = sharedReferencePointer; + } else { + *result = nullptr; } return GET_RETURN_STATUS(env); @@ -308,6 +309,12 @@ NAPI_EXTERN napi_status napi_mark_attach_with_xref(napi_env env, reinterpret_cast(data), nativeBindingSize); panda::PropertyAttribute attr(object, true, false, true); nativeObject->DefineProperty(vm, key, attr); + + Local sharedReferencePointer = + panda::NumberRef::New(vm, static_cast(reinterpret_cast(attach_data))); + panda::PropertyAttribute sharedReferencePointerAttr(sharedReferencePointer, true, false, true); + nativeObject->DefineProperty(vm, panda::StringRef::GetSharedReferencePointer(vm), sharedReferencePointerAttr); + return GET_RETURN_STATUS(env); } @@ -389,6 +396,12 @@ NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, reinterpret_cast(data), nativeBindingSize); panda::PropertyAttribute attr(object, true, false, true); nativeObject->DefineProperty(vm, key, attr); + + Local sharedReferencePointer = + panda::NumberRef::New(vm, static_cast(reinterpret_cast(native_object))); + panda::PropertyAttribute sharedReferencePointerAttr(sharedReferencePointer, true, false, true); + nativeObject->DefineProperty(vm, panda::StringRef::GetSharedReferencePointer(vm), sharedReferencePointerAttr); + return GET_RETURN_STATUS(env); } -- Gitee