From 788edc6bfe3e66e544333d0a9448219da923cae1 Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Wed, 26 Nov 2025 11:02:18 +0100 Subject: [PATCH] Make ClassDB::classes pointer-stable again by changing it to HashMap (from AHashMap). --- include/godot_cpp/core/class_db.hpp | 6 +++--- src/core/class_db.cpp | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index b14f597a2..96025b903 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -96,7 +96,7 @@ class ClassDB { private: // This may only contain custom classes, not Godot classes - static AHashMap classes; + static HashMap classes; static AHashMap instance_binding_callbacks; // Used to remember the custom class registration order. static LocalVector class_register_order; @@ -233,7 +233,7 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed, bool p_runtime) { cl.name = T::get_class_static(); cl.parent_name = T::get_parent_class_static(); cl.level = current_level; - AHashMap::Iterator parent_it = classes.find(cl.parent_name); + HashMap::Iterator parent_it = classes.find(cl.parent_name); if (parent_it != classes.end()) { // Assign parent if it is also a custom class cl.parent_ptr = &parent_it->value; @@ -330,7 +330,7 @@ MethodBind *ClassDB::bind_vararg_method(uint32_t p_flags, StringName p_name, M p StringName instance_type = bind->get_instance_class(); - AHashMap::Iterator type_it = classes.find(instance_type); + HashMap::Iterator type_it = classes.find(instance_type); if (type_it == classes.end()) { memdelete(bind); ERR_FAIL_V_MSG(nullptr, String("Class '{0}' doesn't exist.").format(Array::make(instance_type))); diff --git a/src/core/class_db.cpp b/src/core/class_db.cpp index 11f7b0778..b03e9f477 100644 --- a/src/core/class_db.cpp +++ b/src/core/class_db.cpp @@ -38,7 +38,7 @@ namespace godot { -AHashMap ClassDB::classes; +HashMap ClassDB::classes; AHashMap ClassDB::instance_binding_callbacks; LocalVector ClassDB::class_register_order; AHashMap ClassDB::engine_singletons; @@ -128,7 +128,7 @@ MethodBind *ClassDB::get_method(const StringName &p_class, const StringName &p_m MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const MethodDefinition &method_name, const void **p_defs, int p_defcount) { StringName instance_type = p_bind->get_instance_class(); - AHashMap::Iterator type_it = classes.find(instance_type); + HashMap::Iterator type_it = classes.find(instance_type); if (type_it == classes.end()) { memdelete(p_bind); ERR_FAIL_V_MSG(nullptr, String("Class '{0}' doesn't exist.").format(Array::make(instance_type))); @@ -233,7 +233,7 @@ void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_me } void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal) { - AHashMap::Iterator type_it = classes.find(p_class); + HashMap::Iterator type_it = classes.find(p_class); ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class))); @@ -268,7 +268,7 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal) } void ClassDB::bind_integer_constant(const StringName &p_class_name, const StringName &p_enum_name, const StringName &p_constant_name, GDExtensionInt p_constant_value, bool p_is_bitfield) { - AHashMap::Iterator type_it = classes.find(p_class_name); + HashMap::Iterator type_it = classes.find(p_class_name); ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class_name))); @@ -290,7 +290,7 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens const StringName *class_name = reinterpret_cast(p_userdata); const StringName *name = reinterpret_cast(p_name); - AHashMap::Iterator type_it = classes.find(*class_name); + HashMap::Iterator type_it = classes.find(*class_name); ERR_FAIL_COND_V_MSG(type_it == classes.end(), nullptr, String("Class '{0}' doesn't exist.").format(Array::make(*class_name))); const ClassInfo *type = &type_it->value; @@ -327,7 +327,7 @@ const GDExtensionInstanceBindingCallbacks *ClassDB::get_instance_binding_callbac } void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p_method, GDExtensionClassCallVirtual p_call, uint32_t p_hash) { - AHashMap::Iterator type_it = classes.find(p_class); + HashMap::Iterator type_it = classes.find(p_class); ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class))); ClassInfo &type = type_it->value; @@ -342,7 +342,7 @@ void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p } void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_method, const Vector &p_arg_names) { - AHashMap::Iterator type_it = classes.find(p_class); + HashMap::Iterator type_it = classes.find(p_class); ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class))); GDExtensionClassVirtualMethodInfo mi;