Browse Source

Merge pull request #940 from touilleMan/fix-get_property_list-stringname-lifetime

Fix lifetime of StringName objects returned by Wrapped::_get_property_list
Rémi Verschelde 2 years ago
parent
commit
4c5cfe3876
1 changed files with 207 additions and 206 deletions
  1. 207 206
      include/godot_cpp/classes/wrapped.hpp

+ 207 - 206
include/godot_cpp/classes/wrapped.hpp

@@ -69,6 +69,7 @@ protected:
 	static GDNativeBool property_get_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret) { return false; }
 	static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out) {}
 
+	::godot::List<::godot::PropertyInfo> plist_owned;
 	GDNativePropertyInfo *plist = nullptr;
 	uint32_t plist_size = 0;
 
@@ -93,212 +94,212 @@ public:
 
 } // namespace godot
 
-#define GDCLASS(m_class, m_inherits)                                                                                                                     \
-private:                                                                                                                                                 \
-	void operator=(const m_class &p_rval) {}                                                                                                             \
-	friend class ::godot::ClassDB;                                                                                                                       \
-                                                                                                                                                         \
-protected:                                                                                                                                               \
-	virtual const ::godot::StringName *_get_extension_class_name() const override {                                                                      \
-		static ::godot::StringName string_name = get_class_static();                                                                                     \
-		return &string_name;                                                                                                                             \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	virtual const GDNativeInstanceBindingCallbacks *_get_bindings_callbacks() const override {                                                           \
-		return &___binding_callbacks;                                                                                                                    \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void (*_get_bind_methods())() {                                                                                                               \
-		return &m_class::_bind_methods;                                                                                                                  \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void (::godot::Wrapped::*_get_notification())(int) {                                                                                          \
-		return (void(::godot::Wrapped::*)(int)) & m_class::_notification;                                                                                \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static bool (::godot::Wrapped::*_get_set())(const ::godot::StringName &p_name, const ::godot::Variant &p_property) {                                 \
-		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name, const ::godot::Variant &p_property)) & m_class::_set;                       \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static bool (::godot::Wrapped::*_get_get())(const ::godot::StringName &p_name, ::godot::Variant &r_ret) const {                                      \
-		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name, ::godot::Variant &r_ret) const) & m_class::_get;                            \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void (::godot::Wrapped::*_get_get_property_list())(::godot::List<::godot::PropertyInfo> * p_list) const {                                     \
-		return (void(::godot::Wrapped::*)(::godot::List<::godot::PropertyInfo> * p_list) const) & m_class::_get_property_list;                           \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static bool (::godot::Wrapped::*_get_property_can_revert())(const ::godot::StringName &p_name) {                                                     \
-		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name)) & m_class::_property_can_revert;                                           \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static bool (::godot::Wrapped::*_get_property_get_revert())(const ::godot::StringName &p_name, ::godot::Variant &) {                                 \
-		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name, ::godot::Variant &)) & m_class::_property_get_revert;                       \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static ::godot::String (::godot::Wrapped::*_get_to_string())() {                                                                                     \
-		return (::godot::String(::godot::Wrapped::*)()) & m_class::_to_string;                                                                           \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	template <class T, class B>                                                                                                                          \
-	static void register_virtuals() {                                                                                                                    \
-		m_inherits::register_virtuals<T, B>();                                                                                                           \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-public:                                                                                                                                                  \
-	static void initialize_class() {                                                                                                                     \
-		static bool initialized = false;                                                                                                                 \
-		if (initialized) {                                                                                                                               \
-			return;                                                                                                                                      \
-		}                                                                                                                                                \
-		m_inherits::initialize_class();                                                                                                                  \
-		if (m_class::_get_bind_methods() != m_inherits::_get_bind_methods()) {                                                                           \
-			_bind_methods();                                                                                                                             \
-			m_inherits::register_virtuals<m_class, m_inherits>();                                                                                        \
-		}                                                                                                                                                \
-		initialized = true;                                                                                                                              \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static ::godot::StringName &get_class_static() {                                                                                                     \
-		static ::godot::StringName string_name = ::godot::StringName(#m_class);                                                                          \
-		return string_name;                                                                                                                              \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static ::godot::StringName &get_parent_class_static() {                                                                                              \
-		return m_inherits::get_class_static();                                                                                                           \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static GDNativeObjectPtr create(void *data) {                                                                                                        \
-		m_class *new_object = memnew(m_class);                                                                                                           \
-		return new_object->_owner;                                                                                                                       \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void notification_bind(GDExtensionClassInstancePtr p_instance, int32_t p_what) {                                                              \
-		if (p_instance && m_class::_get_notification()) {                                                                                                \
-			if (m_class::_get_notification() != m_inherits::_get_notification()) {                                                                       \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				return cls->_notification(p_what);                                                                                                       \
-			}                                                                                                                                            \
-			m_inherits::notification_bind(p_instance, p_what);                                                                                           \
-		}                                                                                                                                                \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static GDNativeBool set_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, const GDNativeVariantPtr p_value) {         \
-		if (p_instance && m_class::_get_set()) {                                                                                                         \
-			if (m_class::_get_set() != m_inherits::_get_set()) {                                                                                         \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				return cls->_set(*reinterpret_cast<const ::godot::StringName *>(p_name), *reinterpret_cast<const ::godot::Variant *>(p_value));          \
-			}                                                                                                                                            \
-			return m_inherits::set_bind(p_instance, p_name, p_value);                                                                                    \
-		}                                                                                                                                                \
-		return false;                                                                                                                                    \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static GDNativeBool get_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret) {                 \
-		if (p_instance && m_class::_get_get()) {                                                                                                         \
-			if (m_class::_get_get() != m_inherits::_get_get()) {                                                                                         \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				return cls->_get(*reinterpret_cast<const ::godot::StringName *>(p_name), *reinterpret_cast<::godot::Variant *>(r_ret));                  \
-			}                                                                                                                                            \
-			return m_inherits::get_bind(p_instance, p_name, r_ret);                                                                                      \
-		}                                                                                                                                                \
-		return false;                                                                                                                                    \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static const GDNativePropertyInfo *get_property_list_bind(GDExtensionClassInstancePtr p_instance, uint32_t *r_count) {                               \
-		if (p_instance && m_class::_get_get_property_list()) {                                                                                           \
-			if (m_class::_get_get_property_list() != m_inherits::_get_get_property_list()) {                                                             \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				::godot::List<::godot::PropertyInfo> list;                                                                                               \
-				cls->_get_property_list(&list);                                                                                                          \
-				ERR_FAIL_COND_V_MSG(cls->plist != nullptr || cls->plist_size != 0, nullptr, "Internal error, property list was not freed by engine!");   \
-				cls->plist = reinterpret_cast<GDNativePropertyInfo *>(memalloc(sizeof(GDNativePropertyInfo) * list.size()));                             \
-				cls->plist_size = 0;                                                                                                                     \
-				for (const ::godot::PropertyInfo &E : list) {                                                                                            \
-					cls->plist[cls->plist_size].type = static_cast<GDNativeVariantType>(E.type);                                                         \
-					cls->plist[cls->plist_size].name = E.name._native_ptr();                                                                             \
-					cls->plist[cls->plist_size].hint = E.hint;                                                                                           \
-					cls->plist[cls->plist_size].hint_string = E.hint_string._native_ptr();                                                               \
-					cls->plist[cls->plist_size].class_name = E.class_name._native_ptr();                                                                 \
-					cls->plist[cls->plist_size].usage = E.usage;                                                                                         \
-					cls->plist_size++;                                                                                                                   \
-				}                                                                                                                                        \
-				if (r_count)                                                                                                                             \
-					*r_count = cls->plist_size;                                                                                                          \
-				return cls->plist;                                                                                                                       \
-			}                                                                                                                                            \
-			return m_inherits::get_property_list_bind(p_instance, r_count);                                                                              \
-		}                                                                                                                                                \
-		return nullptr;                                                                                                                                  \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void free_property_list_bind(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list) {                                    \
-		if (p_instance) {                                                                                                                                \
-			m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                      \
-			ERR_FAIL_COND_MSG(cls->plist == nullptr, "Internal error, property list double free!");                                                      \
-			memfree(cls->plist);                                                                                                                         \
-			cls->plist = nullptr;                                                                                                                        \
-			cls->plist_size = 0;                                                                                                                         \
-		}                                                                                                                                                \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static GDNativeBool property_can_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name) {                           \
-		if (p_instance && m_class::_get_property_can_revert()) {                                                                                         \
-			if (m_class::_get_property_can_revert() != m_inherits::_get_property_can_revert()) {                                                         \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				return cls->_property_can_revert(*reinterpret_cast<const ::godot::StringName *>(p_name));                                                \
-			}                                                                                                                                            \
-			return m_inherits::property_can_revert_bind(p_instance, p_name);                                                                             \
-		}                                                                                                                                                \
-		return false;                                                                                                                                    \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static GDNativeBool property_get_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret) { \
-		if (p_instance && m_class::_get_property_get_revert()) {                                                                                         \
-			if (m_class::_get_property_get_revert() != m_inherits::_get_property_get_revert()) {                                                         \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				return cls->_property_get_revert(*reinterpret_cast<const ::godot::StringName *>(p_name), *reinterpret_cast<::godot::Variant *>(r_ret));  \
-			}                                                                                                                                            \
-			return m_inherits::property_get_revert_bind(p_instance, p_name, r_ret);                                                                      \
-		}                                                                                                                                                \
-		return false;                                                                                                                                    \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out) {                              \
-		if (p_instance && m_class::_get_to_string()) {                                                                                                   \
-			if (m_class::_get_to_string() != m_inherits::_get_to_string()) {                                                                             \
-				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                  \
-				*reinterpret_cast<::godot::String *>(r_out) = cls->_to_string();                                                                         \
-				*r_is_valid = true;                                                                                                                      \
-				return;                                                                                                                                  \
-			}                                                                                                                                            \
-			m_inherits::to_string_bind(p_instance, r_is_valid, r_out);                                                                                   \
-		}                                                                                                                                                \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void free(void *data, GDExtensionClassInstancePtr ptr) {                                                                                      \
-		if (ptr) {                                                                                                                                       \
-			m_class *cls = reinterpret_cast<m_class *>(ptr);                                                                                             \
-			cls->~m_class();                                                                                                                             \
-			::godot::Memory::free_static(cls);                                                                                                           \
-		}                                                                                                                                                \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void *___binding_create_callback(void *p_token, void *p_instance) {                                                                           \
-		return nullptr;                                                                                                                                  \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static void ___binding_free_callback(void *p_token, void *p_instance, void *p_binding) {                                                             \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static GDNativeBool ___binding_reference_callback(void *p_token, void *p_instance, GDNativeBool p_reference) {                                       \
-		return true;                                                                                                                                     \
-	}                                                                                                                                                    \
-                                                                                                                                                         \
-	static constexpr GDNativeInstanceBindingCallbacks ___binding_callbacks = {                                                                           \
-		___binding_create_callback,                                                                                                                      \
-		___binding_free_callback,                                                                                                                        \
-		___binding_reference_callback,                                                                                                                   \
+#define GDCLASS(m_class, m_inherits)                                                                                                                                                   \
+private:                                                                                                                                                                               \
+	void operator=(const m_class &p_rval) {}                                                                                                                                           \
+	friend class ::godot::ClassDB;                                                                                                                                                     \
+                                                                                                                                                                                       \
+protected:                                                                                                                                                                             \
+	virtual const ::godot::StringName *_get_extension_class_name() const override {                                                                                                    \
+		static ::godot::StringName string_name = get_class_static();                                                                                                                   \
+		return &string_name;                                                                                                                                                           \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	virtual const GDNativeInstanceBindingCallbacks *_get_bindings_callbacks() const override {                                                                                         \
+		return &___binding_callbacks;                                                                                                                                                  \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void (*_get_bind_methods())() {                                                                                                                                             \
+		return &m_class::_bind_methods;                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void (::godot::Wrapped::*_get_notification())(int) {                                                                                                                        \
+		return (void(::godot::Wrapped::*)(int)) & m_class::_notification;                                                                                                              \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (::godot::Wrapped::*_get_set())(const ::godot::StringName &p_name, const ::godot::Variant &p_property) {                                                               \
+		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name, const ::godot::Variant &p_property)) & m_class::_set;                                                     \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (::godot::Wrapped::*_get_get())(const ::godot::StringName &p_name, ::godot::Variant &r_ret) const {                                                                    \
+		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name, ::godot::Variant &r_ret) const) & m_class::_get;                                                          \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void (::godot::Wrapped::*_get_get_property_list())(::godot::List<::godot::PropertyInfo> * p_list) const {                                                                   \
+		return (void(::godot::Wrapped::*)(::godot::List<::godot::PropertyInfo> * p_list) const) & m_class::_get_property_list;                                                         \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (::godot::Wrapped::*_get_property_can_revert())(const ::godot::StringName &p_name) {                                                                                   \
+		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name)) & m_class::_property_can_revert;                                                                         \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (::godot::Wrapped::*_get_property_get_revert())(const ::godot::StringName &p_name, ::godot::Variant &) {                                                               \
+		return (bool(::godot::Wrapped::*)(const ::godot::StringName &p_name, ::godot::Variant &)) & m_class::_property_get_revert;                                                     \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static ::godot::String (::godot::Wrapped::*_get_to_string())() {                                                                                                                   \
+		return (::godot::String(::godot::Wrapped::*)()) & m_class::_to_string;                                                                                                         \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	template <class T, class B>                                                                                                                                                        \
+	static void register_virtuals() {                                                                                                                                                  \
+		m_inherits::register_virtuals<T, B>();                                                                                                                                         \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+public:                                                                                                                                                                                \
+	static void initialize_class() {                                                                                                                                                   \
+		static bool initialized = false;                                                                                                                                               \
+		if (initialized) {                                                                                                                                                             \
+			return;                                                                                                                                                                    \
+		}                                                                                                                                                                              \
+		m_inherits::initialize_class();                                                                                                                                                \
+		if (m_class::_get_bind_methods() != m_inherits::_get_bind_methods()) {                                                                                                         \
+			_bind_methods();                                                                                                                                                           \
+			m_inherits::register_virtuals<m_class, m_inherits>();                                                                                                                      \
+		}                                                                                                                                                                              \
+		initialized = true;                                                                                                                                                            \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static ::godot::StringName &get_class_static() {                                                                                                                                   \
+		static ::godot::StringName string_name = ::godot::StringName(#m_class);                                                                                                        \
+		return string_name;                                                                                                                                                            \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static ::godot::StringName &get_parent_class_static() {                                                                                                                            \
+		return m_inherits::get_class_static();                                                                                                                                         \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDNativeObjectPtr create(void *data) {                                                                                                                                      \
+		m_class *new_object = memnew(m_class);                                                                                                                                         \
+		return new_object->_owner;                                                                                                                                                     \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void notification_bind(GDExtensionClassInstancePtr p_instance, int32_t p_what) {                                                                                            \
+		if (p_instance && m_class::_get_notification()) {                                                                                                                              \
+			if (m_class::_get_notification() != m_inherits::_get_notification()) {                                                                                                     \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				return cls->_notification(p_what);                                                                                                                                     \
+			}                                                                                                                                                                          \
+			m_inherits::notification_bind(p_instance, p_what);                                                                                                                         \
+		}                                                                                                                                                                              \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDNativeBool set_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, const GDNativeVariantPtr p_value) {                                       \
+		if (p_instance && m_class::_get_set()) {                                                                                                                                       \
+			if (m_class::_get_set() != m_inherits::_get_set()) {                                                                                                                       \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				return cls->_set(*reinterpret_cast<const ::godot::StringName *>(p_name), *reinterpret_cast<const ::godot::Variant *>(p_value));                                        \
+			}                                                                                                                                                                          \
+			return m_inherits::set_bind(p_instance, p_name, p_value);                                                                                                                  \
+		}                                                                                                                                                                              \
+		return false;                                                                                                                                                                  \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDNativeBool get_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret) {                                               \
+		if (p_instance && m_class::_get_get()) {                                                                                                                                       \
+			if (m_class::_get_get() != m_inherits::_get_get()) {                                                                                                                       \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				return cls->_get(*reinterpret_cast<const ::godot::StringName *>(p_name), *reinterpret_cast<::godot::Variant *>(r_ret));                                                \
+			}                                                                                                                                                                          \
+			return m_inherits::get_bind(p_instance, p_name, r_ret);                                                                                                                    \
+		}                                                                                                                                                                              \
+		return false;                                                                                                                                                                  \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static const GDNativePropertyInfo *get_property_list_bind(GDExtensionClassInstancePtr p_instance, uint32_t *r_count) {                                                             \
+		if (p_instance && m_class::_get_get_property_list()) {                                                                                                                         \
+			if (m_class::_get_get_property_list() != m_inherits::_get_get_property_list()) {                                                                                           \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				ERR_FAIL_COND_V_MSG(!cls->plist_owned.is_empty() || cls->plist != nullptr || cls->plist_size != 0, nullptr, "Internal error, property list was not freed by engine!"); \
+				cls->_get_property_list(&cls->plist_owned);                                                                                                                            \
+				cls->plist = reinterpret_cast<GDNativePropertyInfo *>(memalloc(sizeof(GDNativePropertyInfo) * cls->plist_owned.size()));                                               \
+				cls->plist_size = 0;                                                                                                                                                   \
+				for (const ::godot::PropertyInfo &E : cls->plist_owned) {                                                                                                              \
+					cls->plist[cls->plist_size].type = static_cast<GDNativeVariantType>(E.type);                                                                                       \
+					cls->plist[cls->plist_size].name = E.name._native_ptr();                                                                                                           \
+					cls->plist[cls->plist_size].hint = E.hint;                                                                                                                         \
+					cls->plist[cls->plist_size].hint_string = E.hint_string._native_ptr();                                                                                             \
+					cls->plist[cls->plist_size].class_name = E.class_name._native_ptr();                                                                                               \
+					cls->plist[cls->plist_size].usage = E.usage;                                                                                                                       \
+					cls->plist_size++;                                                                                                                                                 \
+				}                                                                                                                                                                      \
+				if (r_count)                                                                                                                                                           \
+					*r_count = cls->plist_size;                                                                                                                                        \
+				return cls->plist;                                                                                                                                                     \
+			}                                                                                                                                                                          \
+			return m_inherits::get_property_list_bind(p_instance, r_count);                                                                                                            \
+		}                                                                                                                                                                              \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void free_property_list_bind(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list) {                                                                  \
+		if (p_instance) {                                                                                                                                                              \
+			m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                    \
+			ERR_FAIL_COND_MSG(cls->plist == nullptr, "Internal error, property list double free!");                                                                                    \
+			memfree(cls->plist);                                                                                                                                                       \
+			cls->plist = nullptr;                                                                                                                                                      \
+			cls->plist_size = 0;                                                                                                                                                       \
+			cls->plist_owned.clear();                                                                                                                                                  \
+		}                                                                                                                                                                              \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDNativeBool property_can_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name) {                                                         \
+		if (p_instance && m_class::_get_property_can_revert()) {                                                                                                                       \
+			if (m_class::_get_property_can_revert() != m_inherits::_get_property_can_revert()) {                                                                                       \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				return cls->_property_can_revert(*reinterpret_cast<const ::godot::StringName *>(p_name));                                                                              \
+			}                                                                                                                                                                          \
+			return m_inherits::property_can_revert_bind(p_instance, p_name);                                                                                                           \
+		}                                                                                                                                                                              \
+		return false;                                                                                                                                                                  \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDNativeBool property_get_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret) {                               \
+		if (p_instance && m_class::_get_property_get_revert()) {                                                                                                                       \
+			if (m_class::_get_property_get_revert() != m_inherits::_get_property_get_revert()) {                                                                                       \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				return cls->_property_get_revert(*reinterpret_cast<const ::godot::StringName *>(p_name), *reinterpret_cast<::godot::Variant *>(r_ret));                                \
+			}                                                                                                                                                                          \
+			return m_inherits::property_get_revert_bind(p_instance, p_name, r_ret);                                                                                                    \
+		}                                                                                                                                                                              \
+		return false;                                                                                                                                                                  \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out) {                                                            \
+		if (p_instance && m_class::_get_to_string()) {                                                                                                                                 \
+			if (m_class::_get_to_string() != m_inherits::_get_to_string()) {                                                                                                           \
+				m_class *cls = reinterpret_cast<m_class *>(p_instance);                                                                                                                \
+				*reinterpret_cast<::godot::String *>(r_out) = cls->_to_string();                                                                                                       \
+				*r_is_valid = true;                                                                                                                                                    \
+				return;                                                                                                                                                                \
+			}                                                                                                                                                                          \
+			m_inherits::to_string_bind(p_instance, r_is_valid, r_out);                                                                                                                 \
+		}                                                                                                                                                                              \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void free(void *data, GDExtensionClassInstancePtr ptr) {                                                                                                                    \
+		if (ptr) {                                                                                                                                                                     \
+			m_class *cls = reinterpret_cast<m_class *>(ptr);                                                                                                                           \
+			cls->~m_class();                                                                                                                                                           \
+			::godot::Memory::free_static(cls);                                                                                                                                         \
+		}                                                                                                                                                                              \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void *___binding_create_callback(void *p_token, void *p_instance) {                                                                                                         \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void ___binding_free_callback(void *p_token, void *p_instance, void *p_binding) {                                                                                           \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDNativeBool ___binding_reference_callback(void *p_token, void *p_instance, GDNativeBool p_reference) {                                                                     \
+		return true;                                                                                                                                                                   \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static constexpr GDNativeInstanceBindingCallbacks ___binding_callbacks = {                                                                                                         \
+		___binding_create_callback,                                                                                                                                                    \
+		___binding_free_callback,                                                                                                                                                      \
+		___binding_reference_callback,                                                                                                                                                 \
 	};
 
 // Don't use this for your classes, use GDCLASS() instead.