Skip to content

Commit 541e721

Browse files
committed
Change String copy_from_unchecked to actually not check the string, leading to performance optimizations across substr, count, and StringBuilder.
1 parent 78c9f8d commit 541e721

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

core/string/ustring.cpp

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,27 @@ void String::parse_utf32(const Span<char32_t> &p_cstr) {
324324
return;
325325
}
326326

327-
copy_from_unchecked(p_cstr.ptr(), p_cstr.size());
327+
resize(p_cstr.size() + 1);
328+
const char32_t *src = p_cstr.ptr();
329+
const char32_t *end = p_cstr.ptr() + p_cstr.size();
330+
char32_t *dst = ptrw();
331+
332+
// Copy the string, and check for UTF-32 problems.
333+
for (; src < end; ++src, ++dst) {
334+
const char32_t chr = *src;
335+
if ((chr & 0xfffff800) == 0xd800) {
336+
print_unicode_error(vformat("Unpaired surrogate (%x)", (uint32_t)chr), true);
337+
*dst = _replacement_char;
338+
continue;
339+
}
340+
if (chr > 0x10ffff) {
341+
print_unicode_error(vformat("Invalid unicode codepoint (%x)", (uint32_t)chr), true);
342+
*dst = _replacement_char;
343+
continue;
344+
}
345+
*dst = chr;
346+
}
347+
*dst = 0;
328348
}
329349

330350
void String::parse_utf32(const char32_t &p_char) {
@@ -354,27 +374,12 @@ void String::parse_utf32(const char32_t &p_char) {
354374
// p_char != nullptr
355375
// p_length > 0
356376
// p_length <= p_char strlen
377+
// p_char is a valid UTF32 string
357378
void String::copy_from_unchecked(const char32_t *p_char, const int p_length) {
358-
resize(p_length + 1);
359-
360-
const char32_t *end = p_char + p_length;
379+
resize(p_length + 1); // + 1 for \0
361380
char32_t *dst = ptrw();
362-
363-
for (; p_char < end; ++p_char, ++dst) {
364-
const char32_t chr = *p_char;
365-
if ((chr & 0xfffff800) == 0xd800) {
366-
print_unicode_error(vformat("Unpaired surrogate (%x)", (uint32_t)chr));
367-
*dst = _replacement_char;
368-
continue;
369-
}
370-
if (chr > 0x10ffff) {
371-
print_unicode_error(vformat("Invalid unicode codepoint (%x)", (uint32_t)chr));
372-
*dst = _replacement_char;
373-
continue;
374-
}
375-
*dst = chr;
376-
}
377-
*dst = 0;
381+
memcpy(dst, p_char, p_length * sizeof(char32_t));
382+
*(dst + p_length) = _null;
378383
}
379384

380385
String String::operator+(const String &p_str) const {

0 commit comments

Comments
 (0)