From e1af0e8e17f6cbd3c7e2b0621270c2c565dc3612 Mon Sep 17 00:00:00 2001 From: lhc Date: Sun, 20 Jul 2025 21:36:11 +0800 Subject: [PATCH] Isolate the code of interop Issue: https://gitee.com/open_harmony/dashboard?issue_id=ICNFMT Signed-off-by: lhc Change-Id: Ia736804ebe1f580713eddc3f9881954f90387c2f --- native_engine/impl/ark/ark_native_engine.cpp | 2 +- .../impl/ark/ark_native_reference.cpp | 53 +++++++++++++++++-- native_engine/impl/ark/ark_native_reference.h | 27 +++++++--- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/native_engine/impl/ark/ark_native_engine.cpp b/native_engine/impl/ark/ark_native_engine.cpp index 4715f4eb9..d4aa8c793 100644 --- a/native_engine/impl/ark/ark_native_engine.cpp +++ b/native_engine/impl/ark/ark_native_engine.cpp @@ -1980,7 +1980,7 @@ NativeReference* ArkNativeEngine::CreateXRefReference(napi_value value, uint32_t bool flag, NapiNativeFinalize callback, void* data) { ArkNativeReferenceConfig config(initialRefcount, true, flag, callback, data); - return new ArkNativeReference(this, value, config); + return new ArkInteropNativeReference(this, value, config); } NativeReference* ArkNativeEngine::CreateAsyncReference(napi_value value, uint32_t initialRefcount, diff --git a/native_engine/impl/ark/ark_native_reference.cpp b/native_engine/impl/ark/ark_native_reference.cpp index 2a7ec59c7..6094e6b20 100644 --- a/native_engine/impl/ark/ark_native_reference.cpp +++ b/native_engine/impl/ark/ark_native_reference.cpp @@ -357,18 +357,65 @@ inline void ArkNativeReference::SetFinalRan() properties_ |= ReferencePropertiesMask::FINAL_RAN_MASK; } +ArkInteropNativeReference::ArkInteropNativeReference(ArkNativeEngine* engine, + napi_value value, + ArkNativeReferenceConfig& config) +: engine_(engine), +ownership_(config.deleteSelf ? ReferenceOwnerShip::RUNTIME : ReferenceOwnerShip::USER), +value_(), +refCount_(config.initialRefcount), +isProxyReference_(config.isProxyReference), +deleteSelf_(config.deleteSelf), +napiCallback_(config.napiCallback), +data_(config.data) +{ + value_.CreateXRefGloablReference(engine->GetEcmaVm(), LocalValueFromJsValue(value)); + ArkNativeReferenceConstructor(); +} + +ArkInteropNativeReference::~ArkInteropNativeReference() +{ + VALID_ENGINE_CHECK(engine_, engine_, engineId_); + + if (!napiCallback_) { + engine_->DecreaseNonCallbackRefCounter(); + } + + NativeReferenceManager* refMgr = engine_->GetReferenceManager(); + if (ownership_ == ReferenceOwnerShip::RUNTIME && refMgr != nullptr) { + refMgr->ReleaseHandler(this); + prev_ = nullptr; + next_ = nullptr; + } + if (value_.IsEmpty()) { + return; + } + hasDelete_ = true; + value_.FreeGlobalHandleAddr(); + value_.FreeXRefGlobalHandleAddr(); + FinalizeCallback(FinalizerState::DESTRUCTION); +} + +void ArkInteropNativeReference::FreeGlobalCallBack(void* ref) +{ + auto that = reinterpret_cast(ref); + that->value_.FreeGlobalHandleAddr(); + that->value_.FreeXRefGlobalHandleAddr(); +} + + #ifdef PANDA_JS_ETS_HYBRID_MODE -void ArkNativeReference::MarkFromObject() +void ArkInteropNativeReference::MarkFromObject() { value_.MarkFromObject(); } -bool ArkNativeReference::IsObjectAlive() +bool ArkInteropNativeReference::IsObjectAlive() { return value_.IsObjectAlive(); } -bool ArkNativeReference::IsValidHeapObject() +bool ArkInteropNativeReference::IsValidHeapObject() { return value_.IsValidHeapObject(); } diff --git a/native_engine/impl/ark/ark_native_reference.h b/native_engine/impl/ark/ark_native_reference.h index 10c272843..5c56e3f0e 100644 --- a/native_engine/impl/ark/ark_native_reference.h +++ b/native_engine/impl/ark/ark_native_reference.h @@ -69,9 +69,6 @@ public: void* hint = nullptr, bool isAsyncCall = false, size_t nativeBindingSize = 0); - ArkNativeReference(ArkNativeEngine* engine, - napi_value value, - ArkNativeReferenceConfig &config); ArkNativeReference(ArkNativeEngine* engine, Local value, uint32_t initialRefcount, @@ -96,11 +93,14 @@ public: napi_value GetNapiValue() override; void ResetFinalizer() override; #ifdef PANDA_JS_ETS_HYBRID_MODE - void MarkFromObject(); - bool IsObjectAlive(); - bool IsValidHeapObject(); + virtual void MarkFromObject() {} + virtual bool IsObjectAlive() { return false; } + virtual bool IsValidHeapObject() { return false; } #endif // PANDA_JS_ETS_HYBRID_MODE +protected: + Global value_; + private: enum ReferencePropertiesMask : uint8_t { DELETE_SELF_MASK = 1, @@ -115,14 +115,13 @@ private: ArkNativeEngine* engine_; uint64_t engineId_ {0}; - Global value_; uint32_t refCount_ {0}; const ReferenceOwnerShip ownership_; // Bit-packed flags: saves memory and speeds up object creation vs. multiple bools. // std::bitset will use more memory than uint8_t number. uint8_t properties_ {0}; - bool isProxyReference_{false}; + // bool isProxyReference_{false}; NapiNativeFinalize napiCallback_ {nullptr}; void* data_ {nullptr}; @@ -150,4 +149,16 @@ private: friend class NativeReferenceManager; }; +class ArkInteropNativeReference : public ArkNativeReference { +public: + ArkInteropNativeReference(ArkNativeEngine* engine, + napi_value value, + ArkNativeReferenceConfig &config); +#ifdef PANDA_JS_ETS_HYBRID_MODE + void MarkFromObject() override; + bool IsObjectAlive() override; + bool IsValidHeapObject() override; +#endif // PANDA_JS_ETS_HYBRID_MODE +}; + #endif /* FOUNDATION_ACE_NAPI_NATIVE_ENGINE_ARK_NATIVE_REFERENCE_H */ -- Gitee