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 706dfea2b2ebeeb9135abab7e26ea34e694d1316..8de0b8b60250c9c9073d3e4e258ecf71b4ba7443 100644 --- a/native_engine/impl/ark/ark_native_reference.cpp +++ b/native_engine/impl/ark/ark_native_reference.cpp @@ -14,7 +14,6 @@ */ #include - #include "ark_native_reference.h" #include "native_engine/native_api_internal.h" @@ -29,7 +28,8 @@ ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, void* hint, bool isAsyncCall, size_t nativeBindingSize) - : engine_(engine), + : value_(engine->GetEcmaVm(), value), + engine_(engine), value_(engine->GetEcmaVm(), LocalValueFromJsValue(value)), refCount_(initialRefcount), ownership_(deleteSelf ? ReferenceOwnerShip::RUNTIME : ReferenceOwnerShip::USER), @@ -42,21 +42,21 @@ ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, ArkNativeReferenceConstructor(); } -ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, - napi_value value, - ArkNativeReferenceConfig& config) - : engine_(engine), - value_(), - refCount_(config.initialRefcount), - ownership_(config.deleteSelf ? ReferenceOwnerShip::RUNTIME : ReferenceOwnerShip::USER), - isProxyReference_(config.isProxyReference), - napiCallback_(config.napiCallback), - data_(config.data) -{ - InitProperties(config.deleteSelf, false); - value_.CreateXRefGloablReference(engine->GetEcmaVm(), LocalValueFromJsValue(value)); - ArkNativeReferenceConstructor(); -} +// ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, +// napi_value value, +// ArkNativeReferenceConfig& config) +// : engine_(engine), +// value_(), +// refCount_(config.initialRefcount), +// ownership_(config.deleteSelf ? ReferenceOwnerShip::RUNTIME : ReferenceOwnerShip::USER), +// isProxyReference_(config.isProxyReference), +// napiCallback_(config.napiCallback), +// data_(config.data) +// { +// InitProperties(config.deleteSelf, false); +// value_.CreateXRefGloablReference(engine->GetEcmaVm(), LocalValueFromJsValue(value)); +// ArkNativeReferenceConstructor(); +// } ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, Local value, @@ -67,8 +67,8 @@ ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, void* hint, bool isAsyncCall, size_t nativeBindingSize) - : engine_(engine), - value_(engine->GetEcmaVm(), value), + : value_(engine->GetEcmaVm(), value), + engine_(engine), refCount_(initialRefcount), ownership_(deleteSelf ? ReferenceOwnerShip::RUNTIME : ReferenceOwnerShip::USER), napiCallback_(napiCallback), @@ -140,11 +140,7 @@ ArkNativeReference::~ArkNativeReference() return; } SetHasDelete(); - if (isProxyReference_) { - value_.FreeXRefGlobalHandleAddr(); - } else { - value_.FreeGlobalHandleAddr(); - } + value_.FreeGlobalHandleAddr(); FinalizeCallback(FinalizerState::DESTRUCTION); } @@ -357,24 +353,64 @@ inline void ArkNativeReference::SetFinalRan() properties_ |= ReferencePropertiesMask::FINAL_RAN_MASK; } +ArkInteropNativeReference::ArkInteropNativeReference(ArkNativeEngine* engine, + napi_value value, ArkNativeReferenceConfig& config) +: ArkNativeReference(engine, napi_value(), config.initialRefcount, config.deleteSelf, config.napiCallback, config.data, + nullptr, false, 0) +{ + value_.CreateXRefGloablReference(engine->GetEcmaVm(), LocalValueFromJsValue(value)); +} + +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(std::function &visitor) +void ArkInteropNativeReference::MarkFromObject(std::function &visitor) { value_.MarkFromObject(visitor); } -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(); } #endif // PANDA_JS_ETS_HYBRID_MODE + \ No newline at end of file diff --git a/native_engine/impl/ark/ark_native_reference.h b/native_engine/impl/ark/ark_native_reference.h index 9ead72981527db33bd2f9c6e105302bc486f52e4..1fecc70fc9a2e9e87b286d731fc08f264b3ed61a 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,12 +93,15 @@ public: napi_value GetNapiValue() override; void ResetFinalizer() override; #ifdef PANDA_JS_ETS_HYBRID_MODE - void MarkFromObject(std::function &visitor); - void MarkFromObject(); - bool IsObjectAlive(); - bool IsValidHeapObject(); + virtual void MarkFromObject(std::function &visitor) {} + 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, @@ -116,14 +116,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}; @@ -151,4 +150,18 @@ 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(std::function &visitor) override; + 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 */ + \ No newline at end of file