From 92d9227d4a4be234a44110d9d1e6c893add78f91 Mon Sep 17 00:00:00 2001 From: David Snopek Date: Mon, 4 Aug 2025 12:44:48 -0500 Subject: [PATCH] GDExtension: Call startup callback only after reload is fully finished --- core/extension/gdextension_manager.cpp | 12 ++++++++++-- core/extension/gdextension_manager.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/extension/gdextension_manager.cpp b/core/extension/gdextension_manager.cpp index 197b48330340..a8b22997288b 100644 --- a/core/extension/gdextension_manager.cpp +++ b/core/extension/gdextension_manager.cpp @@ -55,6 +55,10 @@ GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(cons gdextension_class_icon_paths[kv.key] = kv.value; } + return LOAD_STATUS_OK; +} + +void GDExtensionManager::_finish_load_extension(const Ref &p_extension) { #ifdef TOOLS_ENABLED // Signals that a new extension is loaded so GDScript can register new class names. emit_signal("extension_loaded", p_extension); @@ -67,8 +71,6 @@ GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(cons p_extension->startup_callback(); } } - - return LOAD_STATUS_OK; } GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(const Ref &p_extension) { @@ -134,6 +136,8 @@ GDExtensionManager::LoadStatus GDExtensionManager::load_extension_with_loader(co return status; } + _finish_load_extension(extension); + extension->set_path(p_path); gdextension_map[p_path] = extension; return LOAD_STATUS_OK; @@ -186,6 +190,10 @@ GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String 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; #endif } diff --git a/core/extension/gdextension_manager.h b/core/extension/gdextension_manager.h index c9538451bbd3..93d9130a919e 100644 --- a/core/extension/gdextension_manager.h +++ b/core/extension/gdextension_manager.h @@ -57,6 +57,7 @@ class GDExtensionManager : public Object { private: LoadStatus _load_extension_internal(const Ref &p_extension, bool p_first_load); + void _finish_load_extension(const Ref &p_extension); LoadStatus _unload_extension_internal(const Ref &p_extension); #ifdef TOOLS_ENABLED