diff options
author | David Snopek <dsnopek@gmail.com> | 2023-06-20 08:24:56 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-20 08:24:56 -0500 |
commit | 2377f7ec7505645a328bec6ec91bf17aa4e471c3 (patch) | |
tree | d272f92b105b20f01b7149b757d24ede7b3c9b3d /src | |
parent | 82edc89cfa502f1fc7598a1f11e623f49511f98e (diff) | |
parent | 20be441026ce3e294bef110279233a8168d219c9 (diff) | |
download | redot-cpp-2377f7ec7505645a328bec6ec91bf17aa4e471c3.tar.gz |
Merge pull request #1047 from Kehom/master
Unregister custom classes in reverse registration order
Diffstat (limited to 'src')
-rw-r--r-- | src/core/class_db.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
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); |