diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2022-12-14 12:36:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-14 12:36:34 +0100 |
commit | eba33c67b49905973ee7c81a709046415a41e205 (patch) | |
tree | f6d565ea6ce66cfc7a0fea8bae7d31b07781a858 /core/extension/gdextension_interface.cpp | |
parent | 6b381d1d2d2338c6df2e3a5e3ad114d9ece15392 (diff) | |
parent | 7502e1dc0da15334f88911a802fa6ba919b6c83c (diff) | |
download | redot-engine-eba33c67b49905973ee7c81a709046415a41e205.tar.gz |
Merge pull request #69902 from BastiaanOlij/improve_gdextension_virtual_ref
Improve logic around using Ref<T> with GDExtension virtual functions
Diffstat (limited to 'core/extension/gdextension_interface.cpp')
-rw-r--r-- | core/extension/gdextension_interface.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
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<RefCounted> *ref = (const Ref<RefCounted> *)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<RefCounted> *ref = (Ref<RefCounted> *)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; |