From 329774ee73260cd30589584e34760030098ed3b0 Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Thu, 9 Jan 2025 16:14:10 +0100 Subject: [PATCH] Make use of `latin1` encoding explicit in `gdextension_interface.cpp`. --- core/extension/gdextension_interface.cpp | 57 ++++++++++--------- core/string/ustring.h | 12 +++- .../renderer_rd/effects/sort_effects.h | 1 + 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp index 30f0ce988f92..ad97892d16ac 100644 --- a/core/extension/gdextension_interface.cpp +++ b/core/extension/gdextension_interface.cpp @@ -858,84 +858,82 @@ static GDExtensionPtrUtilityFunction gdextension_variant_get_ptr_utility_functio //string helpers static void gdextension_string_new_with_latin1_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) { - memnew_placement(r_dest, String(p_contents)); + String *dest = memnew_placement(r_dest, String); + dest->parse_latin1(StrRange::from_c_str(p_contents)); } static void gdextension_string_new_with_utf8_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) { - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + String *dest = memnew_placement(r_dest, String); dest->parse_utf8(p_contents); } static void gdextension_string_new_with_utf16_chars(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents) { - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + String *dest = memnew_placement(r_dest, String); dest->parse_utf16(p_contents); } static void gdextension_string_new_with_utf32_chars(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents) { - memnew_placement(r_dest, String((const char32_t *)p_contents)); + String *dest = memnew_placement(r_dest, String); + dest->parse_utf32(StrRange::from_c_str(p_contents)); } static void gdextension_string_new_with_wide_chars(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents) { if constexpr (sizeof(wchar_t) == 2) { - // wchar_t is 16 bit, parse. - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + // wchar_t is 16 bit (UTF-16). + String *dest = memnew_placement(r_dest, String); dest->parse_utf16((const char16_t *)p_contents); } else { - // wchar_t is 32 bit, copy. - memnew_placement(r_dest, String((const char32_t *)p_contents)); + // wchar_t is 32 bit (UTF-32). + String *string = memnew_placement(r_dest, String); + string->parse_utf32(StrRange::from_c_str((const char32_t *)p_contents)); } } static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { - memnew_placement(r_dest, String(p_contents, p_size)); + String *dest = memnew_placement(r_dest, String); + dest->parse_latin1(StrRange(p_contents, p_contents ? _strlen_clipped(p_contents, p_size) : 0)); } static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + String *dest = memnew_placement(r_dest, String); dest->parse_utf8(p_contents, p_size); } static GDExtensionInt gdextension_string_new_with_utf8_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + String *dest = memnew_placement(r_dest, String); return (GDExtensionInt)dest->parse_utf8(p_contents, p_size); } static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count) { - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + String *dest = memnew_placement(r_dest, String); dest->parse_utf16(p_contents, p_char_count); } static GDExtensionInt gdextension_string_new_with_utf16_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count, GDExtensionBool p_default_little_endian) { - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + String *dest = memnew_placement(r_dest, String); return (GDExtensionInt)dest->parse_utf16(p_contents, p_char_count, p_default_little_endian); } static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) { - memnew_placement(r_dest, String((const char32_t *)p_contents, p_char_count)); + String *string = memnew_placement(r_dest, String); + string->parse_utf32(StrRange(p_contents, p_contents ? _strlen_clipped(p_contents, p_char_count) : 0)); } static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count) { if constexpr (sizeof(wchar_t) == 2) { - // wchar_t is 16 bit, parse. - memnew_placement(r_dest, String); - String *dest = reinterpret_cast(r_dest); + // wchar_t is 16 bit (UTF-16). + String *dest = memnew_placement(r_dest, String); dest->parse_utf16((const char16_t *)p_contents, p_char_count); } else { - // wchar_t is 32 bit, copy. - memnew_placement(r_dest, String((const char32_t *)p_contents, p_char_count)); + // wchar_t is 32 bit (UTF-32). + String *string = memnew_placement(r_dest, String); + string->parse_utf32(StrRange((const char32_t *)p_contents, p_contents ? _strlen_clipped((const char32_t *)p_contents, p_char_count) : 0)); } } static GDExtensionInt gdextension_string_to_latin1_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) { String *self = (String *)p_self; - CharString cs = self->ascii(true); + CharString cs = self->latin1(); GDExtensionInt len = cs.length(); if (r_text) { const char *s_text = cs.ptr(); @@ -1036,7 +1034,10 @@ static GDExtensionInt gdextension_string_resize(GDExtensionStringPtr p_self, GDE } static void gdextension_string_name_new_with_latin1_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionBool p_is_static) { - memnew_placement(r_dest, StringName(p_contents, static_cast(p_is_static))); + String tmp; + tmp.parse_latin1(StrRange::from_c_str(p_contents)); + + memnew_placement(r_dest, StringName(tmp, static_cast(p_is_static))); } static void gdextension_string_name_new_with_utf8_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents) { diff --git a/core/string/ustring.h b/core/string/ustring.h index b8ebeb99d7cb..64407b3a4ef9 100644 --- a/core/string/ustring.h +++ b/core/string/ustring.h @@ -267,8 +267,6 @@ class String { static const char32_t _replacement_char; // Known-length copy. - void parse_latin1(const StrRange &p_cstr); - void parse_utf32(const StrRange &p_cstr); void parse_utf32(const char32_t &p_char); void copy_from_unchecked(const char32_t *p_char, int p_length); @@ -521,6 +519,14 @@ class String { char32_t unicode_at(int p_idx) const; CharString ascii(bool p_allow_extended = false) const; + CharString latin1() const { return ascii(true); } + void parse_latin1(const StrRange &p_cstr); + static String latin1(const StrRange &p_string) { + String string; + string.parse_latin1(p_string); + return string; + } + CharString utf8() const; Error parse_utf8(const char *p_utf8, int p_len = -1, bool p_skip_cr = false); static String utf8(const char *p_utf8, int p_len = -1); @@ -529,6 +535,8 @@ class String { Error parse_utf16(const char16_t *p_utf16, int p_len = -1, bool p_default_little_endian = true); static String utf16(const char16_t *p_utf16, int p_len = -1); + void parse_utf32(const StrRange &p_cstr); + static uint32_t hash(const char32_t *p_cstr, int p_len); /* hash the string */ static uint32_t hash(const char32_t *p_cstr); /* hash the string */ static uint32_t hash(const wchar_t *p_cstr, int p_len); /* hash the string */ diff --git a/servers/rendering/renderer_rd/effects/sort_effects.h b/servers/rendering/renderer_rd/effects/sort_effects.h index 827f2e56455b..924d59989276 100644 --- a/servers/rendering/renderer_rd/effects/sort_effects.h +++ b/servers/rendering/renderer_rd/effects/sort_effects.h @@ -31,6 +31,7 @@ #ifndef SORT_EFFECTS_RD_H #define SORT_EFFECTS_RD_H +#include "servers/rendering/renderer_rd/shader_rd.h" #include "servers/rendering/renderer_rd/shaders/effects/sort.glsl.gen.h" namespace RendererRD {