From 9fd98410dfa0878a949052c6ba9eee386a8796df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Sat, 2 Aug 2025 18:29:00 +0300 Subject: [PATCH] Automatically unregister loggers when script language is deinitialized. --- core/core_bind.cpp | 21 +++++++++++++++++++++ core/core_bind.h | 1 + core/object/script_language.cpp | 4 ++++ 3 files changed, 26 insertions(+) diff --git a/core/core_bind.cpp b/core/core_bind.cpp index e1f939e3844..f58556468ac 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -718,6 +718,27 @@ void OS::remove_logger(const Ref &p_logger) { logger_bind->loggers.erase(p_logger); } +void OS::remove_script_loggers(const ScriptLanguage *p_script) { + if (logger_bind) { + LocalVector> to_remove; + for (const Ref &logger : logger_bind->loggers) { + if (logger.is_null()) { + continue; + } + ScriptInstance *si = logger->get_script_instance(); + if (!si) { + continue; + } + if (si->get_language() == p_script) { + to_remove.push_back(logger); + } + } + for (const Ref &logger : to_remove) { + logger_bind->loggers.erase(logger); + } + } +} + void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("get_entropy", "size"), &OS::get_entropy); ClassDB::bind_method(D_METHOD("get_system_ca_certificates"), &OS::get_system_ca_certificates); diff --git a/core/core_bind.h b/core/core_bind.h index fa6fe881729..ee4054fd7c0 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -311,6 +311,7 @@ public: void add_logger(const Ref &p_logger); void remove_logger(const Ref &p_logger); + void remove_script_loggers(const ScriptLanguage *p_script); static OS *get_singleton() { return singleton; } diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp index 5ed5d42bd57..eeb7229a014 100644 --- a/core/object/script_language.cpp +++ b/core/object/script_language.cpp @@ -31,6 +31,7 @@ #include "script_language.h" #include "core/config/project_settings.h" +#include "core/core_bind.h" #include "core/debugger/engine_debugger.h" #include "core/debugger/script_debugger.h" #include "core/io/resource_loader.h" @@ -330,6 +331,9 @@ void ScriptServer::finish_languages() { } for (ScriptLanguage *E : langs_to_finish) { + if (CoreBind::OS::get_singleton()) { + CoreBind::OS::get_singleton()->remove_script_loggers(E); // Unregister loggers using this script language. + } E->finish(); }