diff options
Diffstat (limited to 'modules/mono/mono_gc_handle.h')
-rw-r--r-- | modules/mono/mono_gc_handle.h | 56 |
1 files changed, 19 insertions, 37 deletions
diff --git a/modules/mono/mono_gc_handle.h b/modules/mono/mono_gc_handle.h index e2aff1d19d..4e4c13fee6 100644 --- a/modules/mono/mono_gc_handle.h +++ b/modules/mono/mono_gc_handle.h @@ -31,8 +31,6 @@ #ifndef MONO_GC_HANDLE_H #define MONO_GC_HANDLE_H -#include <mono/jit/jit.h> - #include "core/object/ref_counted.h" namespace gdmono { @@ -44,18 +42,32 @@ enum class GCHandleType : char { }; } +extern "C" { +struct GCHandleIntPtr { + void *value; + + _FORCE_INLINE_ bool operator==(const GCHandleIntPtr &p_other) { return value == p_other.value; } + _FORCE_INLINE_ bool operator!=(const GCHandleIntPtr &p_other) { return value != p_other.value; } + + GCHandleIntPtr() = delete; +}; +} + +static_assert(sizeof(GCHandleIntPtr) == sizeof(void *)); + // Manual release of the GC handle must be done when using this struct struct MonoGCHandleData { - uint32_t handle = 0; + GCHandleIntPtr handle = { nullptr }; gdmono::GCHandleType type = gdmono::GCHandleType::NIL; - _FORCE_INLINE_ bool is_released() const { return !handle; } + _FORCE_INLINE_ bool is_released() const { return !handle.value; } _FORCE_INLINE_ bool is_weak() const { return type == gdmono::GCHandleType::WEAK_HANDLE; } - - _FORCE_INLINE_ MonoObject *get_target() const { return handle ? mono_gchandle_get_target(handle) : nullptr; } + _FORCE_INLINE_ GCHandleIntPtr get_intptr() const { return handle; } void release(); + static void free_gchandle(GCHandleIntPtr p_gchandle); + void operator=(const MonoGCHandleData &p_other) { #ifdef DEBUG_ENABLED CRASH_COND(!is_released()); @@ -68,40 +80,10 @@ struct MonoGCHandleData { MonoGCHandleData() {} - MonoGCHandleData(uint32_t p_handle, gdmono::GCHandleType p_type) : + MonoGCHandleData(GCHandleIntPtr p_handle, gdmono::GCHandleType p_type) : handle(p_handle), type(p_type) { } - - static MonoGCHandleData new_strong_handle(MonoObject *p_object); - static MonoGCHandleData new_strong_handle_pinned(MonoObject *p_object); - static MonoGCHandleData new_weak_handle(MonoObject *p_object); -}; - -class MonoGCHandleRef : public RefCounted { - GDCLASS(MonoGCHandleRef, RefCounted); - - MonoGCHandleData data; - -public: - static Ref<MonoGCHandleRef> create_strong(MonoObject *p_object); - static Ref<MonoGCHandleRef> create_weak(MonoObject *p_object); - - _FORCE_INLINE_ bool is_released() const { return data.is_released(); } - _FORCE_INLINE_ bool is_weak() const { return data.is_weak(); } - - _FORCE_INLINE_ MonoObject *get_target() const { return data.get_target(); } - - void release() { data.release(); } - - _FORCE_INLINE_ void set_handle(uint32_t p_handle, gdmono::GCHandleType p_handle_type) { - data = MonoGCHandleData(p_handle, p_handle_type); - } - - MonoGCHandleRef(const MonoGCHandleData &p_gc_handle_data) : - data(p_gc_handle_data) { - } - ~MonoGCHandleRef() { release(); } }; #endif // MONO_GC_HANDLE_H |