Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make use of latin1 encoding explicit in gdextension_interface.cpp. #101352

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 29 additions & 28 deletions core/extension/gdextension_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<char>::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<String *>(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<String *>(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<char32_t>::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<String *>(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<char32_t>::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<String *>(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<String *>(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<String *>(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<String *>(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<String *>(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();
Expand Down Expand Up @@ -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<bool>(p_is_static)));
String tmp;
tmp.parse_latin1(StrRange<char>::from_c_str(p_contents));

memnew_placement(r_dest, StringName(tmp, static_cast<bool>(p_is_static)));
}

static void gdextension_string_name_new_with_utf8_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents) {
Expand Down
12 changes: 10 additions & 2 deletions core/string/ustring.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,6 @@ class String {
static const char32_t _replacement_char;

// Known-length copy.
void parse_latin1(const StrRange<char> &p_cstr);
void parse_utf32(const StrRange<char32_t> &p_cstr);
void parse_utf32(const char32_t &p_char);
void copy_from_unchecked(const char32_t *p_char, int p_length);

Expand Down Expand Up @@ -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<char> &p_cstr);
static String latin1(const StrRange<char> &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);
Expand All @@ -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<char32_t> &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 */
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/renderer_rd/effects/sort_effects.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#ifndef SORT_EFFECTS_RD_H
#define SORT_EFFECTS_RD_H

#include "servers/rendering/renderer_rd/shader_rd.h"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quick fix due to build failing because of erroneous cache restores.

I have previously established that including a non-generated file explicitly solves such cache issues for good.

#include "servers/rendering/renderer_rd/shaders/effects/sort.glsl.gen.h"

namespace RendererRD {
Expand Down