summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2023-01-07 13:59:10 -0500
committerLinus Groh <mail@linusgroh.de>2023-01-08 12:13:15 +0100
commitd793262beba3a113bed4c728b572a78583b43277 (patch)
treee30bd93b43361cc563406dcd934e95f264d24bc9 /Userland/Libraries/LibJS
parent1edb96376b51519fe9a7aff2d281f243ca19fd45 (diff)
downloadserenity-d793262beba3a113bed4c728b572a78583b43277.zip
AK+Everywhere: Make UTF-16 to UTF-8 converter fallible
This could fail to allocate the underlying storage needed to store the UTF-8 data. Propagate this error.
Diffstat (limited to 'Userland/Libraries/LibJS')
-rw-r--r--Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp6
-rw-r--r--Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp2
-rw-r--r--Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp3
-rw-r--r--Userland/Libraries/LibJS/Runtime/Utf16String.cpp5
-rw-r--r--Userland/Libraries/LibJS/Runtime/Utf16String.h3
5 files changed, 11 insertions, 8 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp
index ddf89aee18..cef3472432 100644
--- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp
+++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp
@@ -1265,7 +1265,7 @@ ThrowCompletionOr<DeprecatedString> get_substitution(VM& vm, Utf16View const& ma
} else if (is_ascii_digit(next)) {
bool is_two_digits = (i + 2 < replace_view.length_in_code_units()) && is_ascii_digit(replace_view.code_unit_at(i + 2));
- auto capture_position_string = replace_view.substring_view(i + 1, is_two_digits ? 2 : 1).to_utf8();
+ auto capture_position_string = TRY_OR_THROW_OOM(vm, replace_view.substring_view(i + 1, is_two_digits ? 2 : 1).to_utf8());
auto capture_position = capture_position_string.to_uint();
if (capture_position.has_value() && (*capture_position > 0) && (*capture_position <= captures.size())) {
@@ -1295,7 +1295,7 @@ ThrowCompletionOr<DeprecatedString> get_substitution(VM& vm, Utf16View const& ma
result.append(curr);
} else {
auto group_name_view = replace_view.substring_view(start_position, *end_position - start_position);
- auto group_name = group_name_view.to_utf8(Utf16View::AllowInvalidCodeUnits::Yes);
+ auto group_name = TRY_OR_THROW_OOM(vm, group_name_view.to_utf8(Utf16View::AllowInvalidCodeUnits::Yes));
auto capture = TRY(named_captures.as_object().get(group_name));
@@ -1311,7 +1311,7 @@ ThrowCompletionOr<DeprecatedString> get_substitution(VM& vm, Utf16View const& ma
}
}
- return Utf16String(move(result)).to_utf8();
+ return TRY_OR_THROW_OOM(vm, Utf16View { result }.to_utf8());
}
}
diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp
index 57973e4711..8f1f527b77 100644
--- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp
@@ -718,7 +718,7 @@ ThrowCompletionOr<Vector<PatternPartition>> format_date_time_pattern(VM& vm, Dat
if (formatted_value.length() > 2) {
Utf16String utf16_formatted_value { formatted_value };
if (utf16_formatted_value.length_in_code_units() > 2)
- formatted_value = utf16_formatted_value.substring_view(utf16_formatted_value.length_in_code_units() - 2).to_utf8();
+ formatted_value = TRY_OR_THROW_OOM(vm, utf16_formatted_value.substring_view(utf16_formatted_value.length_in_code_units() - 2).to_utf8());
}
break;
diff --git a/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp b/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp
index c29c4b0cc8..3d4f87de34 100644
--- a/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp
+++ b/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp
@@ -68,7 +68,8 @@ DeprecatedString const& PrimitiveString::deprecated_string() const
{
resolve_rope_if_needed();
if (!m_has_utf8_string) {
- m_utf8_string = m_utf16_string.to_utf8();
+ // FIXME: Propagate this error.
+ m_utf8_string = MUST(m_utf16_string.to_utf8(vm()));
m_has_utf8_string = true;
}
return m_utf8_string;
diff --git a/Userland/Libraries/LibJS/Runtime/Utf16String.cpp b/Userland/Libraries/LibJS/Runtime/Utf16String.cpp
index e6a4b4caf2..098d761e67 100644
--- a/Userland/Libraries/LibJS/Runtime/Utf16String.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Utf16String.cpp
@@ -6,6 +6,7 @@
#include <AK/StringView.h>
#include <LibJS/Runtime/Utf16String.h>
+#include <LibJS/Runtime/VM.h>
namespace JS {
namespace Detail {
@@ -96,9 +97,9 @@ Utf16View Utf16String::substring_view(size_t code_unit_offset) const
return view().substring_view(code_unit_offset);
}
-DeprecatedString Utf16String::to_utf8() const
+ThrowCompletionOr<DeprecatedString> Utf16String::to_utf8(VM& vm) const
{
- return view().to_utf8(Utf16View::AllowInvalidCodeUnits::Yes);
+ return TRY_OR_THROW_OOM(vm, view().to_utf8(Utf16View::AllowInvalidCodeUnits::Yes));
}
u16 Utf16String::code_unit_at(size_t index) const
diff --git a/Userland/Libraries/LibJS/Runtime/Utf16String.h b/Userland/Libraries/LibJS/Runtime/Utf16String.h
index fdcc014252..4b101a8261 100644
--- a/Userland/Libraries/LibJS/Runtime/Utf16String.h
+++ b/Userland/Libraries/LibJS/Runtime/Utf16String.h
@@ -12,6 +12,7 @@
#include <AK/Types.h>
#include <AK/Utf16View.h>
#include <AK/Vector.h>
+#include <LibJS/Runtime/Completion.h>
namespace JS {
namespace Detail {
@@ -49,7 +50,7 @@ public:
Utf16View substring_view(size_t code_unit_offset, size_t code_unit_length) const;
Utf16View substring_view(size_t code_unit_offset) const;
- DeprecatedString to_utf8() const;
+ ThrowCompletionOr<DeprecatedString> to_utf8(VM&) const;
u16 code_unit_at(size_t index) const;
size_t length_in_code_units() const;