You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-13 13:31:48 +00:00
Fix StringName leaks in GDExtension, core, and editor themes
This commit is contained in:
@@ -794,6 +794,8 @@ void register_global_constants() {
|
|||||||
|
|
||||||
void unregister_global_constants() {
|
void unregister_global_constants() {
|
||||||
_global_constants.clear();
|
_global_constants.clear();
|
||||||
|
_global_constants_map.clear();
|
||||||
|
_global_enums.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
int CoreConstants::get_global_constant_count() {
|
int CoreConstants::get_global_constant_count() {
|
||||||
|
|||||||
@@ -664,7 +664,7 @@ void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExte
|
|||||||
memnew_placement(r_path, String(self->library_path));
|
memnew_placement(r_path, String(self->library_path));
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap<StringName, GDExtensionInterfaceFunctionPtr> gdextension_interface_functions;
|
HashMap<StringName, GDExtensionInterfaceFunctionPtr> GDExtension::gdextension_interface_functions;
|
||||||
|
|
||||||
void GDExtension::register_interface_function(StringName p_function_name, GDExtensionInterfaceFunctionPtr p_function_pointer) {
|
void GDExtension::register_interface_function(StringName p_function_name, GDExtensionInterfaceFunctionPtr p_function_pointer) {
|
||||||
ERR_FAIL_COND_MSG(gdextension_interface_functions.has(p_function_name), "Attempt to register interface function '" + p_function_name + "', which appears to be already registered.");
|
ERR_FAIL_COND_MSG(gdextension_interface_functions.has(p_function_name), "Attempt to register interface function '" + p_function_name + "', which appears to be already registered.");
|
||||||
@@ -836,6 +836,10 @@ void GDExtension::initialize_gdextensions() {
|
|||||||
register_interface_function("get_library_path", (GDExtensionInterfaceFunctionPtr)&GDExtension::_get_library_path);
|
register_interface_function("get_library_path", (GDExtensionInterfaceFunctionPtr)&GDExtension::_get_library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GDExtension::finalize_gdextensions() {
|
||||||
|
gdextension_interface_functions.clear();
|
||||||
|
}
|
||||||
|
|
||||||
Error GDExtensionResourceLoader::load_gdextension_resource(const String &p_path, Ref<GDExtension> &p_extension) {
|
Error GDExtensionResourceLoader::load_gdextension_resource(const String &p_path, Ref<GDExtension> &p_extension) {
|
||||||
ERR_FAIL_COND_V_MSG(p_extension.is_valid() && p_extension->is_library_open(), ERR_ALREADY_IN_USE, "Cannot load GDExtension resource into already opened library.");
|
ERR_FAIL_COND_V_MSG(p_extension.is_valid() && p_extension->is_library_open(), ERR_ALREADY_IN_USE, "Cannot load GDExtension resource into already opened library.");
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,8 @@ class GDExtension : public Resource {
|
|||||||
void clear_instance_bindings();
|
void clear_instance_bindings();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static HashMap<StringName, GDExtensionInterfaceFunctionPtr> gdextension_interface_functions;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
@@ -153,6 +155,7 @@ public:
|
|||||||
static void register_interface_function(StringName p_function_name, GDExtensionInterfaceFunctionPtr p_function_pointer);
|
static void register_interface_function(StringName p_function_name, GDExtensionInterfaceFunctionPtr p_function_pointer);
|
||||||
static GDExtensionInterfaceFunctionPtr get_interface_function(StringName p_function_name);
|
static GDExtensionInterfaceFunctionPtr get_interface_function(StringName p_function_name);
|
||||||
static void initialize_gdextensions();
|
static void initialize_gdextensions();
|
||||||
|
static void finalize_gdextensions();
|
||||||
|
|
||||||
GDExtension();
|
GDExtension();
|
||||||
~GDExtension();
|
~GDExtension();
|
||||||
|
|||||||
@@ -840,4 +840,8 @@ void GDExtensionCompatHashes::initialize() {
|
|||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GDExtensionCompatHashes::finalize() {
|
||||||
|
mappings.clear();
|
||||||
|
}
|
||||||
|
|
||||||
#endif // DISABLE_DEPRECATED
|
#endif // DISABLE_DEPRECATED
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ class GDExtensionCompatHashes {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static void initialize();
|
static void initialize();
|
||||||
|
static void finalize();
|
||||||
static bool lookup_current_hash(const StringName &p_class, const StringName &p_method, uint32_t p_legacy_hash, uint32_t *r_current_hash);
|
static bool lookup_current_hash(const StringName &p_class, const StringName &p_method, uint32_t p_legacy_hash, uint32_t *r_current_hash);
|
||||||
static bool get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes);
|
static bool get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -293,3 +293,9 @@ GDExtensionManager::GDExtensionManager() {
|
|||||||
GDExtensionCompatHashes::initialize();
|
GDExtensionCompatHashes::initialize();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GDExtensionManager::~GDExtensionManager() {
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
GDExtensionCompatHashes::finalize();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ public:
|
|||||||
void reload_extensions();
|
void reload_extensions();
|
||||||
|
|
||||||
GDExtensionManager();
|
GDExtensionManager();
|
||||||
|
~GDExtensionManager();
|
||||||
};
|
};
|
||||||
|
|
||||||
VARIANT_ENUM_CAST(GDExtensionManager::LoadStatus)
|
VARIANT_ENUM_CAST(GDExtensionManager::LoadStatus)
|
||||||
|
|||||||
@@ -360,6 +360,7 @@ void unregister_core_extensions() {
|
|||||||
if (_is_core_extensions_registered) {
|
if (_is_core_extensions_registered) {
|
||||||
gdextension_manager->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE);
|
gdextension_manager->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE);
|
||||||
}
|
}
|
||||||
|
GDExtension::finalize_gdextensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void unregister_core_types() {
|
void unregister_core_types() {
|
||||||
|
|||||||
@@ -6951,6 +6951,7 @@ EditorNode::EditorNode() {
|
|||||||
|
|
||||||
// Exporters might need the theme.
|
// Exporters might need the theme.
|
||||||
EditorColorMap::create();
|
EditorColorMap::create();
|
||||||
|
EditorTheme::initialize();
|
||||||
theme = create_custom_theme();
|
theme = create_custom_theme();
|
||||||
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), EditorStringName(Editor)));
|
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), EditorStringName(Editor)));
|
||||||
|
|
||||||
@@ -8038,6 +8039,8 @@ EditorNode::~EditorNode() {
|
|||||||
memdelete(progress_hb);
|
memdelete(progress_hb);
|
||||||
|
|
||||||
EditorSettings::destroy();
|
EditorSettings::destroy();
|
||||||
|
EditorColorMap::finish();
|
||||||
|
EditorTheme::finalize();
|
||||||
|
|
||||||
GDExtensionEditorPlugins::editor_node_add_plugin = nullptr;
|
GDExtensionEditorPlugins::editor_node_add_plugin = nullptr;
|
||||||
GDExtensionEditorPlugins::editor_node_remove_plugin = nullptr;
|
GDExtensionEditorPlugins::editor_node_remove_plugin = nullptr;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ void EditorColorMap::add_conversion_color_pair(const String p_from_color, const
|
|||||||
color_conversion_map[Color::html(p_from_color)] = Color::html(p_to_color);
|
color_conversion_map[Color::html(p_from_color)] = Color::html(p_to_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorColorMap::add_conversion_exception(const StringName p_icon_name) {
|
void EditorColorMap::add_conversion_exception(const StringName &p_icon_name) {
|
||||||
color_conversion_exceptions.insert(p_icon_name);
|
color_conversion_exceptions.insert(p_icon_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ void EditorColorMap::create() {
|
|||||||
// Some of the colors below are listed for completeness sake.
|
// Some of the colors below are listed for completeness sake.
|
||||||
// This can be a basis for proper palette validation later.
|
// This can be a basis for proper palette validation later.
|
||||||
|
|
||||||
// Convert: FROM TO
|
// Convert: FROM TO
|
||||||
add_conversion_color_pair("#478cbf", "#478cbf"); // Godot Blue
|
add_conversion_color_pair("#478cbf", "#478cbf"); // Godot Blue
|
||||||
add_conversion_color_pair("#414042", "#414042"); // Godot Gray
|
add_conversion_color_pair("#414042", "#414042"); // Godot Gray
|
||||||
|
|
||||||
@@ -215,6 +215,11 @@ void EditorColorMap::create() {
|
|||||||
add_conversion_exception("Breakpoint");
|
add_conversion_exception("Breakpoint");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorColorMap::finish() {
|
||||||
|
color_conversion_map.clear();
|
||||||
|
color_conversion_exceptions.clear();
|
||||||
|
}
|
||||||
|
|
||||||
Vector<StringName> EditorTheme::editor_theme_types;
|
Vector<StringName> EditorTheme::editor_theme_types;
|
||||||
|
|
||||||
// TODO: Refactor these and corresponding Theme methods to use the bool get_xxx(r_value) pattern internally.
|
// TODO: Refactor these and corresponding Theme methods to use the bool get_xxx(r_value) pattern internally.
|
||||||
@@ -301,13 +306,15 @@ Ref<StyleBox> EditorTheme::get_stylebox(const StringName &p_name, const StringNa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorTheme::EditorTheme() {
|
void EditorTheme::initialize() {
|
||||||
if (editor_theme_types.is_empty()) {
|
editor_theme_types.append(EditorStringName(Editor));
|
||||||
editor_theme_types.append(EditorStringName(Editor));
|
editor_theme_types.append(EditorStringName(EditorFonts));
|
||||||
editor_theme_types.append(EditorStringName(EditorFonts));
|
editor_theme_types.append(EditorStringName(EditorIcons));
|
||||||
editor_theme_types.append(EditorStringName(EditorIcons));
|
editor_theme_types.append(EditorStringName(EditorStyles));
|
||||||
editor_theme_types.append(EditorStringName(EditorStyles));
|
}
|
||||||
}
|
|
||||||
|
void EditorTheme::finalize() {
|
||||||
|
editor_theme_types.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Editor theme generatior.
|
// Editor theme generatior.
|
||||||
|
|||||||
@@ -45,12 +45,14 @@ class EditorColorMap {
|
|||||||
static HashSet<StringName> color_conversion_exceptions;
|
static HashSet<StringName> color_conversion_exceptions;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void create();
|
|
||||||
static void add_conversion_color_pair(const String p_from_color, const String p_to_color);
|
static void add_conversion_color_pair(const String p_from_color, const String p_to_color);
|
||||||
static void add_conversion_exception(const StringName p_icon_name);
|
static void add_conversion_exception(const StringName &p_icon_name);
|
||||||
|
|
||||||
static HashMap<Color, Color> &get_color_conversion_map() { return color_conversion_map; };
|
static HashMap<Color, Color> &get_color_conversion_map() { return color_conversion_map; };
|
||||||
static HashSet<StringName> &get_color_conversion_exceptions() { return color_conversion_exceptions; };
|
static HashSet<StringName> &get_color_conversion_exceptions() { return color_conversion_exceptions; };
|
||||||
|
|
||||||
|
static void create();
|
||||||
|
static void finish();
|
||||||
};
|
};
|
||||||
|
|
||||||
class EditorTheme : public Theme {
|
class EditorTheme : public Theme {
|
||||||
@@ -66,7 +68,8 @@ public:
|
|||||||
virtual Ref<Texture2D> get_icon(const StringName &p_name, const StringName &p_theme_type) const override;
|
virtual Ref<Texture2D> get_icon(const StringName &p_name, const StringName &p_theme_type) const override;
|
||||||
virtual Ref<StyleBox> get_stylebox(const StringName &p_name, const StringName &p_theme_type) const override;
|
virtual Ref<StyleBox> get_stylebox(const StringName &p_name, const StringName &p_theme_type) const override;
|
||||||
|
|
||||||
EditorTheme();
|
static void initialize();
|
||||||
|
static void finalize();
|
||||||
};
|
};
|
||||||
|
|
||||||
Ref<Theme> create_editor_theme(Ref<Theme> p_theme = nullptr);
|
Ref<Theme> create_editor_theme(Ref<Theme> p_theme = nullptr);
|
||||||
|
|||||||
@@ -2845,6 +2845,7 @@ ProjectManager::ProjectManager() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EditorColorMap::create();
|
EditorColorMap::create();
|
||||||
|
EditorTheme::initialize();
|
||||||
Ref<Theme> theme = create_custom_theme();
|
Ref<Theme> theme = create_custom_theme();
|
||||||
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), EditorStringName(Editor)));
|
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), EditorStringName(Editor)));
|
||||||
|
|
||||||
@@ -3297,6 +3298,9 @@ ProjectManager::~ProjectManager() {
|
|||||||
if (EditorSettings::get_singleton()) {
|
if (EditorSettings::get_singleton()) {
|
||||||
EditorSettings::destroy();
|
EditorSettings::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EditorColorMap::finish();
|
||||||
|
EditorTheme::finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTag::_notification(int p_what) {
|
void ProjectTag::_notification(int p_what) {
|
||||||
|
|||||||
Reference in New Issue
Block a user