mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 20:07:34 +00:00
LibJS+Everywhere: Make PrimitiveString and Utf16String fallible
This makes construction of Utf16String fallible in OOM conditions. The immediate impact is that PrimitiveString must then be fallible as well, as it may either transcode UTF-8 to UTF-16, or create a UTF-16 string from ropes. There are a couple of places where it is very non-trivial to propagate the error further. A FIXME has been added to those locations.
This commit is contained in:
parent
d793262beb
commit
115baa7e32
57 changed files with 306 additions and 295 deletions
|
@ -376,14 +376,14 @@ static auto& find_key_in_value(T& value, StringView key)
|
|||
}
|
||||
|
||||
// 9.2.7 ResolveLocale ( availableLocales, requestedLocales, options, relevantExtensionKeys, localeData ), https://tc39.es/ecma402/#sec-resolvelocale
|
||||
LocaleResult resolve_locale(Vector<DeprecatedString> const& requested_locales, LocaleOptions const& options, Span<StringView const> relevant_extension_keys)
|
||||
ThrowCompletionOr<LocaleResult> resolve_locale(Vector<DeprecatedString> const& requested_locales, LocaleOptions const& options, Span<StringView const> relevant_extension_keys)
|
||||
{
|
||||
// 1. Let matcher be options.[[localeMatcher]].
|
||||
auto const& matcher = options.locale_matcher;
|
||||
MatcherResult matcher_result;
|
||||
|
||||
// 2. If matcher is "lookup", then
|
||||
if (matcher.is_string() && (matcher.as_string().deprecated_string() == "lookup"sv)) {
|
||||
if (matcher.is_string() && (TRY(matcher.as_string().deprecated_string()) == "lookup"sv)) {
|
||||
// a. Let r be ! LookupMatcher(availableLocales, requestedLocales).
|
||||
matcher_result = lookup_matcher(requested_locales);
|
||||
}
|
||||
|
@ -578,7 +578,7 @@ ThrowCompletionOr<Array*> supported_locales(VM& vm, Vector<DeprecatedString> con
|
|||
Vector<DeprecatedString> supported_locales;
|
||||
|
||||
// 3. If matcher is "best fit", then
|
||||
if (matcher.as_string().deprecated_string() == "best fit"sv) {
|
||||
if (TRY(matcher.as_string().deprecated_string()) == "best fit"sv) {
|
||||
// a. Let supportedLocales be BestFitSupportedLocales(availableLocales, requestedLocales).
|
||||
supported_locales = best_fit_supported_locales(requested_locales);
|
||||
}
|
||||
|
|
|
@ -86,7 +86,7 @@ bool is_well_formed_unit_identifier(StringView unit_identifier);
|
|||
ThrowCompletionOr<Vector<DeprecatedString>> canonicalize_locale_list(VM&, Value locales);
|
||||
Optional<DeprecatedString> best_available_locale(StringView locale);
|
||||
DeprecatedString insert_unicode_extension_and_canonicalize(::Locale::LocaleID locale_id, ::Locale::LocaleExtension extension);
|
||||
LocaleResult resolve_locale(Vector<DeprecatedString> const& requested_locales, LocaleOptions const& options, Span<StringView const> relevant_extension_keys);
|
||||
ThrowCompletionOr<LocaleResult> resolve_locale(Vector<DeprecatedString> const& requested_locales, LocaleOptions const& options, Span<StringView const> relevant_extension_keys);
|
||||
Vector<DeprecatedString> lookup_supported_locales(Vector<DeprecatedString> const& requested_locales);
|
||||
Vector<DeprecatedString> best_fit_supported_locales(Vector<DeprecatedString> const& requested_locales);
|
||||
ThrowCompletionOr<Array*> supported_locales(VM&, Vector<DeprecatedString> const& requested_locales, Value options);
|
||||
|
|
|
@ -27,7 +27,7 @@ static ThrowCompletionOr<Collator*> initialize_collator(VM& vm, Collator& collat
|
|||
auto usage = TRY(get_option(vm, *options, vm.names.usage, OptionType::String, { "sort"sv, "search"sv }, "sort"sv));
|
||||
|
||||
// 4. Set collator.[[Usage]] to usage.
|
||||
collator.set_usage(usage.as_string().deprecated_string());
|
||||
collator.set_usage(TRY(usage.as_string().deprecated_string()));
|
||||
|
||||
// 5. If usage is "sort", then
|
||||
// a. Let localeData be %Collator%.[[SortLocaleData]].
|
||||
|
@ -49,11 +49,11 @@ static ThrowCompletionOr<Collator*> initialize_collator(VM& vm, Collator& collat
|
|||
// 11. If collation is not undefined, then
|
||||
if (!collation.is_undefined()) {
|
||||
// a. If collation does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception.
|
||||
if (!::Locale::is_type_identifier(collation.as_string().deprecated_string()))
|
||||
if (!::Locale::is_type_identifier(TRY(collation.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, collation, "collation"sv);
|
||||
|
||||
// 12. Set opt.[[co]] to collation.
|
||||
opt.co = collation.as_string().deprecated_string();
|
||||
opt.co = TRY(collation.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 13. Let numeric be ? GetOption(options, "numeric", "boolean", undefined, undefined).
|
||||
|
@ -69,13 +69,13 @@ static ThrowCompletionOr<Collator*> initialize_collator(VM& vm, Collator& collat
|
|||
// 17. Set opt.[[kf]] to caseFirst.
|
||||
auto case_first = TRY(get_option(vm, *options, vm.names.caseFirst, OptionType::String, { "upper"sv, "lower"sv, "false"sv }, Empty {}));
|
||||
if (!case_first.is_undefined())
|
||||
opt.kf = case_first.as_string().deprecated_string();
|
||||
opt.kf = TRY(case_first.as_string().deprecated_string());
|
||||
|
||||
// 18. Let relevantExtensionKeys be %Collator%.[[RelevantExtensionKeys]].
|
||||
auto relevant_extension_keys = Collator::relevant_extension_keys();
|
||||
|
||||
// 19. Let r be ResolveLocale(%Collator%.[[AvailableLocales]], requestedLocales, opt, relevantExtensionKeys, localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, relevant_extension_keys);
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, relevant_extension_keys));
|
||||
|
||||
// 20. Set collator.[[Locale]] to r.[[locale]].
|
||||
collator.set_locale(move(result.locale));
|
||||
|
@ -117,7 +117,7 @@ static ThrowCompletionOr<Collator*> initialize_collator(VM& vm, Collator& collat
|
|||
}
|
||||
|
||||
// 28. Set collator.[[Sensitivity]] to sensitivity.
|
||||
collator.set_sensitivity(sensitivity.as_string().deprecated_string());
|
||||
collator.set_sensitivity(TRY(sensitivity.as_string().deprecated_string()));
|
||||
|
||||
// 29. Let ignorePunctuation be ? GetOption(options, "ignorePunctuation", "boolean", undefined, false).
|
||||
auto ignore_punctuation = TRY(get_option(vm, *options, vm.names.ignorePunctuation, OptionType::Boolean, {}, false));
|
||||
|
|
|
@ -716,7 +716,7 @@ ThrowCompletionOr<Vector<PatternPartition>> format_date_time_pattern(VM& vm, Dat
|
|||
// 2. If the "length" property of fv is greater than 2, let fv be the substring of fv containing the last two characters.
|
||||
// NOTE: The first length check here isn't enough, but lets us avoid UTF-16 transcoding when the formatted value is ASCII.
|
||||
if (formatted_value.length() > 2) {
|
||||
Utf16String utf16_formatted_value { formatted_value };
|
||||
auto utf16_formatted_value = TRY(Utf16String::create(vm, formatted_value));
|
||||
if (utf16_formatted_value.length_in_code_units() > 2)
|
||||
formatted_value = TRY_OR_THROW_OOM(vm, utf16_formatted_value.substring_view(utf16_formatted_value.length_in_code_units() - 2).to_utf8());
|
||||
}
|
||||
|
|
|
@ -106,11 +106,11 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(VM& vm, DateTimeF
|
|||
// 7. If calendar is not undefined, then
|
||||
if (!calendar.is_undefined()) {
|
||||
// a. If calendar does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception.
|
||||
if (!::Locale::is_type_identifier(calendar.as_string().deprecated_string()))
|
||||
if (!::Locale::is_type_identifier(TRY(calendar.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, calendar, "calendar"sv);
|
||||
|
||||
// 8. Set opt.[[ca]] to calendar.
|
||||
opt.ca = calendar.as_string().deprecated_string();
|
||||
opt.ca = TRY(calendar.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 9. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined).
|
||||
|
@ -119,11 +119,11 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(VM& vm, DateTimeF
|
|||
// 10. If numberingSystem is not undefined, then
|
||||
if (!numbering_system.is_undefined()) {
|
||||
// a. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception.
|
||||
if (!::Locale::is_type_identifier(numbering_system.as_string().deprecated_string()))
|
||||
if (!::Locale::is_type_identifier(TRY(numbering_system.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, numbering_system, "numberingSystem"sv);
|
||||
|
||||
// 11. Set opt.[[nu]] to numberingSystem.
|
||||
opt.nu = numbering_system.as_string().deprecated_string();
|
||||
opt.nu = TRY(numbering_system.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 12. Let hour12 be ? GetOption(options, "hour12", "boolean", undefined, undefined).
|
||||
|
@ -140,11 +140,11 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(VM& vm, DateTimeF
|
|||
|
||||
// 15. Set opt.[[hc]] to hourCycle.
|
||||
if (!hour_cycle.is_nullish())
|
||||
opt.hc = hour_cycle.as_string().deprecated_string();
|
||||
opt.hc = TRY(hour_cycle.as_string().deprecated_string());
|
||||
|
||||
// 16. Let localeData be %DateTimeFormat%.[[LocaleData]].
|
||||
// 17. Let r be ResolveLocale(%DateTimeFormat%.[[AvailableLocales]], requestedLocales, opt, %DateTimeFormat%.[[RelevantExtensionKeys]], localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, DateTimeFormat::relevant_extension_keys());
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, DateTimeFormat::relevant_extension_keys()));
|
||||
|
||||
// 18. Set dateTimeFormat.[[Locale]] to r.[[locale]].
|
||||
date_time_format.set_locale(move(result.locale));
|
||||
|
@ -277,7 +277,7 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(VM& vm, DateTimeF
|
|||
|
||||
// d. Set formatOptions.[[<prop>]] to value.
|
||||
if (!value.is_undefined()) {
|
||||
option = ::Locale::calendar_pattern_style_from_string(value.as_string().deprecated_string());
|
||||
option = ::Locale::calendar_pattern_style_from_string(TRY(value.as_string().deprecated_string()));
|
||||
|
||||
// e. If value is not undefined, then
|
||||
// i. Set hasExplicitFormatComponents to true.
|
||||
|
@ -296,14 +296,14 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(VM& vm, DateTimeF
|
|||
|
||||
// 39. Set dateTimeFormat.[[DateStyle]] to dateStyle.
|
||||
if (!date_style.is_undefined())
|
||||
date_time_format.set_date_style(date_style.as_string().deprecated_string());
|
||||
date_time_format.set_date_style(TRY(date_style.as_string().deprecated_string()));
|
||||
|
||||
// 40. Let timeStyle be ? GetOption(options, "timeStyle", "string", « "full", "long", "medium", "short" », undefined).
|
||||
auto time_style = TRY(get_option(vm, *options, vm.names.timeStyle, OptionType::String, AK::Array { "full"sv, "long"sv, "medium"sv, "short"sv }, Empty {}));
|
||||
|
||||
// 41. Set dateTimeFormat.[[TimeStyle]] to timeStyle.
|
||||
if (!time_style.is_undefined())
|
||||
date_time_format.set_time_style(time_style.as_string().deprecated_string());
|
||||
date_time_format.set_time_style(TRY(time_style.as_string().deprecated_string()));
|
||||
|
||||
Optional<::Locale::CalendarPattern> best_format {};
|
||||
|
||||
|
@ -325,7 +325,7 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(VM& vm, DateTimeF
|
|||
auto formats = ::Locale::get_calendar_available_formats(data_locale, date_time_format.calendar());
|
||||
|
||||
// b. If matcher is "basic", then
|
||||
if (matcher.as_string().deprecated_string() == "basic"sv) {
|
||||
if (TRY(matcher.as_string().deprecated_string()) == "basic"sv) {
|
||||
// i. Let bestFormat be BasicFormatMatcher(formatOptions, formats).
|
||||
best_format = basic_format_matcher(format_options, move(formats));
|
||||
}
|
||||
|
|
|
@ -76,13 +76,13 @@ ThrowCompletionOr<NonnullGCPtr<Object>> DisplayNamesConstructor::construct(Funct
|
|||
opt.locale_matcher = matcher;
|
||||
|
||||
// 10. Let r be ResolveLocale(%DisplayNames%.[[AvailableLocales]], requestedLocales, opt, %DisplayNames%.[[RelevantExtensionKeys]]).
|
||||
auto result = resolve_locale(requested_locales, opt, {});
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, {}));
|
||||
|
||||
// 11. Let style be ? GetOption(options, "style", "string", « "narrow", "short", "long" », "long").
|
||||
auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "narrow"sv, "short"sv, "long"sv }, "long"sv));
|
||||
|
||||
// 12. Set displayNames.[[Style]] to style.
|
||||
display_names->set_style(style.as_string().deprecated_string());
|
||||
display_names->set_style(TRY(style.as_string().deprecated_string()));
|
||||
|
||||
// 13. Let type be ? GetOption(options, "type", "string", « "language", "region", "script", "currency", "calendar", "dateTimeField" », undefined).
|
||||
auto type = TRY(get_option(vm, *options, vm.names.type, OptionType::String, { "language"sv, "region"sv, "script"sv, "currency"sv, "calendar"sv, "dateTimeField"sv }, Empty {}));
|
||||
|
@ -92,13 +92,13 @@ ThrowCompletionOr<NonnullGCPtr<Object>> DisplayNamesConstructor::construct(Funct
|
|||
return vm.throw_completion<TypeError>(ErrorType::IsUndefined, "options.type"sv);
|
||||
|
||||
// 15. Set displayNames.[[Type]] to type.
|
||||
display_names->set_type(type.as_string().deprecated_string());
|
||||
display_names->set_type(TRY(type.as_string().deprecated_string()));
|
||||
|
||||
// 16. Let fallback be ? GetOption(options, "fallback", "string", « "code", "none" », "code").
|
||||
auto fallback = TRY(get_option(vm, *options, vm.names.fallback, OptionType::String, { "code"sv, "none"sv }, "code"sv));
|
||||
|
||||
// 17. Set displayNames.[[Fallback]] to fallback.
|
||||
display_names->set_fallback(fallback.as_string().deprecated_string());
|
||||
display_names->set_fallback(TRY(fallback.as_string().deprecated_string()));
|
||||
|
||||
// 18. Set displayNames.[[Locale]] to r.[[locale]].
|
||||
display_names->set_locale(move(result.locale));
|
||||
|
@ -119,7 +119,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> DisplayNamesConstructor::construct(Funct
|
|||
// 26. If type is "language", then
|
||||
if (display_names->type() == DisplayNames::Type::Language) {
|
||||
// a. Set displayNames.[[LanguageDisplay]] to languageDisplay.
|
||||
display_names->set_language_display(language_display.as_string().deprecated_string());
|
||||
display_names->set_language_display(TRY(language_display.as_string().deprecated_string()));
|
||||
|
||||
// b. Let typeFields be typeFields.[[<languageDisplay>]].
|
||||
// c. Assert: typeFields is a Record (see 12.4.3).
|
||||
|
|
|
@ -47,7 +47,7 @@ JS_DEFINE_NATIVE_FUNCTION(DisplayNamesPrototype::of)
|
|||
code = PrimitiveString::create(vm, move(code_string));
|
||||
|
||||
// 4. Let code be ? CanonicalCodeForDisplayNames(displayNames.[[Type]], code).
|
||||
code = TRY(canonical_code_for_display_names(vm, display_names->type(), code.as_string().deprecated_string()));
|
||||
code = TRY(canonical_code_for_display_names(vm, display_names->type(), TRY(code.as_string().deprecated_string())));
|
||||
|
||||
// 5. Let fields be displayNames.[[Fields]].
|
||||
// 6. If fields has a field [[<code>]], return fields.[[<code>]].
|
||||
|
@ -57,48 +57,48 @@ JS_DEFINE_NATIVE_FUNCTION(DisplayNamesPrototype::of)
|
|||
switch (display_names->type()) {
|
||||
case DisplayNames::Type::Language:
|
||||
if (display_names->language_display() == DisplayNames::LanguageDisplay::Dialect) {
|
||||
result = ::Locale::get_locale_language_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_language_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
if (result.has_value())
|
||||
break;
|
||||
}
|
||||
|
||||
if (auto locale = is_structurally_valid_language_tag(code.as_string().deprecated_string()); locale.has_value())
|
||||
if (auto locale = is_structurally_valid_language_tag(TRY(code.as_string().deprecated_string())); locale.has_value())
|
||||
formatted_result = ::Locale::format_locale_for_display(display_names->locale(), locale.release_value());
|
||||
break;
|
||||
case DisplayNames::Type::Region:
|
||||
result = ::Locale::get_locale_territory_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_territory_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case DisplayNames::Type::Script:
|
||||
result = ::Locale::get_locale_script_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_script_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case DisplayNames::Type::Currency:
|
||||
switch (display_names->style()) {
|
||||
case ::Locale::Style::Long:
|
||||
result = ::Locale::get_locale_long_currency_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_long_currency_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case ::Locale::Style::Short:
|
||||
result = ::Locale::get_locale_short_currency_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_short_currency_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case ::Locale::Style::Narrow:
|
||||
result = ::Locale::get_locale_narrow_currency_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_narrow_currency_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
break;
|
||||
case DisplayNames::Type::Calendar:
|
||||
result = ::Locale::get_locale_calendar_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_calendar_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case DisplayNames::Type::DateTimeField:
|
||||
switch (display_names->style()) {
|
||||
case ::Locale::Style::Long:
|
||||
result = ::Locale::get_locale_long_date_field_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_long_date_field_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case ::Locale::Style::Short:
|
||||
result = ::Locale::get_locale_short_date_field_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_short_date_field_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
case ::Locale::Style::Narrow:
|
||||
result = ::Locale::get_locale_narrow_date_field_mapping(display_names->locale(), code.as_string().deprecated_string());
|
||||
result = ::Locale::get_locale_narrow_date_field_mapping(display_names->locale(), TRY(code.as_string().deprecated_string()));
|
||||
break;
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
|
|
|
@ -308,7 +308,7 @@ ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM& vm, Depreca
|
|||
}
|
||||
}
|
||||
} else {
|
||||
style = style_value.as_string().deprecated_string();
|
||||
style = TRY(style_value.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 4. Let displayField be the string-concatenation of unit and "Display".
|
||||
|
@ -332,7 +332,7 @@ ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM& vm, Depreca
|
|||
}
|
||||
|
||||
// 7. Return the Record { [[Style]]: style, [[Display]]: display }.
|
||||
return DurationUnitOptions { .style = move(style), .display = display.as_string().deprecated_string() };
|
||||
return DurationUnitOptions { .style = move(style), .display = TRY(display.as_string().deprecated_string()) };
|
||||
}
|
||||
|
||||
// 1.1.7 PartitionDurationFormatPattern ( durationFormat, duration ), https://tc39.es/proposal-intl-duration-format/#sec-partitiondurationformatpattern
|
||||
|
|
|
@ -67,17 +67,17 @@ ThrowCompletionOr<NonnullGCPtr<Object>> DurationFormatConstructor::construct(Fun
|
|||
// 7. If numberingSystem is not undefined, then
|
||||
if (!numbering_system.is_undefined()) {
|
||||
// a. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception.
|
||||
if (!::Locale::is_type_identifier(numbering_system.as_string().deprecated_string()))
|
||||
if (!::Locale::is_type_identifier(TRY(numbering_system.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, numbering_system, "numberingSystem"sv);
|
||||
}
|
||||
|
||||
// 8. Let opt be the Record { [[localeMatcher]]: matcher, [[nu]]: numberingSystem }.
|
||||
LocaleOptions opt {};
|
||||
opt.locale_matcher = matcher;
|
||||
opt.nu = numbering_system.is_undefined() ? Optional<DeprecatedString>() : numbering_system.as_string().deprecated_string();
|
||||
opt.nu = numbering_system.is_undefined() ? Optional<DeprecatedString>() : TRY(numbering_system.as_string().deprecated_string());
|
||||
|
||||
// 9. Let r be ResolveLocale(%DurationFormat%.[[AvailableLocales]], requestedLocales, opt, %DurationFormat%.[[RelevantExtensionKeys]], %DurationFormat%.[[LocaleData]]).
|
||||
auto result = resolve_locale(requested_locales, opt, DurationFormat::relevant_extension_keys());
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, DurationFormat::relevant_extension_keys()));
|
||||
|
||||
// 10. Let locale be r.[[locale]].
|
||||
auto locale = move(result.locale);
|
||||
|
@ -93,7 +93,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> DurationFormatConstructor::construct(Fun
|
|||
auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv, "digital"sv }, "short"sv));
|
||||
|
||||
// 14. Set durationFormat.[[Style]] to style.
|
||||
duration_format->set_style(style.as_string().deprecated_string());
|
||||
duration_format->set_style(TRY(style.as_string().deprecated_string()));
|
||||
|
||||
// 15. Set durationFormat.[[DataLocale]] to r.[[dataLocale]].
|
||||
duration_format->set_data_locale(move(result.data_locale));
|
||||
|
@ -119,7 +119,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> DurationFormatConstructor::construct(Fun
|
|||
auto digital_base = duration_instances_component.digital_default;
|
||||
|
||||
// f. Let unitOptions be ? GetDurationUnitOptions(unit, options, style, valueList, digitalBase, prevStyle).
|
||||
auto unit_options = TRY(get_duration_unit_options(vm, unit, *options, style.as_string().deprecated_string(), value_list, digital_base, previous_style));
|
||||
auto unit_options = TRY(get_duration_unit_options(vm, unit, *options, TRY(style.as_string().deprecated_string()), value_list, digital_base, previous_style));
|
||||
|
||||
// g. Set the value of the styleSlot slot of durationFormat to unitOptions.[[Style]].
|
||||
(duration_format->*style_slot)(unit_options.style);
|
||||
|
|
|
@ -274,7 +274,7 @@ ThrowCompletionOr<Vector<DeprecatedString>> string_list_from_iterable(VM& vm, Va
|
|||
}
|
||||
|
||||
// iii. Append nextValue to the end of the List list.
|
||||
list.append(next_value.as_string().deprecated_string());
|
||||
list.append(TRY(next_value.as_string().deprecated_string()));
|
||||
}
|
||||
} while (next != nullptr);
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> ListFormatConstructor::construct(Functio
|
|||
// 8. Let localeData be %ListFormat%.[[LocaleData]].
|
||||
|
||||
// 9. Let r be ResolveLocale(%ListFormat%.[[AvailableLocales]], requestedLocales, opt, %ListFormat%.[[RelevantExtensionKeys]], localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, {});
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, {}));
|
||||
|
||||
// 10. Set listFormat.[[Locale]] to r.[[locale]].
|
||||
list_format->set_locale(move(result.locale));
|
||||
|
@ -80,13 +80,13 @@ ThrowCompletionOr<NonnullGCPtr<Object>> ListFormatConstructor::construct(Functio
|
|||
auto type = TRY(get_option(vm, *options, vm.names.type, OptionType::String, { "conjunction"sv, "disjunction"sv, "unit"sv }, "conjunction"sv));
|
||||
|
||||
// 12. Set listFormat.[[Type]] to type.
|
||||
list_format->set_type(type.as_string().deprecated_string());
|
||||
list_format->set_type(TRY(type.as_string().deprecated_string()));
|
||||
|
||||
// 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow" », "long").
|
||||
auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv }, "long"sv));
|
||||
|
||||
// 14. Set listFormat.[[Style]] to style.
|
||||
list_format->set_style(style.as_string().deprecated_string());
|
||||
list_format->set_style(TRY(style.as_string().deprecated_string()));
|
||||
|
||||
// Note: The remaining steps are skipped in favor of deferring to LibUnicode.
|
||||
|
||||
|
|
|
@ -33,10 +33,10 @@ static ThrowCompletionOr<Optional<DeprecatedString>> get_string_option(VM& vm, O
|
|||
if (option.is_undefined())
|
||||
return Optional<DeprecatedString> {};
|
||||
|
||||
if (validator && !validator(option.as_string().deprecated_string()))
|
||||
if (validator && !validator(TRY(option.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, option, property);
|
||||
|
||||
return option.as_string().deprecated_string();
|
||||
return TRY(option.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 14.1.2 ApplyOptionsToTag ( tag, options ), https://tc39.es/ecma402/#sec-apply-options-to-tag
|
||||
|
|
|
@ -1604,7 +1604,7 @@ ThrowCompletionOr<MathematicalValue> to_intl_mathematical_value(VM& vm, Value va
|
|||
|
||||
// 3. If Type(primValue) is String,
|
||||
// a. Let str be primValue.
|
||||
auto const& string = primitive_value.as_string().deprecated_string();
|
||||
auto const& string = TRY(primitive_value.as_string().deprecated_string());
|
||||
|
||||
// Step 4 handled separately by the FIXME above.
|
||||
|
||||
|
|
|
@ -103,16 +103,16 @@ ThrowCompletionOr<NumberFormat*> initialize_number_format(VM& vm, NumberFormat&
|
|||
// 7. If numberingSystem is not undefined, then
|
||||
if (!numbering_system.is_undefined()) {
|
||||
// a. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception.
|
||||
if (!::Locale::is_type_identifier(numbering_system.as_string().deprecated_string()))
|
||||
if (!::Locale::is_type_identifier(TRY(numbering_system.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, numbering_system, "numberingSystem"sv);
|
||||
|
||||
// 8. Set opt.[[nu]] to numberingSystem.
|
||||
opt.nu = numbering_system.as_string().deprecated_string();
|
||||
opt.nu = TRY(numbering_system.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 9. Let localeData be %NumberFormat%.[[LocaleData]].
|
||||
// 10. Let r be ResolveLocale(%NumberFormat%.[[AvailableLocales]], requestedLocales, opt, %NumberFormat%.[[RelevantExtensionKeys]], localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, NumberFormat::relevant_extension_keys());
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, NumberFormat::relevant_extension_keys()));
|
||||
|
||||
// 11. Set numberFormat.[[Locale]] to r.[[locale]].
|
||||
number_format.set_locale(move(result.locale));
|
||||
|
@ -176,7 +176,7 @@ ThrowCompletionOr<NumberFormat*> initialize_number_format(VM& vm, NumberFormat&
|
|||
auto notation = TRY(get_option(vm, *options, vm.names.notation, OptionType::String, { "standard"sv, "scientific"sv, "engineering"sv, "compact"sv }, "standard"sv));
|
||||
|
||||
// 22. Set numberFormat.[[Notation]] to notation.
|
||||
number_format.set_notation(notation.as_string().deprecated_string());
|
||||
number_format.set_notation(TRY(notation.as_string().deprecated_string()));
|
||||
|
||||
// 23. Perform ? SetNumberFormatDigitOptions(numberFormat, options, mnfdDefault, mxfdDefault, notation).
|
||||
TRY(set_number_format_digit_options(vm, number_format, *options, default_min_fraction_digits, default_max_fraction_digits, number_format.notation()));
|
||||
|
@ -199,7 +199,7 @@ ThrowCompletionOr<NumberFormat*> initialize_number_format(VM& vm, NumberFormat&
|
|||
auto trailing_zero_display = TRY(get_option(vm, *options, vm.names.trailingZeroDisplay, OptionType::String, { "auto"sv, "stripIfInteger"sv }, "auto"sv));
|
||||
|
||||
// 27. Set numberFormat.[[TrailingZeroDisplay]] to trailingZeroDisplay.
|
||||
number_format.set_trailing_zero_display(trailing_zero_display.as_string().deprecated_string());
|
||||
number_format.set_trailing_zero_display(TRY(trailing_zero_display.as_string().deprecated_string()));
|
||||
|
||||
// 28. Let compactDisplay be ? GetOption(options, "compactDisplay", "string", « "short", "long" », "short").
|
||||
auto compact_display = TRY(get_option(vm, *options, vm.names.compactDisplay, OptionType::String, { "short"sv, "long"sv }, "short"sv));
|
||||
|
@ -210,7 +210,7 @@ ThrowCompletionOr<NumberFormat*> initialize_number_format(VM& vm, NumberFormat&
|
|||
// 30. If notation is "compact", then
|
||||
if (number_format.notation() == NumberFormat::Notation::Compact) {
|
||||
// a. Set numberFormat.[[CompactDisplay]] to compactDisplay.
|
||||
number_format.set_compact_display(compact_display.as_string().deprecated_string());
|
||||
number_format.set_compact_display(TRY(compact_display.as_string().deprecated_string()));
|
||||
|
||||
// b. Set defaultUseGrouping to "min2".
|
||||
default_use_grouping = "min2"sv;
|
||||
|
@ -226,13 +226,13 @@ ThrowCompletionOr<NumberFormat*> initialize_number_format(VM& vm, NumberFormat&
|
|||
auto sign_display = TRY(get_option(vm, *options, vm.names.signDisplay, OptionType::String, { "auto"sv, "never"sv, "always"sv, "exceptZero"sv, "negative"sv }, "auto"sv));
|
||||
|
||||
// 34. Set numberFormat.[[SignDisplay]] to signDisplay.
|
||||
number_format.set_sign_display(sign_display.as_string().deprecated_string());
|
||||
number_format.set_sign_display(TRY(sign_display.as_string().deprecated_string()));
|
||||
|
||||
// 35. Let roundingMode be ? GetOption(options, "roundingMode", "string", « "ceil", "floor", "expand", "trunc", "halfCeil", "halfFloor", "halfExpand", "halfTrunc", "halfEven" », "halfExpand").
|
||||
auto rounding_mode = TRY(get_option(vm, *options, vm.names.roundingMode, OptionType::String, { "ceil"sv, "floor"sv, "expand"sv, "trunc"sv, "halfCeil"sv, "halfFloor"sv, "halfExpand"sv, "halfTrunc"sv, "halfEven"sv }, "halfExpand"sv));
|
||||
|
||||
// 36. Set numberFormat.[[RoundingMode]] to roundingMode.
|
||||
number_format.set_rounding_mode(rounding_mode.as_string().deprecated_string());
|
||||
number_format.set_rounding_mode(TRY(rounding_mode.as_string().deprecated_string()));
|
||||
|
||||
// 37. Return numberFormat.
|
||||
return &number_format;
|
||||
|
@ -282,7 +282,7 @@ ThrowCompletionOr<void> set_number_format_digit_options(VM& vm, NumberFormatBase
|
|||
bool need_fraction_digits = true;
|
||||
|
||||
// 14. If roundingPriority is "auto", then
|
||||
if (rounding_priority.as_string().deprecated_string() == "auto"sv) {
|
||||
if (TRY(rounding_priority.as_string().deprecated_string()) == "auto"sv) {
|
||||
// a. Set needSd to hasSd.
|
||||
need_significant_digits = has_significant_digits;
|
||||
|
||||
|
@ -358,12 +358,12 @@ ThrowCompletionOr<void> set_number_format_digit_options(VM& vm, NumberFormatBase
|
|||
// 17. If needSd is true or needFd is true, then
|
||||
if (need_significant_digits || need_fraction_digits) {
|
||||
// a. If roundingPriority is "morePrecision", then
|
||||
if (rounding_priority.as_string().deprecated_string() == "morePrecision"sv) {
|
||||
if (TRY(rounding_priority.as_string().deprecated_string()) == "morePrecision"sv) {
|
||||
// i. Set intlObj.[[RoundingType]] to morePrecision.
|
||||
intl_object.set_rounding_type(NumberFormatBase::RoundingType::MorePrecision);
|
||||
}
|
||||
// b. Else if roundingPriority is "lessPrecision", then
|
||||
else if (rounding_priority.as_string().deprecated_string() == "lessPrecision"sv) {
|
||||
else if (TRY(rounding_priority.as_string().deprecated_string()) == "lessPrecision"sv) {
|
||||
// i. Set intlObj.[[RoundingType]] to lessPrecision.
|
||||
intl_object.set_rounding_type(NumberFormatBase::RoundingType::LessPrecision);
|
||||
}
|
||||
|
@ -410,7 +410,7 @@ ThrowCompletionOr<void> set_number_format_unit_options(VM& vm, NumberFormat& int
|
|||
auto style = TRY(get_option(vm, options, vm.names.style, OptionType::String, { "decimal"sv, "percent"sv, "currency"sv, "unit"sv }, "decimal"sv));
|
||||
|
||||
// 4. Set intlObj.[[Style]] to style.
|
||||
intl_object.set_style(style.as_string().deprecated_string());
|
||||
intl_object.set_style(TRY(style.as_string().deprecated_string()));
|
||||
|
||||
// 5. Let currency be ? GetOption(options, "currency", "string", undefined, undefined).
|
||||
auto currency = TRY(get_option(vm, options, vm.names.currency, OptionType::String, {}, Empty {}));
|
||||
|
@ -423,7 +423,7 @@ ThrowCompletionOr<void> set_number_format_unit_options(VM& vm, NumberFormat& int
|
|||
}
|
||||
// 7. Else,
|
||||
// a. If ! IsWellFormedCurrencyCode(currency) is false, throw a RangeError exception.
|
||||
else if (!is_well_formed_currency_code(currency.as_string().deprecated_string()))
|
||||
else if (!is_well_formed_currency_code(TRY(currency.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, currency, "currency"sv);
|
||||
|
||||
// 8. Let currencyDisplay be ? GetOption(options, "currencyDisplay", "string", « "code", "symbol", "narrowSymbol", "name" », "symbol").
|
||||
|
@ -443,7 +443,7 @@ ThrowCompletionOr<void> set_number_format_unit_options(VM& vm, NumberFormat& int
|
|||
}
|
||||
// 12. Else,
|
||||
// a. If ! IsWellFormedUnitIdentifier(unit) is false, throw a RangeError exception.
|
||||
else if (!is_well_formed_unit_identifier(unit.as_string().deprecated_string()))
|
||||
else if (!is_well_formed_unit_identifier(TRY(unit.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, unit, "unit"sv);
|
||||
|
||||
// 13. Let unitDisplay be ? GetOption(options, "unitDisplay", "string", « "short", "narrow", "long" », "short").
|
||||
|
@ -452,22 +452,22 @@ ThrowCompletionOr<void> set_number_format_unit_options(VM& vm, NumberFormat& int
|
|||
// 14. If style is "currency", then
|
||||
if (intl_object.style() == NumberFormat::Style::Currency) {
|
||||
// a. Set intlObj.[[Currency]] to the ASCII-uppercase of currency.
|
||||
intl_object.set_currency(currency.as_string().deprecated_string().to_uppercase());
|
||||
intl_object.set_currency(TRY(currency.as_string().deprecated_string()).to_uppercase());
|
||||
|
||||
// c. Set intlObj.[[CurrencyDisplay]] to currencyDisplay.
|
||||
intl_object.set_currency_display(currency_display.as_string().deprecated_string());
|
||||
intl_object.set_currency_display(TRY(currency_display.as_string().deprecated_string()));
|
||||
|
||||
// d. Set intlObj.[[CurrencySign]] to currencySign.
|
||||
intl_object.set_currency_sign(currency_sign.as_string().deprecated_string());
|
||||
intl_object.set_currency_sign(TRY(currency_sign.as_string().deprecated_string()));
|
||||
}
|
||||
|
||||
// 15. If style is "unit", then
|
||||
if (intl_object.style() == NumberFormat::Style::Unit) {
|
||||
// a. Set intlObj.[[Unit]] to unit.
|
||||
intl_object.set_unit(unit.as_string().deprecated_string());
|
||||
intl_object.set_unit(TRY(unit.as_string().deprecated_string()));
|
||||
|
||||
// b. Set intlObj.[[UnitDisplay]] to unitDisplay.
|
||||
intl_object.set_unit_display(unit_display.as_string().deprecated_string());
|
||||
intl_object.set_unit_display(TRY(unit_display.as_string().deprecated_string()));
|
||||
}
|
||||
|
||||
return {};
|
||||
|
|
|
@ -94,14 +94,14 @@ ThrowCompletionOr<PluralRules*> initialize_plural_rules(VM& vm, PluralRules& plu
|
|||
auto type = TRY(get_option(vm, *options, vm.names.type, OptionType::String, AK::Array { "cardinal"sv, "ordinal"sv }, "cardinal"sv));
|
||||
|
||||
// 7. Set pluralRules.[[Type]] to t.
|
||||
plural_rules.set_type(type.as_string().deprecated_string());
|
||||
plural_rules.set_type(TRY(type.as_string().deprecated_string()));
|
||||
|
||||
// 8. Perform ? SetNumberFormatDigitOptions(pluralRules, options, +0𝔽, 3𝔽, "standard").
|
||||
TRY(set_number_format_digit_options(vm, plural_rules, *options, 0, 3, NumberFormat::Notation::Standard));
|
||||
|
||||
// 9. Let localeData be %PluralRules%.[[LocaleData]].
|
||||
// 10. Let r be ResolveLocale(%PluralRules%.[[AvailableLocales]], requestedLocales, opt, %PluralRules%.[[RelevantExtensionKeys]], localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, {});
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, {}));
|
||||
|
||||
// 11. Set pluralRules.[[Locale]] to r.[[locale]].
|
||||
plural_rules.set_locale(move(result.locale));
|
||||
|
|
|
@ -101,16 +101,16 @@ ThrowCompletionOr<RelativeTimeFormat*> initialize_relative_time_format(VM& vm, R
|
|||
// 7. If numberingSystem is not undefined, then
|
||||
if (!numbering_system.is_undefined()) {
|
||||
// a. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception.
|
||||
if (!::Locale::is_type_identifier(numbering_system.as_string().deprecated_string()))
|
||||
if (!::Locale::is_type_identifier(TRY(numbering_system.as_string().deprecated_string())))
|
||||
return vm.throw_completion<RangeError>(ErrorType::OptionIsNotValidValue, numbering_system, "numberingSystem"sv);
|
||||
|
||||
// 8. Set opt.[[nu]] to numberingSystem.
|
||||
opt.nu = numbering_system.as_string().deprecated_string();
|
||||
opt.nu = TRY(numbering_system.as_string().deprecated_string());
|
||||
}
|
||||
|
||||
// 9. Let localeData be %RelativeTimeFormat%.[[LocaleData]].
|
||||
// 10. Let r be ResolveLocale(%RelativeTimeFormat%.[[AvailableLocales]], requestedLocales, opt, %RelativeTimeFormat%.[[RelevantExtensionKeys]], localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, RelativeTimeFormat::relevant_extension_keys());
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, RelativeTimeFormat::relevant_extension_keys()));
|
||||
|
||||
// 11. Let locale be r.[[locale]].
|
||||
auto locale = move(result.locale);
|
||||
|
@ -129,13 +129,13 @@ ThrowCompletionOr<RelativeTimeFormat*> initialize_relative_time_format(VM& vm, R
|
|||
auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv }, "long"sv));
|
||||
|
||||
// 16. Set relativeTimeFormat.[[Style]] to style.
|
||||
relative_time_format.set_style(style.as_string().deprecated_string());
|
||||
relative_time_format.set_style(TRY(style.as_string().deprecated_string()));
|
||||
|
||||
// 17. Let numeric be ? GetOption(options, "numeric", "string", « "always", "auto" », "always").
|
||||
auto numeric = TRY(get_option(vm, *options, vm.names.numeric, OptionType::String, { "always"sv, "auto"sv }, "always"sv));
|
||||
|
||||
// 18. Set relativeTimeFormat.[[Numeric]] to numeric.
|
||||
relative_time_format.set_numeric(numeric.as_string().deprecated_string());
|
||||
relative_time_format.set_numeric(TRY(numeric.as_string().deprecated_string()));
|
||||
|
||||
// 19. Let relativeTimeFormat.[[NumberFormat]] be ! Construct(%NumberFormat%, « locale »).
|
||||
auto number_format = MUST(construct(vm, *realm.intrinsics().intl_number_format_constructor(), PrimitiveString::create(vm, locale)));
|
||||
|
|
|
@ -60,7 +60,7 @@ JS_DEFINE_NATIVE_FUNCTION(SegmentIteratorPrototype::next)
|
|||
iterator->set_iterated_string_next_segment_code_unit_index(end_index);
|
||||
|
||||
// 9. Let segmentData be ! CreateSegmentDataObject(segmenter, string, startIndex, endIndex).
|
||||
auto* segment_data = create_segment_data_object(vm, segmenter, string, start_index, end_index);
|
||||
auto segment_data = TRY(create_segment_data_object(vm, segmenter, string, start_index, end_index));
|
||||
|
||||
// 10. Return CreateIterResultObject(segmentData, false).
|
||||
return create_iterator_result_object(vm, segment_data, false);
|
||||
|
|
|
@ -45,7 +45,7 @@ StringView Segmenter::segmenter_granularity_string() const
|
|||
}
|
||||
|
||||
// 18.7.1 CreateSegmentDataObject ( segmenter, string, startIndex, endIndex ), https://tc39.es/ecma402/#sec-createsegmentdataobject
|
||||
Object* create_segment_data_object(VM& vm, Segmenter const& segmenter, Utf16View const& string, double start_index, double end_index)
|
||||
ThrowCompletionOr<NonnullGCPtr<Object>> create_segment_data_object(VM& vm, Segmenter const& segmenter, Utf16View const& string, double start_index, double end_index)
|
||||
{
|
||||
auto& realm = *vm.current_realm();
|
||||
|
||||
|
@ -68,13 +68,13 @@ Object* create_segment_data_object(VM& vm, Segmenter const& segmenter, Utf16View
|
|||
auto segment = string.substring_view(start_index, end_index - start_index);
|
||||
|
||||
// 7. Perform ! CreateDataPropertyOrThrow(result, "segment", segment).
|
||||
MUST(result->create_data_property_or_throw(vm.names.segment, PrimitiveString::create(vm, segment)));
|
||||
MUST(result->create_data_property_or_throw(vm.names.segment, PrimitiveString::create(vm, TRY(Utf16String::create(vm, segment)))));
|
||||
|
||||
// 8. Perform ! CreateDataPropertyOrThrow(result, "index", 𝔽(startIndex)).
|
||||
MUST(result->create_data_property_or_throw(vm.names.index, Value(start_index)));
|
||||
|
||||
// 9. Perform ! CreateDataPropertyOrThrow(result, "input", string).
|
||||
MUST(result->create_data_property_or_throw(vm.names.input, PrimitiveString::create(vm, string)));
|
||||
MUST(result->create_data_property_or_throw(vm.names.input, PrimitiveString::create(vm, TRY(Utf16String::create(vm, string)))));
|
||||
|
||||
// 10. Let granularity be segmenter.[[SegmenterGranularity]].
|
||||
auto granularity = segmenter.segmenter_granularity();
|
||||
|
|
|
@ -37,7 +37,7 @@ private:
|
|||
SegmenterGranularity m_segmenter_granularity { SegmenterGranularity::Grapheme }; // [[SegmenterGranularity]]
|
||||
};
|
||||
|
||||
Object* create_segment_data_object(VM&, Segmenter const&, Utf16View const&, double start_index, double end_index);
|
||||
ThrowCompletionOr<NonnullGCPtr<Object>> create_segment_data_object(VM&, Segmenter const&, Utf16View const&, double start_index, double end_index);
|
||||
enum class Direction {
|
||||
Before,
|
||||
After,
|
||||
|
|
|
@ -71,7 +71,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> SegmenterConstructor::construct(Function
|
|||
// 9. Let localeData be %Segmenter%.[[LocaleData]].
|
||||
|
||||
// 10. Let r be ResolveLocale(%Segmenter%.[[AvailableLocales]], requestedLocales, opt, %Segmenter%.[[RelevantExtensionKeys]], localeData).
|
||||
auto result = resolve_locale(requested_locales, opt, {});
|
||||
auto result = TRY(resolve_locale(requested_locales, opt, {}));
|
||||
|
||||
// 11. Set segmenter.[[Locale]] to r.[[locale]].
|
||||
segmenter->set_locale(move(result.locale));
|
||||
|
@ -80,7 +80,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> SegmenterConstructor::construct(Function
|
|||
auto granularity = TRY(get_option(vm, *options, vm.names.granularity, OptionType::String, { "grapheme"sv, "word"sv, "sentence"sv }, "grapheme"sv));
|
||||
|
||||
// 13. Set segmenter.[[SegmenterGranularity]] to granularity.
|
||||
segmenter->set_segmenter_granularity(granularity.as_string().deprecated_string());
|
||||
segmenter->set_segmenter_granularity(TRY(granularity.as_string().deprecated_string()));
|
||||
|
||||
// 14. Return segmenter.
|
||||
return segmenter;
|
||||
|
|
|
@ -58,7 +58,7 @@ JS_DEFINE_NATIVE_FUNCTION(SegmentsPrototype::containing)
|
|||
auto end_index = find_boundary(segmenter, string, n, Direction::After, segments->boundaries_cache());
|
||||
|
||||
// 10. Return ! CreateSegmentDataObject(segmenter, string, startIndex, endIndex).
|
||||
return create_segment_data_object(vm, segmenter, string, start_index, end_index);
|
||||
return TRY(create_segment_data_object(vm, segmenter, string, start_index, end_index));
|
||||
}
|
||||
|
||||
// 18.5.2.2 %SegmentsPrototype% [ @@iterator ] ( ), https://tc39.es/ecma402/#sec-%segmentsprototype%-@@iterator
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue