AK: Skip ASCII validation in {Utf16String,String}::number()

This commit is contained in:
Andreas Kling
2025-10-04 12:24:04 +02:00
committed by Andreas Kling
parent 1c04b6da3b
commit b50ff02da4
Notes: github-actions[bot] 2025-10-05 09:26:13 +00:00
7 changed files with 32 additions and 1 deletions

View File

@@ -55,6 +55,11 @@ String String::from_utf8_without_validation(ReadonlyBytes bytes)
return result;
}
String String::from_ascii_without_validation(ReadonlyBytes bytes)
{
return from_utf8_without_validation(bytes);
}
ErrorOr<String> String::from_utf8(StringView view)
{
if (!Utf8View { view }.validate())

View File

@@ -64,6 +64,7 @@ public:
static ErrorOr<String> from_utf8(T&&) = delete;
[[nodiscard]] static String from_utf8_without_validation(ReadonlyBytes);
[[nodiscard]] static String from_ascii_without_validation(ReadonlyBytes);
static ErrorOr<String> from_string_builder(Badge<StringBuilder>, StringBuilder&);
[[nodiscard]] static String from_string_builder_without_validation(Badge<StringBuilder>, StringBuilder&);

View File

@@ -46,7 +46,7 @@ StringType create_string_from_number(T value)
}
size_t size = buffer + max_digits - ptr;
return StringType::from_utf8_without_validation(ReadonlyBytes { ptr, size });
return StringType::from_ascii_without_validation(ReadonlyBytes { ptr, size });
}
}

View File

@@ -37,6 +37,21 @@ Utf16String Utf16String::from_utf8_with_replacement_character(StringView utf8_st
return builder.to_utf16_string();
}
Utf16String Utf16String::from_ascii_without_validation(ReadonlyBytes ascii_string)
{
if (ascii_string.size() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) {
Utf16String string;
string.m_value.short_ascii_string = Detail::ShortString::create_with_byte_count(ascii_string.size());
auto result = ascii_string.copy_to(string.m_value.short_ascii_string.storage);
VERIFY(result == ascii_string.size());
return string;
}
return Utf16String { Detail::Utf16StringData::from_ascii(ascii_string) };
}
Utf16String Utf16String::from_utf8_without_validation(StringView utf8_string)
{
if (utf8_string.length() <= Detail::MAX_SHORT_STRING_BYTE_COUNT && utf8_string.is_ascii()) {

View File

@@ -64,6 +64,7 @@ public:
}
static Utf16String from_utf8_without_validation(StringView);
static Utf16String from_ascii_without_validation(ReadonlyBytes);
static Utf16String from_utf16(Utf16View const& utf16_string);

View File

@@ -56,6 +56,14 @@ NonnullRefPtr<Utf16StringData> Utf16StringData::create_from_code_point_iterable(
return string;
}
NonnullRefPtr<Utf16StringData> Utf16StringData::from_ascii(ReadonlyBytes ascii_string)
{
VERIFY_UTF16_LENGTH(ascii_string.size());
auto string = create_uninitialized(StorageType::ASCII, ascii_string.size());
TypedTransfer<char>::copy(string->m_ascii_data, reinterpret_cast<char const*>(ascii_string.data()), ascii_string.size());
return string;
}
NonnullRefPtr<Utf16StringData> Utf16StringData::from_utf8(StringView utf8_string, AllowASCIIStorage allow_ascii_storage)
{
RefPtr<Utf16StringData> string;

View File

@@ -31,6 +31,7 @@ public:
};
static NonnullRefPtr<Utf16StringData> from_utf8(StringView, AllowASCIIStorage);
static NonnullRefPtr<Utf16StringData> from_ascii(ReadonlyBytes);
static NonnullRefPtr<Utf16StringData> from_utf16(Utf16View const&);
static NonnullRefPtr<Utf16StringData> from_utf32(Utf32View const&);
static NonnullRefPtr<Utf16StringData> from_string_builder(StringBuilder&);