Browse Source

Merge pull request #82799 from CedNaru/feature/expose_free_instance_binding

Expose `Object::free_instance_binding()` to GDExtension
Rémi Verschelde 1 year ago
parent
commit
c7ed5d795e

+ 6 - 0
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);
 	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) {
 static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {
 	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
 	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
 	Object *o = (Object *)p_object;
 	Object *o = (Object *)p_object;
@@ -1491,6 +1496,7 @@ void gdextension_setup_interface() {
 	REGISTER_INTERFACE_FUNC(global_get_singleton);
 	REGISTER_INTERFACE_FUNC(global_get_singleton);
 	REGISTER_INTERFACE_FUNC(object_get_instance_binding);
 	REGISTER_INTERFACE_FUNC(object_get_instance_binding);
 	REGISTER_INTERFACE_FUNC(object_set_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_set_instance);
 	REGISTER_INTERFACE_FUNC(object_get_class_name);
 	REGISTER_INTERFACE_FUNC(object_get_class_name);
 	REGISTER_INTERFACE_FUNC(object_cast_to);
 	REGISTER_INTERFACE_FUNC(object_cast_to);

+ 11 - 0
core/extension/gdextension_interface.h

@@ -2191,6 +2191,17 @@ typedef void *(*GDExtensionInterfaceObjectGetInstanceBinding)(GDExtensionObjectP
  */
  */
 typedef void (*GDExtensionInterfaceObjectSetInstanceBinding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
 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
  * @name object_set_instance
  * @since 4.1
  * @since 4.1

+ 1 - 1
core/object/object.cpp

@@ -1871,7 +1871,6 @@ bool Object::has_instance_binding(void *p_token) {
 	return found;
 	return found;
 }
 }
 
 
-#ifdef TOOLS_ENABLED
 void Object::free_instance_binding(void *p_token) {
 void Object::free_instance_binding(void *p_token) {
 	bool found = false;
 	bool found = false;
 	_instance_binding_mutex.lock();
 	_instance_binding_mutex.lock();
@@ -1896,6 +1895,7 @@ void Object::free_instance_binding(void *p_token) {
 	_instance_binding_mutex.unlock();
 	_instance_binding_mutex.unlock();
 }
 }
 
 
+#ifdef TOOLS_ENABLED
 void Object::clear_internal_extension() {
 void Object::clear_internal_extension() {
 	ERR_FAIL_NULL(_extension);
 	ERR_FAIL_NULL(_extension);
 
 

+ 1 - 1
core/object/object.h

@@ -970,9 +970,9 @@ public:
 	// Used on creation by binding only.
 	// Used on creation by binding only.
 	void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
 	void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
 	bool has_instance_binding(void *p_token);
 	bool has_instance_binding(void *p_token);
+	void free_instance_binding(void *p_token);
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	void free_instance_binding(void *p_token);
 	void clear_internal_extension();
 	void clear_internal_extension();
 	void reset_internal_extension(ObjectGDExtension *p_extension);
 	void reset_internal_extension(ObjectGDExtension *p_extension);
 #endif
 #endif