summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2023-06-20 08:24:56 -0500
committerGitHub <noreply@github.com>2023-06-20 08:24:56 -0500
commit2377f7ec7505645a328bec6ec91bf17aa4e471c3 (patch)
treed272f92b105b20f01b7149b757d24ede7b3c9b3d
parent82edc89cfa502f1fc7598a1f11e623f49511f98e (diff)
parent20be441026ce3e294bef110279233a8168d219c9 (diff)
downloadredot-cpp-2377f7ec7505645a328bec6ec91bf17aa4e471c3.tar.gz
Merge pull request #1047 from Kehom/master
Unregister custom classes in reverse registration order
-rw-r--r--include/godot_cpp/core/class_db.hpp3
-rw-r--r--src/core/class_db.cpp9
2 files changed, 9 insertions, 3 deletions
diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp
index 425d5a2..b1625bf 100644
--- a/include/godot_cpp/core/class_db.hpp
+++ b/include/godot_cpp/core/class_db.hpp
@@ -105,6 +105,8 @@ private:
// This may only contain custom classes, not Godot classes
static std::unordered_map<StringName, ClassInfo> classes;
static std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *> instance_binding_callbacks;
+ // Used to remember the custom class registration order.
+ static std::vector<StringName> class_register_order;
static MethodBind *bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const MethodDefinition &method_name, const void **p_defs, int p_defcount);
static void initialize_class(const ClassInfo &cl);
@@ -178,6 +180,7 @@ void ClassDB::_register_class(bool p_virtual) {
cl.parent_ptr = &parent_it->second;
}
classes[cl.name] = cl;
+ class_register_order.push_back(cl.name);
// Register this class with Godot
GDExtensionClassCreationInfo class_info = {
diff --git a/src/core/class_db.cpp b/src/core/class_db.cpp
index 551cb89..e8bb40c 100644
--- a/src/core/class_db.cpp
+++ b/src/core/class_db.cpp
@@ -41,6 +41,7 @@ namespace godot {
std::unordered_map<StringName, ClassDB::ClassInfo> ClassDB::classes;
std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *> ClassDB::instance_binding_callbacks;
+std::vector<StringName> ClassDB::class_register_order;
GDExtensionInitializationLevel ClassDB::current_level = GDEXTENSION_INITIALIZATION_CORE;
MethodDefinition D_METHOD(StringName p_name) {
@@ -348,13 +349,15 @@ void ClassDB::initialize(GDExtensionInitializationLevel p_level) {
}
void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
- for (const std::pair<StringName, ClassInfo> pair : classes) {
- const ClassInfo &cl = pair.second;
+ for (std::vector<StringName>::reverse_iterator i = class_register_order.rbegin(); i != class_register_order.rend(); ++i) {
+ const StringName &name = *i;
+ const ClassInfo &cl = classes[name];
+
if (cl.level != p_level) {
continue;
}
- internal::gdextension_interface_classdb_unregister_extension_class(internal::library, cl.name._native_ptr());
+ internal::gdextension_interface_classdb_unregister_extension_class(internal::library, name._native_ptr());
for (auto method : cl.method_map) {
memdelete(method.second);