Merge pull request #100238 from Ivorforce/copy-from-unchecked-unchecked

Optimize String `copy_from_unchecked` to actually not check the string.
This commit is contained in:
Thaddeus Crews 2025-03-12 10:31:54 -05:00
commit 19057494db
No known key found for this signature in database
GPG Key ID: 62181B86FE9E5D84

View File

@ -324,7 +324,27 @@ void String::parse_utf32(const Span<char32_t> &p_cstr) {
return;
}
copy_from_unchecked(p_cstr.ptr(), p_cstr.size());
resize(p_cstr.size() + 1);
const char32_t *src = p_cstr.ptr();
const char32_t *end = p_cstr.ptr() + p_cstr.size();
char32_t *dst = ptrw();
// Copy the string, and check for UTF-32 problems.
for (; src < end; ++src, ++dst) {
const char32_t chr = *src;
if ((chr & 0xfffff800) == 0xd800) {
print_unicode_error(vformat("Unpaired surrogate (%x)", (uint32_t)chr), true);
*dst = _replacement_char;
continue;
}
if (chr > 0x10ffff) {
print_unicode_error(vformat("Invalid unicode codepoint (%x)", (uint32_t)chr), true);
*dst = _replacement_char;
continue;
}
*dst = chr;
}
*dst = 0;
}
void String::parse_utf32(const char32_t &p_char) {
@ -354,27 +374,12 @@ void String::parse_utf32(const char32_t &p_char) {
// p_char != nullptr
// p_length > 0
// p_length <= p_char strlen
// p_char is a valid UTF32 string
void String::copy_from_unchecked(const char32_t *p_char, const int p_length) {
resize(p_length + 1);
const char32_t *end = p_char + p_length;
resize(p_length + 1); // + 1 for \0
char32_t *dst = ptrw();
for (; p_char < end; ++p_char, ++dst) {
const char32_t chr = *p_char;
if ((chr & 0xfffff800) == 0xd800) {
print_unicode_error(vformat("Unpaired surrogate (%x)", (uint32_t)chr));
*dst = _replacement_char;
continue;
}
if (chr > 0x10ffff) {
print_unicode_error(vformat("Invalid unicode codepoint (%x)", (uint32_t)chr));
*dst = _replacement_char;
continue;
}
*dst = chr;
}
*dst = 0;
memcpy(dst, p_char, p_length * sizeof(char32_t));
*(dst + p_length) = _null;
}
String String::operator+(const String &p_str) const {