summaryrefslogtreecommitdiff
path: root/modules/gdnative
diff options
context:
space:
mode:
authorBastiaan Olij <mux213@gmail.com>2021-04-06 11:55:15 +1000
committerBastiaan Olij <mux213@gmail.com>2021-04-06 11:55:15 +1000
commit81131bd844e16847e3e8b41f33b9627e8d32d419 (patch)
treea0384f254ff53121609cbed24a6076f75de33585 /modules/gdnative
parentf4b82814f89d992bc0119245590737ae361a0358 (diff)
Only cleanup meta data if GDNative library is reloadable and we're about to unload it
Diffstat (limited to 'modules/gdnative')
-rw-r--r--modules/gdnative/nativescript/nativescript.cpp60
1 files changed, 32 insertions, 28 deletions
diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp
index 2a3202c0b8..f795bef59f 100644
--- a/modules/gdnative/nativescript/nativescript.cpp
+++ b/modules/gdnative/nativescript/nativescript.cpp
@@ -1727,44 +1727,48 @@ void NativeScriptLanguage::unregister_script(NativeScript *script) {
if (S->get().size() == 0) {
library_script_users.erase(S);
- Map<String, Map<StringName, NativeScriptDesc>>::Element *L = library_classes.find(script->lib_path);
- if (L) {
- Map<StringName, NativeScriptDesc> classes = L->get();
-
- for (Map<StringName, NativeScriptDesc>::Element *C = classes.front(); C; C = C->next()) {
- // free property stuff first
- for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element P = C->get().properties.front(); P; P = P.next()) {
- if (P.get().getter.free_func) {
- P.get().getter.free_func(P.get().getter.method_data);
+ Map<String, Ref<GDNative>>::Element *G = library_gdnatives.find(script->lib_path);
+ if (G && G->get()->get_library()->is_reloadable()) {
+ // ONLY if the library is marked as reloadable, and no more instances of its scripts exist do we unload the library
+
+ // First remove meta data related to the library
+ Map<String, Map<StringName, NativeScriptDesc>>::Element *L = library_classes.find(script->lib_path);
+ if (L) {
+ Map<StringName, NativeScriptDesc> classes = L->get();
+
+ for (Map<StringName, NativeScriptDesc>::Element *C = classes.front(); C; C = C->next()) {
+ // free property stuff first
+ for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element P = C->get().properties.front(); P; P = P.next()) {
+ if (P.get().getter.free_func) {
+ P.get().getter.free_func(P.get().getter.method_data);
+ }
+
+ if (P.get().setter.free_func) {
+ P.get().setter.free_func(P.get().setter.method_data);
+ }
}
- if (P.get().setter.free_func) {
- P.get().setter.free_func(P.get().setter.method_data);
+ // free method stuff
+ for (Map<StringName, NativeScriptDesc::Method>::Element *M = C->get().methods.front(); M; M = M->next()) {
+ if (M->get().method.free_func) {
+ M->get().method.free_func(M->get().method.method_data);
+ }
}
- }
- // free method stuff
- for (Map<StringName, NativeScriptDesc::Method>::Element *M = C->get().methods.front(); M; M = M->next()) {
- if (M->get().method.free_func) {
- M->get().method.free_func(M->get().method.method_data);
+ // free constructor/destructor
+ if (C->get().create_func.free_func) {
+ C->get().create_func.free_func(C->get().create_func.method_data);
}
- }
- // free constructor/destructor
- if (C->get().create_func.free_func) {
- C->get().create_func.free_func(C->get().create_func.method_data);
+ if (C->get().destroy_func.free_func) {
+ C->get().destroy_func.free_func(C->get().destroy_func.method_data);
+ }
}
- if (C->get().destroy_func.free_func) {
- C->get().destroy_func.free_func(C->get().destroy_func.method_data);
- }
+ library_classes.erase(script->lib_path);
}
- library_classes.erase(script->lib_path);
- }
-
- Map<String, Ref<GDNative>>::Element *G = library_gdnatives.find(script->lib_path);
- if (G && G->get()->get_library()->is_reloadable()) {
+ // now unload the library
G->get()->terminate();
library_gdnatives.erase(G);
}