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
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; return result;
} }
String String::from_ascii_without_validation(ReadonlyBytes bytes)
{
return from_utf8_without_validation(bytes);
}
ErrorOr<String> String::from_utf8(StringView view) ErrorOr<String> String::from_utf8(StringView view)
{ {
if (!Utf8View { view }.validate()) if (!Utf8View { view }.validate())

View file

@ -64,6 +64,7 @@ public:
static ErrorOr<String> from_utf8(T&&) = delete; static ErrorOr<String> from_utf8(T&&) = delete;
[[nodiscard]] static String from_utf8_without_validation(ReadonlyBytes); [[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&); static ErrorOr<String> from_string_builder(Badge<StringBuilder>, StringBuilder&);
[[nodiscard]] static String from_string_builder_without_validation(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; 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(); 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) Utf16String Utf16String::from_utf8_without_validation(StringView utf8_string)
{ {
if (utf8_string.length() <= Detail::MAX_SHORT_STRING_BYTE_COUNT && utf8_string.is_ascii()) { 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_utf8_without_validation(StringView);
static Utf16String from_ascii_without_validation(ReadonlyBytes);
static Utf16String from_utf16(Utf16View const& utf16_string); static Utf16String from_utf16(Utf16View const& utf16_string);

View file

@ -56,6 +56,14 @@ NonnullRefPtr<Utf16StringData> Utf16StringData::create_from_code_point_iterable(
return string; 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) NonnullRefPtr<Utf16StringData> Utf16StringData::from_utf8(StringView utf8_string, AllowASCIIStorage allow_ascii_storage)
{ {
RefPtr<Utf16StringData> string; RefPtr<Utf16StringData> string;

View file

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