diff options
author | David Snopek <dsnopek@gmail.com> | 2023-10-22 10:07:41 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-22 10:07:41 -0500 |
commit | c82f2a37143c6e32a95a996e91c4387acf3f33b4 (patch) | |
tree | 9f16c58fd0ad17aca36f1a3de20c3b3f023e50d3 | |
parent | edb52293d9a407161a17be875a3539a724551057 (diff) | |
parent | a61cdc88606fbd0230555f1657d0cd635ba4bb5b (diff) | |
download | redot-cpp-c82f2a37143c6e32a95a996e91c4387acf3f33b4.tar.gz |
Merge pull request #1279 from dsnopek/gdclass-protections
Add protections against registering classes that didn't use `GDCLASS()`
-rw-r--r-- | include/godot_cpp/classes/wrapped.hpp | 19 | ||||
-rw-r--r-- | include/godot_cpp/core/class_db.hpp | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/include/godot_cpp/classes/wrapped.hpp b/include/godot_cpp/classes/wrapped.hpp index 2bbffc0..af2ce4c 100644 --- a/include/godot_cpp/classes/wrapped.hpp +++ b/include/godot_cpp/classes/wrapped.hpp @@ -202,6 +202,8 @@ protected: } \ \ public: \ + typedef m_class self_type; \ + \ static void initialize_class() { \ static bool initialized = false; \ if (initialized) { \ @@ -395,6 +397,10 @@ protected: return nullptr; \ } \ \ + static inline bool has_get_property_list() { \ + return false; \ + } \ + \ static void (Wrapped::*_get_get_property_list())(List<PropertyInfo> * p_list) const { \ return nullptr; \ } \ @@ -416,6 +422,8 @@ protected: } \ \ public: \ + typedef m_class self_type; \ + \ static void initialize_class() {} \ \ static ::godot::StringName &get_class_static() { \ @@ -427,6 +435,17 @@ public: return m_inherits::get_class_static(); \ } \ \ + static GDExtensionObjectPtr create(void *data) { \ + return nullptr; \ + } \ + \ + static GDExtensionClassInstancePtr recreate(void *data, GDExtensionObjectPtr obj) { \ + return nullptr; \ + } \ + \ + static void free(void *data, GDExtensionClassInstancePtr ptr) { \ + } \ + \ static void *_gde_binding_create_callback(void *p_token, void *p_instance) { \ /* Do not call memnew here, we don't want the post-initializer to be called */ \ return new ("") m_class((GodotObject *)p_instance); \ diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index 17e093a..4196a76 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -170,6 +170,7 @@ public: template <class T, bool is_abstract> void ClassDB::_register_class(bool p_virtual, bool p_exposed) { + static_assert(TypesAreSame<typename T::self_type, T>::value, "Class not declared properly, please use GDCLASS."); instance_binding_callbacks[T::get_class_static()] = &T::_gde_binding_callbacks; // Register this class within our plugin |