diff --git a/native_engine/impl/ark/ark_native_engine.cpp b/native_engine/impl/ark/ark_native_engine.cpp index 4715f4eb9537992f8a09721667e346ef8265b711..d4aa8c7934945719278b81aae09f89b4c75a013d 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 2a7ec59c7923617ab4656e337c79ff8d491c9954..6094e6b202161e065178bde98c7ed43af79be118 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 10c2728431456b4309a4df12febd429b3c80d655..5c56e3f0e0dfe529f118a92d25730d770f2f4684 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 */