From 7502e1dc0da15334f88911a802fa6ba919b6c83c Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Sun, 11 Dec 2022 21:31:01 +1100 Subject: Improve logic around using Ref with GDExtension virtual functions --- core/extension/gdextension_interface.cpp | 22 ++++++++++++++++++++++ core/extension/gdextension_interface.h | 7 +++++++ 2 files changed, 29 insertions(+) (limited to 'core/extension') diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp index 197e9db1e7..94755bc4d4 100644 --- a/core/extension/gdextension_interface.cpp +++ b/core/extension/gdextension_interface.cpp @@ -879,6 +879,23 @@ static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObj return (GDObjectInstanceID)o->get_instance_id(); } +static GDExtensionObjectPtr gdextension_ref_get_object(GDExtensionConstRefPtr p_ref) { + const Ref *ref = (const Ref *)p_ref; + if (ref == nullptr || ref->is_null()) { + return (GDExtensionObjectPtr) nullptr; + } else { + return (GDExtensionObjectPtr)ref->ptr(); + } +} + +static void gdextension_ref_set_object(GDExtensionRefPtr p_ref, GDExtensionObjectPtr p_object) { + Ref *ref = (Ref *)p_ref; + ERR_FAIL_NULL(ref); + + Object *o = (RefCounted *)p_object; + ref->reference_ptr(o); +} + static GDExtensionScriptInstancePtr gdextension_script_instance_create(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) { ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension); script_instance_extension->instance = p_instance_data; @@ -1057,6 +1074,11 @@ void gdextension_setup_interface(GDExtensionInterface *p_interface) { gde_interface.object_get_instance_from_id = gdextension_object_get_instance_from_id; gde_interface.object_get_instance_id = gdextension_object_get_instance_id; + /* REFERENCE */ + + gde_interface.ref_get_object = gdextension_ref_get_object; + gde_interface.ref_set_object = gdextension_ref_set_object; + /* SCRIPT INSTANCE */ gde_interface.script_instance_create = gdextension_script_instance_create; diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h index b59a6b5ca4..66fca76aa8 100644 --- a/core/extension/gdextension_interface.h +++ b/core/extension/gdextension_interface.h @@ -154,6 +154,8 @@ typedef const void *GDExtensionMethodBindPtr; typedef int64_t GDExtensionInt; typedef uint8_t GDExtensionBool; typedef uint64_t GDObjectInstanceID; +typedef void *GDExtensionRefPtr; +typedef const void *GDExtensionConstRefPtr; /* VARIANT DATA I/O */ @@ -551,6 +553,11 @@ typedef struct { GDExtensionObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id); GDObjectInstanceID (*object_get_instance_id)(GDExtensionConstObjectPtr p_object); + /* REFERENCE */ + + GDExtensionObjectPtr (*ref_get_object)(GDExtensionConstRefPtr p_ref); + void (*ref_set_object)(GDExtensionRefPtr p_ref, GDExtensionObjectPtr p_object); + /* SCRIPT INSTANCE */ GDExtensionScriptInstancePtr (*script_instance_create)(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data); -- cgit v1.2.3