1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:37:35 +00:00

LibJS+LibLocale: Propagate OOM from CLDR RelativeTime Vector operations

This commit is contained in:
Timothy Flynn 2023-02-02 21:37:08 -05:00 committed by Linus Groh
parent 340434ce09
commit 8670526f2a
4 changed files with 12 additions and 12 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org> * Copyright (c) 2022-2023, Tim Flynn <trflynn89@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -247,7 +247,7 @@ static constexpr Array<@relative_time_format_index_type@, @size@> @name@ { {)~~~
generate_mapping(generator, cldr.locales, cldr.unique_formats.type_that_fits(), "s_locale_relative_time_formats"sv, "s_number_systems_digits_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_list(name, value.time_units); }); generate_mapping(generator, cldr.locales, cldr.unique_formats.type_that_fits(), "s_locale_relative_time_formats"sv, "s_number_systems_digits_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_list(name, value.time_units); });
generator.append(R"~~~( generator.append(R"~~~(
Vector<RelativeTimeFormat> get_relative_time_format_patterns(StringView locale, TimeUnit time_unit, StringView tense_or_number, Style style) ErrorOr<Vector<RelativeTimeFormat>> get_relative_time_format_patterns(StringView locale, TimeUnit time_unit, StringView tense_or_number, Style style)
{ {
Vector<RelativeTimeFormat> formats; Vector<RelativeTimeFormat> formats;
@ -268,7 +268,7 @@ Vector<RelativeTimeFormat> get_relative_time_format_patterns(StringView locale,
if (decode_string(locale_format.tense_or_number) != tense_or_number) if (decode_string(locale_format.tense_or_number) != tense_or_number)
continue; continue;
formats.append(locale_format.to_relative_time_format()); TRY(formats.try_append(locale_format.to_relative_time_format()));
} }
return formats; return formats;

View file

@ -117,20 +117,20 @@ ThrowCompletionOr<Vector<PatternPartitionWithUnit>> partition_relative_time_patt
// then filtering the large set of locale data down to the pattern we are looking for. Instead, // then filtering the large set of locale data down to the pattern we are looking for. Instead,
// LibUnicode expects the individual options as enumeration values, and returns the couple of // LibUnicode expects the individual options as enumeration values, and returns the couple of
// patterns that match those options. // patterns that match those options.
auto find_patterns_for_tense_or_number = [&](StringView tense_or_number) { auto find_patterns_for_tense_or_number = [&](StringView tense_or_number) -> ThrowCompletionOr<Vector<::Locale::RelativeTimeFormat>> {
// 10. If style is equal to "short", then // 10. If style is equal to "short", then
// a. Let entry be the string-concatenation of unit and "-short". // a. Let entry be the string-concatenation of unit and "-short".
// 11. Else if style is equal to "narrow", then // 11. Else if style is equal to "narrow", then
// a. Let entry be the string-concatenation of unit and "-narrow". // a. Let entry be the string-concatenation of unit and "-narrow".
// 12. Else, // 12. Else,
// a. Let entry be unit. // a. Let entry be unit.
auto patterns = ::Locale::get_relative_time_format_patterns(data_locale, time_unit, tense_or_number, style); auto patterns = TRY_OR_THROW_OOM(vm, ::Locale::get_relative_time_format_patterns(data_locale, time_unit, tense_or_number, style));
// 13. If fields doesn't have a field [[<entry>]], then // 13. If fields doesn't have a field [[<entry>]], then
if (patterns.is_empty()) { if (patterns.is_empty()) {
// a. Let entry be unit. // a. Let entry be unit.
// NOTE: In the CLDR, the lack of "short" or "narrow" in the key implies "long". // NOTE: In the CLDR, the lack of "short" or "narrow" in the key implies "long".
patterns = ::Locale::get_relative_time_format_patterns(data_locale, time_unit, tense_or_number, ::Locale::Style::Long); patterns = TRY_OR_THROW_OOM(vm, ::Locale::get_relative_time_format_patterns(data_locale, time_unit, tense_or_number, ::Locale::Style::Long));
} }
// 14. Let patterns be fields.[[<entry>]]. // 14. Let patterns be fields.[[<entry>]].
@ -144,7 +144,7 @@ ThrowCompletionOr<Vector<PatternPartitionWithUnit>> partition_relative_time_patt
auto value_string = MUST(Value(value).to_string(vm)); auto value_string = MUST(Value(value).to_string(vm));
// b. If patterns has a field [[<valueString>]], then // b. If patterns has a field [[<valueString>]], then
if (auto patterns = find_patterns_for_tense_or_number(value_string); !patterns.is_empty()) { if (auto patterns = MUST_OR_THROW_OOM(find_patterns_for_tense_or_number(value_string)); !patterns.is_empty()) {
VERIFY(patterns.size() == 1); VERIFY(patterns.size() == 1);
// i. Let result be patterns.[[<valueString>]]. // i. Let result be patterns.[[<valueString>]].
@ -173,7 +173,7 @@ ThrowCompletionOr<Vector<PatternPartitionWithUnit>> partition_relative_time_patt
} }
// 19. Let po be patterns.[[<tl>]]. // 19. Let po be patterns.[[<tl>]].
auto patterns = find_patterns_for_tense_or_number(tense); auto patterns = MUST_OR_THROW_OOM(find_patterns_for_tense_or_number(tense));
// 20. Let fv be ! PartitionNumberPattern(relativeTimeFormat.[[NumberFormat]], value). // 20. Let fv be ! PartitionNumberPattern(relativeTimeFormat.[[NumberFormat]], value).
auto value_partitions = MUST_OR_THROW_OOM(partition_number_pattern(vm, relative_time_format.number_format(), Value(value))); auto value_partitions = MUST_OR_THROW_OOM(partition_number_pattern(vm, relative_time_format.number_format(), Value(value)));

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org> * Copyright (c) 2022-2023, Tim Flynn <trflynn89@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -53,6 +53,6 @@ StringView time_unit_to_string(TimeUnit time_unit)
} }
} }
Vector<RelativeTimeFormat> __attribute__((weak)) get_relative_time_format_patterns(StringView, TimeUnit, StringView, Style) { return {}; } ErrorOr<Vector<RelativeTimeFormat>> __attribute__((weak)) get_relative_time_format_patterns(StringView, TimeUnit, StringView, Style) { return Vector<RelativeTimeFormat> {}; }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org> * Copyright (c) 2022-2023, Tim Flynn <trflynn89@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -34,6 +34,6 @@ struct RelativeTimeFormat {
Optional<TimeUnit> time_unit_from_string(StringView time_unit); Optional<TimeUnit> time_unit_from_string(StringView time_unit);
StringView time_unit_to_string(TimeUnit time_unit); StringView time_unit_to_string(TimeUnit time_unit);
Vector<RelativeTimeFormat> get_relative_time_format_patterns(StringView locale, TimeUnit time_unit, StringView tense_or_number, Style style); ErrorOr<Vector<RelativeTimeFormat>> get_relative_time_format_patterns(StringView locale, TimeUnit time_unit, StringView tense_or_number, Style style);
} }