diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index 5dbcd8dc54c8d95204190c8e6fd9e29081c871f6..743ac175ede14e2f82e9d5baf8a704d64e8a293e 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 d3d17439f738324e71e03294a572d1780668e9dc..9f4e82e346ee6e9faa53444d171bb3713d0eb631 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);