Skip to content

Commit b50ff02

Browse files
committed
AK: Skip ASCII validation in {Utf16String,String}::number()
1 parent 1c04b6d commit b50ff02

File tree

7 files changed

+32
-1
lines changed

7 files changed

+32
-1
lines changed

AK/String.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ String String::from_utf8_without_validation(ReadonlyBytes bytes)
5555
return result;
5656
}
5757

58+
String String::from_ascii_without_validation(ReadonlyBytes bytes)
59+
{
60+
return from_utf8_without_validation(bytes);
61+
}
62+
5863
ErrorOr<String> String::from_utf8(StringView view)
5964
{
6065
if (!Utf8View { view }.validate())

AK/String.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class String : public Detail::StringBase {
6464
static ErrorOr<String> from_utf8(T&&) = delete;
6565

6666
[[nodiscard]] static String from_utf8_without_validation(ReadonlyBytes);
67+
[[nodiscard]] static String from_ascii_without_validation(ReadonlyBytes);
6768

6869
static ErrorOr<String> from_string_builder(Badge<StringBuilder>, StringBuilder&);
6970
[[nodiscard]] static String from_string_builder_without_validation(Badge<StringBuilder>, StringBuilder&);

AK/StringNumber.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ StringType create_string_from_number(T value)
4646
}
4747

4848
size_t size = buffer + max_digits - ptr;
49-
return StringType::from_utf8_without_validation(ReadonlyBytes { ptr, size });
49+
return StringType::from_ascii_without_validation(ReadonlyBytes { ptr, size });
5050
}
5151

5252
}

AK/Utf16String.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,21 @@ Utf16String Utf16String::from_utf8_with_replacement_character(StringView utf8_st
3737
return builder.to_utf16_string();
3838
}
3939

40+
Utf16String Utf16String::from_ascii_without_validation(ReadonlyBytes ascii_string)
41+
{
42+
if (ascii_string.size() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) {
43+
Utf16String string;
44+
string.m_value.short_ascii_string = Detail::ShortString::create_with_byte_count(ascii_string.size());
45+
46+
auto result = ascii_string.copy_to(string.m_value.short_ascii_string.storage);
47+
VERIFY(result == ascii_string.size());
48+
49+
return string;
50+
}
51+
52+
return Utf16String { Detail::Utf16StringData::from_ascii(ascii_string) };
53+
}
54+
4055
Utf16String Utf16String::from_utf8_without_validation(StringView utf8_string)
4156
{
4257
if (utf8_string.length() <= Detail::MAX_SHORT_STRING_BYTE_COUNT && utf8_string.is_ascii()) {

AK/Utf16String.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class [[nodiscard]] Utf16String : public Detail::Utf16StringBase {
6464
}
6565

6666
static Utf16String from_utf8_without_validation(StringView);
67+
static Utf16String from_ascii_without_validation(ReadonlyBytes);
6768

6869
static Utf16String from_utf16(Utf16View const& utf16_string);
6970

AK/Utf16StringData.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ NonnullRefPtr<Utf16StringData> Utf16StringData::create_from_code_point_iterable(
5656
return string;
5757
}
5858

59+
NonnullRefPtr<Utf16StringData> Utf16StringData::from_ascii(ReadonlyBytes ascii_string)
60+
{
61+
VERIFY_UTF16_LENGTH(ascii_string.size());
62+
auto string = create_uninitialized(StorageType::ASCII, ascii_string.size());
63+
TypedTransfer<char>::copy(string->m_ascii_data, reinterpret_cast<char const*>(ascii_string.data()), ascii_string.size());
64+
return string;
65+
}
66+
5967
NonnullRefPtr<Utf16StringData> Utf16StringData::from_utf8(StringView utf8_string, AllowASCIIStorage allow_ascii_storage)
6068
{
6169
RefPtr<Utf16StringData> string;

AK/Utf16StringData.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class Utf16StringData final : public RefCounted<Utf16StringData> {
3131
};
3232

3333
static NonnullRefPtr<Utf16StringData> from_utf8(StringView, AllowASCIIStorage);
34+
static NonnullRefPtr<Utf16StringData> from_ascii(ReadonlyBytes);
3435
static NonnullRefPtr<Utf16StringData> from_utf16(Utf16View const&);
3536
static NonnullRefPtr<Utf16StringData> from_utf32(Utf32View const&);
3637
static NonnullRefPtr<Utf16StringData> from_string_builder(StringBuilder&);

0 commit comments

Comments
 (0)