From bf5907b724f132d611bc4b0260a5271a1a2f73a5 Mon Sep 17 00:00:00 2001 From: Gergely Kis Date: Tue, 23 Jul 2024 01:53:02 +0200 Subject: [PATCH] StringName: Use inline static field definitions Before this change StringName used regular static field definitions for its mutex, _table, configured and debug_stringname fields. Since in the general case the ordering of the static variable and field initialization and destruction is undefined, it was possible that the destruction of StringName's static fields happened prior to the destruction of statically allocated StringName instances. By changing the static field definitions to inline in string_name.h, the C++17 standard guarantees the correct initialization and destruction ordering. (cherry picked from commit 723878bbabfa7f47049e29b1c46c92358517d8d1) --- core/string/string_name.cpp | 9 --------- core/string/string_name.h | 8 ++++---- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/core/string/string_name.cpp b/core/string/string_name.cpp index 658297d805f..5d59d65f92f 100644 --- a/core/string/string_name.cpp +++ b/core/string/string_name.cpp @@ -39,19 +39,10 @@ StaticCString StaticCString::create(const char *p_ptr) { return scs; } -StringName::_Data *StringName::_table[STRING_TABLE_LEN]; - StringName _scs_create(const char *p_chr, bool p_static) { return (p_chr[0] ? StringName(StaticCString::create(p_chr), p_static) : StringName()); } -bool StringName::configured = false; -Mutex StringName::mutex; - -#ifdef DEBUG_ENABLED -bool StringName::debug_stringname = false; -#endif - void StringName::setup() { ERR_FAIL_COND(configured); for (int i = 0; i < STRING_TABLE_LEN; i++) { diff --git a/core/string/string_name.h b/core/string/string_name.h index 89b4c07e0e8..0eb98cf64b5 100644 --- a/core/string/string_name.h +++ b/core/string/string_name.h @@ -67,7 +67,7 @@ class StringName { _Data() {} }; - static _Data *_table[STRING_TABLE_LEN]; + static inline _Data *_table[STRING_TABLE_LEN]; _Data *_data = nullptr; @@ -75,10 +75,10 @@ class StringName { friend void register_core_types(); friend void unregister_core_types(); friend class Main; - static Mutex mutex; + static inline Mutex mutex; static void setup(); static void cleanup(); - static bool configured; + static inline bool configured = false; #ifdef DEBUG_ENABLED struct DebugSortReferences { bool operator()(const _Data *p_left, const _Data *p_right) const { @@ -86,7 +86,7 @@ class StringName { } }; - static bool debug_stringname; + static inline bool debug_stringname = false; #endif StringName(_Data *p_data) { _data = p_data; }