summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorCed Naru <cednaru.dev@gmail.com>2023-10-04 19:13:07 +0200
committerCed Naru <cednaru.dev@gmail.com>2023-10-04 19:24:37 +0200
commit0a246e9b549a03f6d8e8a6ef6d15964831a2df60 (patch)
tree5ebbfd8ff86baedb6c80807a59ee64d8bd24ed65 /core
parentbfd78bb917887cfc1fd842ba23570394cad8bedb (diff)
downloadredot-engine-0a246e9b549a03f6d8e8a6ef6d15964831a2df60.tar.gz
expose Object::free_instance_binding to GDExtension
Diffstat (limited to 'core')
-rw-r--r--core/extension/gdextension_interface.cpp6
-rw-r--r--core/extension/gdextension_interface.h11
-rw-r--r--core/object/object.cpp2
-rw-r--r--core/object/object.h2
4 files changed, 19 insertions, 2 deletions
diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp
index 2b4a37b1e0..843f9ceecf 100644
--- a/core/extension/gdextension_interface.cpp
+++ b/core/extension/gdextension_interface.cpp
@@ -1152,6 +1152,11 @@ static void gdextension_object_set_instance_binding(GDExtensionObjectPtr p_objec
o->set_instance_binding(p_token, p_binding, p_callbacks);
}
+static void gdextension_object_free_instance_binding(GDExtensionObjectPtr p_object, void *p_token) {
+ Object *o = (Object *)p_object;
+ o->free_instance_binding(p_token);
+}
+
static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {
const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
Object *o = (Object *)p_object;
@@ -1491,6 +1496,7 @@ void gdextension_setup_interface() {
REGISTER_INTERFACE_FUNC(global_get_singleton);
REGISTER_INTERFACE_FUNC(object_get_instance_binding);
REGISTER_INTERFACE_FUNC(object_set_instance_binding);
+ REGISTER_INTERFACE_FUNC(object_free_instance_binding);
REGISTER_INTERFACE_FUNC(object_set_instance);
REGISTER_INTERFACE_FUNC(object_get_class_name);
REGISTER_INTERFACE_FUNC(object_cast_to);
diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h
index fbd1480e69..ae7c5e0d2a 100644
--- a/core/extension/gdextension_interface.h
+++ b/core/extension/gdextension_interface.h
@@ -2192,6 +2192,17 @@ typedef void *(*GDExtensionInterfaceObjectGetInstanceBinding)(GDExtensionObjectP
typedef void (*GDExtensionInterfaceObjectSetInstanceBinding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
/**
+ * @name object_free_instance_binding
+ * @since 4.2
+ *
+ * Free an Object's instance binding.
+ *
+ * @param p_o A pointer to the Object.
+ * @param p_library A token the library received by the GDExtension's entry point function.
+ */
+typedef void (*GDExtensionInterfaceObjectFreeInstanceBinding)(GDExtensionObjectPtr p_o, void *p_token);
+
+/**
* @name object_set_instance
* @since 4.1
*
diff --git a/core/object/object.cpp b/core/object/object.cpp
index f62b93d0ff..147e8f2136 100644
--- a/core/object/object.cpp
+++ b/core/object/object.cpp
@@ -1863,7 +1863,6 @@ bool Object::has_instance_binding(void *p_token) {
return found;
}
-#ifdef TOOLS_ENABLED
void Object::free_instance_binding(void *p_token) {
bool found = false;
_instance_binding_mutex.lock();
@@ -1888,6 +1887,7 @@ void Object::free_instance_binding(void *p_token) {
_instance_binding_mutex.unlock();
}
+#ifdef TOOLS_ENABLED
void Object::clear_internal_extension() {
ERR_FAIL_NULL(_extension);
diff --git a/core/object/object.h b/core/object/object.h
index 60dc031d4d..a444db0f70 100644
--- a/core/object/object.h
+++ b/core/object/object.h
@@ -970,9 +970,9 @@ public:
// Used on creation by binding only.
void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
bool has_instance_binding(void *p_token);
+ void free_instance_binding(void *p_token);
#ifdef TOOLS_ENABLED
- void free_instance_binding(void *p_token);
void clear_internal_extension();
void reset_internal_extension(ObjectGDExtension *p_extension);
#endif