Browse Source

GDExtension: Call startup callback only after reload is fully finished

David Snopek 3 weeks ago
parent
commit
92d9227d4a
2 changed files with 11 additions and 2 deletions
  1. 10 2
      core/extension/gdextension_manager.cpp
  2. 1 0
      core/extension/gdextension_manager.h

+ 10 - 2
core/extension/gdextension_manager.cpp

@@ -55,6 +55,10 @@ GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(cons
 		gdextension_class_icon_paths[kv.key] = kv.value;
 		gdextension_class_icon_paths[kv.key] = kv.value;
 	}
 	}
 
 
+	return LOAD_STATUS_OK;
+}
+
+void GDExtensionManager::_finish_load_extension(const Ref<GDExtension> &p_extension) {
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	// Signals that a new extension is loaded so GDScript can register new class names.
 	// Signals that a new extension is loaded so GDScript can register new class names.
 	emit_signal("extension_loaded", p_extension);
 	emit_signal("extension_loaded", p_extension);
@@ -67,8 +71,6 @@ GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(cons
 			p_extension->startup_callback();
 			p_extension->startup_callback();
 		}
 		}
 	}
 	}
-
-	return LOAD_STATUS_OK;
 }
 }
 
 
 GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(const Ref<GDExtension> &p_extension) {
 GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(const Ref<GDExtension> &p_extension) {
@@ -134,6 +136,8 @@ GDExtensionManager::LoadStatus GDExtensionManager::load_extension_with_loader(co
 		return status;
 		return status;
 	}
 	}
 
 
+	_finish_load_extension(extension);
+
 	extension->set_path(p_path);
 	extension->set_path(p_path);
 	gdextension_map[p_path] = extension;
 	gdextension_map[p_path] = extension;
 	return LOAD_STATUS_OK;
 	return LOAD_STATUS_OK;
@@ -186,6 +190,10 @@ GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String
 
 
 	extension->finish_reload();
 	extension->finish_reload();
 
 
+	// Needs to come after reload is fully finished, so all objects using
+	// extension classes are in a consistent state.
+	_finish_load_extension(extension);
+
 	return LOAD_STATUS_OK;
 	return LOAD_STATUS_OK;
 #endif
 #endif
 }
 }

+ 1 - 0
core/extension/gdextension_manager.h

@@ -57,6 +57,7 @@ public:
 
 
 private:
 private:
 	LoadStatus _load_extension_internal(const Ref<GDExtension> &p_extension, bool p_first_load);
 	LoadStatus _load_extension_internal(const Ref<GDExtension> &p_extension, bool p_first_load);
+	void _finish_load_extension(const Ref<GDExtension> &p_extension);
 	LoadStatus _unload_extension_internal(const Ref<GDExtension> &p_extension);
 	LoadStatus _unload_extension_internal(const Ref<GDExtension> &p_extension);
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED