6#error Internationalization is expected to be enabled.
26#pragma GCC diagnostic push
27#pragma GCC diagnostic ignored "-Wshadow"
28#include "unicode/dtfmtsym.h"
29#include "unicode/listformatter.h"
30#include "unicode/locid.h"
31#include "unicode/numberformatter.h"
32#include "unicode/ulistformatter.h"
33#include "unicode/unumberformatter.h"
34#pragma GCC diagnostic pop
39using temporal::DurationRecord;
44enum class StylesList { k3Styles, k4Styles, k5Styles };
57struct DurationUnitOptions {
62const std::initializer_list<const char*> kLongShortNarrowStrings = {
63 "long",
"short",
"narrow"};
64const std::initializer_list<const char*> kLongShortNarrowNumericStrings = {
65 "long",
"short",
"narrow",
"numeric"};
66const std::initializer_list<const char*> kLongShortNarrowNumeric2DigitStrings =
67 {
"long",
"short",
"narrow",
"numeric",
"2-digit"};
69const std::initializer_list<JSDurationFormat::FieldStyle>
73const std::initializer_list<JSDurationFormat::FieldStyle>
78const std::initializer_list<JSDurationFormat::FieldStyle>
79 kLongShortNarrowNumeric2DigitEnums = {
86Maybe<DurationUnitOptions> GetDurationUnitOptions(
87 Isolate* isolate, Unit
unit,
const char* unit_string,
88 const char* display_field, DirectHandle<JSReceiver> options,
90 const std::vector<const char*>& value_strings,
91 const std::vector<JSDurationFormat::FieldStyle>& value_enums,
94 const char* method_name =
"Intl.DurationFormat";
101 isolate, options, unit_string, method_name, value_strings,
113 if (
unit != Unit::kHours &&
unit != Unit::kMinutes &&
114 unit != Unit::kSeconds) {
119 style = digital_base;
127 if (
unit != Unit::kMinutes &&
unit != Unit::kSeconds) {
138 switch (base_style) {
158 if (
unit == Unit::kMilliseconds ||
unit == Unit::kMicroseconds ||
159 unit == Unit::kNanoseconds) {
173 isolate, options, display_field, method_name, {
"auto",
"always"},
184 NewRangeError(MessageTemplate::kInvalid,
185 isolate->factory()->object_string(), options),
195 NewRangeError(MessageTemplate::kInvalid,
196 isolate->factory()->object_string(), options),
210 NewRangeError(MessageTemplate::kInvalid,
211 isolate->factory()->object_string(), options),
215 if (
unit == Unit::kMinutes ||
unit == Unit::kSeconds) {
225 UErrorCode status = U_ZERO_ERROR;
226 icu::DateFormatSymbols sym(l, status);
228 icu::UnicodeString sep;
229 sym.getTimeSeparatorString(sep);
231 switch (sep.charAt(0)) {
248 Factory* factory = isolate->factory();
249 const char* method_name =
"Intl.DurationFormat";
252 std::vector<std::string> requested_locales;
254 isolate, requested_locales,
279 std::unique_ptr<char[]> numbering_system_str =
nullptr;
284 &numbering_system_str),
292 std::set<std::string> relevant_extension_keys{
"nu"};
297 requested_locales, matcher, relevant_extension_keys),
301 icu::Locale r_locale =
r.icu_locale;
302 UErrorCode status = U_ZERO_ERROR;
305 if (numbering_system_str !=
nullptr) {
306 auto nu_extension_it =
r.extensions.find(
"nu");
307 if (nu_extension_it !=
r.extensions.end() &&
308 nu_extension_it->second != numbering_system_str.get()) {
309 r_locale.setUnicodeKeywordValue(
"nu",
nullptr, status);
310 DCHECK(U_SUCCESS(status));
313 icu::Locale icu_locale = r_locale;
314 if (numbering_system_str !=
nullptr &&
316 r_locale.setUnicodeKeywordValue(
"nu", numbering_system_str.get(), status);
317 DCHECK(U_SUCCESS(status));
328 isolate, options,
"style", method_name,
329 {
"long",
"short",
"narrow",
"digital"},
338 isolate, 0, std::shared_ptr<icu::Locale>{icu_locale.clone()});
355 DurationUnitOptions years_option;
356 DurationUnitOptions months_option;
357 DurationUnitOptions weeks_option;
358 DurationUnitOptions days_option;
359 DurationUnitOptions hours_option;
360 DurationUnitOptions minutes_option;
361 DurationUnitOptions seconds_option;
362 DurationUnitOptions milliseconds_option;
363 DurationUnitOptions microseconds_option;
364 DurationUnitOptions nanoseconds_option;
366#define CALL_GET_DURATION_UNIT_OPTIONS(unit, property, strings, enums, \
367 digital_base, prev_style) \
368 MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE( \
369 isolate, property##_option, \
370 GetDurationUnitOptions( \
371 isolate, Unit::unit, #property, #property "Display", options, style, \
372 strings, enums, JSDurationFormat::FieldStyle::digital_base, \
374 DirectHandle<JSDurationFormat>());
382 kLongShortNarrowEnums,
kShort,
387 kLongShortNarrowEnums,
kShort,
392 kLongShortNarrowEnums,
kShort,
397 kLongShortNarrowEnums,
kShort,
403 kHours, hours, kLongShortNarrowNumeric2DigitStrings,
404 kLongShortNarrowNumeric2DigitEnums,
kNumeric, days_option.style)
408 kMinutes, minutes, kLongShortNarrowNumeric2DigitStrings,
409 kLongShortNarrowNumeric2DigitEnums,
kNumeric, hours_option.style)
414 kSeconds, seconds, kLongShortNarrowNumeric2DigitStrings,
415 kLongShortNarrowNumeric2DigitEnums,
kNumeric, minutes_option.style)
420 kMilliseconds, milliseconds, kLongShortNarrowNumericStrings,
421 kLongShortNarrowNumericEnums,
kNumeric, seconds_option.style)
426 kMicroseconds, microseconds, kLongShortNarrowNumericStrings,
427 kLongShortNarrowNumericEnums,
kNumeric, milliseconds_option.style)
432 kNanoseconds,
nanoseconds, kLongShortNarrowNumericStrings,
433 kLongShortNarrowNumericEnums,
kNumeric, microseconds_option.style)
435#undef CALL_GET_DURATION_UNIT_OPTIONS
441 GetNumberOption(isolate, options, factory->fractionalDigits_string(), 0,
445 icu::number::LocalizedNumberFormatter fmt =
446 icu::number::UnlocalizedNumberFormatter()
447 .roundingMode(UNUM_ROUND_HALFUP)
449 if (!numbering_system.empty() && numbering_system !=
"latn") {
450 fmt = fmt.adoptSymbols(icu::NumberingSystem::createInstanceByName(
451 numbering_system.c_str(), status));
452 DCHECK(U_SUCCESS(status));
455 managed_number_formatter =
458 std::make_shared<icu::number::LocalizedNumberFormatter>(fmt));
463 duration_format->set_style_flags(0);
464 duration_format->set_display_flags(0);
465 duration_format->set_style(
style);
466 duration_format->set_years_style(years_option.style);
467 duration_format->set_months_style(months_option.style);
468 duration_format->set_weeks_style(weeks_option.style);
469 duration_format->set_days_style(days_option.style);
470 duration_format->set_hours_style(hours_option.style);
471 duration_format->set_minutes_style(minutes_option.style);
472 duration_format->set_seconds_style(seconds_option.style);
473 duration_format->set_milliseconds_style(milliseconds_option.style);
474 duration_format->set_microseconds_style(microseconds_option.style);
475 duration_format->set_nanoseconds_style(nanoseconds_option.style);
476 duration_format->set_separator(
separator);
478 duration_format->set_years_display(years_option.display);
479 duration_format->set_months_display(months_option.display);
480 duration_format->set_weeks_display(weeks_option.display);
481 duration_format->set_days_display(days_option.display);
482 duration_format->set_hours_display(hours_option.display);
483 duration_format->set_minutes_display(minutes_option.display);
484 duration_format->set_seconds_display(seconds_option.display);
485 duration_format->set_milliseconds_display(milliseconds_option.display);
486 duration_format->set_microseconds_display(microseconds_option.display);
487 duration_format->set_nanoseconds_display(nanoseconds_option.display);
491 duration_format->set_icu_locale(*managed_locale);
492 duration_format->set_icu_number_formatter(*managed_number_formatter);
494 return duration_format;
503 return isolate->factory()->long_string();
505 return isolate->factory()->short_string();
507 return isolate->factory()->narrow_string();
509 return isolate->factory()->digital_string();
516DirectHandle<String> StyleToString(Isolate* isolate,
520 return isolate->factory()->long_string();
522 return isolate->factory()->short_string();
524 return isolate->factory()->narrow_string();
526 return isolate->factory()->numeric_string();
528 return isolate->factory()->two_digit_string();
533 return isolate->factory()->numeric_string();
542DirectHandle<String> DisplayToString(Isolate* isolate,
546 return isolate->factory()->auto_string();
548 return isolate->factory()->always_string();
559 Factory* factory = isolate->factory();
565 UErrorCode status = U_ZERO_ERROR;
566 icu::UnicodeString skeleton =
567 format->icu_number_formatter()->raw()->toSkeleton(status);
568 DCHECK(U_SUCCESS(status));
573 .ToHandle(&numbering_system));
577#define OUTPUT_PROPERTY(s, f) \
578 MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE( \
580 JSReceiver::CreateDataProperty(isolate, options, factory->s(), f, \
582 DirectHandle<JSObject>()); \
584#define OUTPUT_STYLE_PROPERTY(p) \
585 OUTPUT_PROPERTY(p##_string, StyleToString(isolate, format->p##_style()))
586#define OUTPUT_DISPLAY_PROPERTY(p) \
587 OUTPUT_PROPERTY(p##Display_string, \
588 DisplayToString(isolate, format->p##_display()))
589#define OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(p) \
590 OUTPUT_STYLE_PROPERTY(p); \
591 OUTPUT_DISPLAY_PROPERTY(p);
600 OUTPUT_PROPERTY(style_string, StyleToString(isolate, format->style()));
625#undef OUTPUT_PROPERTY
626#undef OUTPUT_STYLE_PROPERTY
627#undef OUTPUT_DISPLAY_PROPERTY
628#undef OUTPUT_STYLE_AND_DISPLAY_PROPERTIES
638 return UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT;
640 return UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME;
642 return UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW;
652 enum Type { kFormatted, kSeparator };
671bool FormattedToParts(
const char*, icu::number::FormattedNumber&,
bool,
bool,
673 std::vector<std::vector<Part>>*,
674 std::vector<icu::UnicodeString>*);
676bool Output(
const char* type,
double value,
677 const icu::number::LocalizedNumberFormatter& fmt,
bool addToLast,
678 bool display_negative_sign,
bool negative_duration,
680 std::vector<std::vector<Part>>* parts,
681 std::vector<icu::UnicodeString>* strings) {
682 icu::number::LocalizedNumberFormatter nfOpts(fmt);
684 if (display_negative_sign) {
686 display_negative_sign =
false;
688 if (value == 0.0 && negative_duration) {
694 nfOpts = nfOpts.sign(UNumberSignDisplay::UNUM_SIGN_NEVER);
697 UErrorCode status = U_ZERO_ERROR;
698 icu::number::FormattedNumber
formatted = nfOpts.formatDouble(value, status);
699 DCHECK(U_SUCCESS(status));
700 return FormattedToParts(type,
formatted, addToLast, display_negative_sign,
704bool FormattedToParts(
const char* type, icu::number::FormattedNumber&
formatted,
705 bool addToLast,
bool display_negative_sign,
707 std::vector<std::vector<Part>>* parts,
708 std::vector<icu::UnicodeString>* strings) {
709 UErrorCode status = U_ZERO_ERROR;
710 icu::UnicodeString unit_string =
formatted.toString(status);
711 DCHECK(U_SUCCESS(status));
712 Part p = {Part::Type::kFormatted, std::string(type), std::move(
formatted)};
713 if (addToLast && !strings->empty()) {
714 strings->back().append(SeparatorToChar(
separator));
715 strings->back() += unit_string;
717 if (parts !=
nullptr) {
718 icu::number::FormattedNumber dummy;
719 Part s = {Part::Type::kSeparator, std::string(), std::move(dummy)};
720 parts->back().push_back(std::move(s));
721 parts->back().push_back(std::move(p));
723 return display_negative_sign;
725 strings->push_back(unit_string);
726 if (parts !=
nullptr) {
728 v.push_back(std::move(p));
729 parts->push_back(std::move(v));
731 return display_negative_sign;
734bool OutputLongShortOrNarrow(
const char* type,
double value,
736 const icu::number::LocalizedNumberFormatter& fmt,
737 bool addToLast,
bool display_negative_sign,
738 bool negative_duration,
740 std::vector<std::vector<Part>>* parts,
741 std::vector<icu::UnicodeString>* strings) {
743 return display_negative_sign;
744 return Output(type, value, fmt, addToLast, display_negative_sign,
745 negative_duration,
separator, parts, strings);
748bool OutputLongShortNarrowOrNumeric(
751 const icu::number::LocalizedNumberFormatter& fmt, icu::MeasureUnit
unit,
752 bool addToLast,
bool display_negative_sign,
bool negative_duration,
754 std::vector<std::vector<Part>>* parts,
755 std::vector<icu::UnicodeString>* strings) {
757 return display_negative_sign;
759 return Output(type, value,
760 fmt.grouping(UNumberGroupingStrategy::UNUM_GROUPING_OFF),
761 addToLast, display_negative_sign, negative_duration,
764 return OutputLongShortOrNarrow(
766 addToLast, display_negative_sign, negative_duration,
separator, parts,
770bool OutputLongShortNarrowNumericOr2Digit(
773 const icu::number::LocalizedNumberFormatter& fmt, icu::MeasureUnit
unit,
774 bool maybeAddToLast,
bool displayRequired,
bool display_negative_sign,
776 std::vector<std::vector<Part>>* parts,
777 std::vector<icu::UnicodeString>* strings) {
783 return Output(type, value,
784 fmt.integerWidth(icu::number::IntegerWidth::zeroFillTo(2))
785 .grouping(UNumberGroupingStrategy::UNUM_GROUPING_OFF),
786 maybeAddToLast, display_negative_sign, negative_duration,
791 return OutputLongShortNarrowOrNumeric(
793 display_negative_sign, negative_duration,
separator, parts, strings);
795 return display_negative_sign;
798bool DisplayRequired(DirectHandle<JSDurationFormat> df,
799 const DurationRecord&
record) {
827void DurationRecordToListOfFormattedNumber(
828 DirectHandle<JSDurationFormat> df,
829 const icu::number::LocalizedNumberFormatter& fmt,
830 const DurationRecord&
record, std::vector<std::vector<Part>>* parts,
831 std::vector<icu::UnicodeString>* strings) {
834 bool display_negative_sign =
true;
837 display_negative_sign = OutputLongShortOrNarrow(
839 fmt.unit(icu::MeasureUnit::getYear())
840 .unitWidth(ToUNumberUnitWidth(df->years_style())),
841 false, display_negative_sign, negative_duration,
separator, parts,
843 display_negative_sign = OutputLongShortOrNarrow(
845 fmt.unit(icu::MeasureUnit::getMonth())
846 .unitWidth(ToUNumberUnitWidth(df->months_style())),
847 false, display_negative_sign, negative_duration,
separator, parts,
849 display_negative_sign = OutputLongShortOrNarrow(
851 fmt.unit(icu::MeasureUnit::getWeek())
852 .unitWidth(ToUNumberUnitWidth(df->weeks_style())),
853 false, display_negative_sign, negative_duration,
separator, parts,
855 display_negative_sign = OutputLongShortOrNarrow(
857 fmt.unit(icu::MeasureUnit::getDay())
858 .unitWidth(ToUNumberUnitWidth(df->days_style())),
859 false, display_negative_sign, negative_duration,
separator, parts,
861 display_negative_sign = OutputLongShortNarrowNumericOr2Digit(
863 df->hours_style(), fmt, icu::MeasureUnit::getHour(),
false,
false,
864 display_negative_sign, negative_duration,
separator, parts, strings);
865 bool minuteCouldAddToLast =
868 display_negative_sign = OutputLongShortNarrowNumericOr2Digit(
870 df->minutes_style(), fmt, icu::MeasureUnit::getMinute(),
871 minuteCouldAddToLast, DisplayRequired(df,
record), display_negative_sign,
872 negative_duration,
separator, parts, strings);
873 int32_t fractional_digits = df->fractional_digits();
879 maximumFractionDigits = 9;
881 minimumFractionDigits = 0;
884 maximumFractionDigits = fractional_digits;
886 minimumFractionDigits = fractional_digits;
892 icu::number::LocalizedNumberFormatter nfOps =
893 fmt.precision(icu::number::Precision::minMaxFraction(
894 minimumFractionDigits, maximumFractionDigits))
897 .roundingMode(UNumberFormatRoundingMode::UNUM_ROUND_DOWN);
906 OutputLongShortNarrowNumericOr2Digit(
907 "second", value, df->seconds_display(), df->seconds_style(), nfOps,
908 icu::MeasureUnit::getSecond(),
true,
false, display_negative_sign,
909 negative_duration,
separator, parts, strings);
912 display_negative_sign = OutputLongShortNarrowNumericOr2Digit(
914 df->seconds_style(), fmt, icu::MeasureUnit::getSecond(),
true,
false,
915 display_negative_sign, negative_duration,
separator, parts, strings);
923 OutputLongShortNarrowOrNumeric(
924 "millisecond", value, df->milliseconds_display(),
925 df->milliseconds_style(), nfOps, icu::MeasureUnit::getMillisecond(),
926 false, display_negative_sign, negative_duration,
separator, parts,
930 display_negative_sign = OutputLongShortNarrowOrNumeric(
932 df->milliseconds_display(), df->milliseconds_style(), fmt,
933 icu::MeasureUnit::getMillisecond(),
false, display_negative_sign,
934 negative_duration,
separator, parts, strings);
940 OutputLongShortNarrowOrNumeric(
941 "microsecond", value, df->microseconds_display(),
942 df->microseconds_style(), nfOps, icu::MeasureUnit::getMicrosecond(),
943 false, display_negative_sign, negative_duration,
separator, parts,
947 display_negative_sign = OutputLongShortNarrowOrNumeric(
949 df->microseconds_display(), df->microseconds_style(), fmt,
950 icu::MeasureUnit::getMicrosecond(),
false, display_negative_sign,
951 negative_duration,
separator, parts, strings);
953 OutputLongShortNarrowOrNumeric(
955 df->nanoseconds_style(), fmt, icu::MeasureUnit::getNanosecond(),
false,
956 display_negative_sign, negative_duration,
separator, parts, strings);
962 return ULISTFMT_WIDTH_WIDE;
964 return ULISTFMT_WIDTH_NARROW;
967 return ULISTFMT_WIDTH_SHORT;
975template <
typename T,
bool Details,
976 MaybeDirectHandle<T> (*Format)(Isolate*,
const icu::FormattedValue&,
977 const std::vector<std::vector<Part>>*,
979MaybeDirectHandle<T> PartitionDurationFormatPattern(
980 Isolate* isolate, DirectHandle<JSDurationFormat> df,
981 const DurationRecord&
record,
const char* method_name) {
984 UListFormatterType type = ULISTFMT_TYPE_UNITS;
989 UListFormatterWidth list_style = StyleToWidth(df->style());
992 UErrorCode status = U_ZERO_ERROR;
993 icu::Locale icu_locale = *df->icu_locale()->raw();
994 std::unique_ptr<icu::ListFormatter> formatter(
995 icu::ListFormatter::createInstance(icu_locale, type, list_style, status));
996 DCHECK(U_SUCCESS(status));
998 std::vector<std::vector<Part>> list;
999 std::vector<std::vector<Part>>* parts = Details ? &list :
nullptr;
1000 std::vector<icu::UnicodeString> string_list;
1002 DurationRecordToListOfFormattedNumber(
1003 df, *(df->icu_number_formatter()->raw()),
record, parts, &string_list);
1005 icu::FormattedList
formatted = formatter->formatStringsToValue(
1006 string_list.data(),
static_cast<int32_t>(string_list.size()), status);
1007 DCHECK(U_SUCCESS(status));
1008 return Format(isolate,
formatted, parts, df->separator());
1016Maybe<DurationRecord> ToDurationRecord(Isolate* isolate, Handle<Object> input,
1017 const DurationRecord& default_value) {
1019 if (IsString(*input)) {
1022 NewRangeError(MessageTemplate::kInvalid,
1023 isolate->factory()->object_string(), input),
1037 NewRangeError(MessageTemplate::kInvalid,
1038 isolate->factory()->object_string(), input),
1044template <
typename T,
bool Details,
1045 MaybeDirectHandle<T> (*Format)(Isolate*,
const icu::FormattedValue&,
1046 const std::vector<std::vector<Part>>*,
1048MaybeDirectHandle<T> FormatCommon(Isolate* isolate,
1049 DirectHandle<JSDurationFormat> df,
1050 Handle<Object> duration,
1051 const char* method_name) {
1058 ToDurationRecord(isolate, duration, {0, 0, 0, {0, 0, 0, 0, 0, 0, 0}}),
1061 return PartitionDurationFormatPattern<T, Details, Format>(isolate, df,
record,
1076 const std::vector<std::vector<Part>>* parts,
1079 Factory* factory = isolate->factory();
1081 icu::ConstrainedFieldPosition cfpos;
1082 cfpos.constrainCategory(UFIELD_CATEGORY_LIST);
1085 UErrorCode status = U_ZERO_ERROR;
1086 icu::UnicodeString
string =
formatted.toString(status);
1087 while (
formatted.nextPosition(cfpos, status) && U_SUCCESS(status)) {
1088 if (cfpos.getField() == ULISTFMT_ELEMENT_FIELD) {
1089 for (
auto& it : parts->at(part_index++)) {
1090 switch (it.part_type) {
1091 case Part::Type::kSeparator: {
1092 icu::UnicodeString sep(SeparatorToChar(
separator));
1099 case Part::Type::kFormatted:
1103 isolate, it.formatted, array, index, type_string);
1105 index = index_after_add.
FromJust();
1113 Intl::ToString(isolate,
string, cfpos.getStart(), cfpos.getLimit()));
1118 if (U_FAILURE(status)) {
1128 const char* method_name =
"Intl.DurationFormat.prototype.format";
1129 return FormatCommon<String, false, FormattedToString>(isolate, df, duration,
1136 const char* method_name =
"Intl.DurationFormat.prototype.formatToParts";
1137 return FormatCommon<JSArray, true, FormattedListToJSArray>(
1138 isolate, df, duration, method_name);
#define SBXCHECK(condition)
V8_INLINE T FromJust() const &
Handle< String > NewStringFromAsciiChecked(const char *str, AllocationType allocation=AllocationType::kYoung)
Handle< JSArray > NewJSArray(ElementsKind elements_kind, int length, int capacity, ArrayStorageAllocationMode mode=ArrayStorageAllocationMode::DONT_INITIALIZE_ARRAY_ELEMENTS, AllocationType allocation=AllocationType::kYoung)
Handle< JSObject > NewJSObject(DirectHandle< JSFunction > constructor, AllocationType allocation=AllocationType::kYoung, NewJSObjectType=NewJSObjectType::kNoAPIWrapper)
Handle< JSObject > NewFastOrSlowJSObjectFromMap(DirectHandle< Map > map, int number_of_slow_properties, AllocationType allocation=AllocationType::kYoung, DirectHandle< AllocationSite > allocation_site=DirectHandle< AllocationSite >::null(), NewJSObjectType=NewJSObjectType::kNoAPIWrapper)
static void AddElement(Isolate *isolate, DirectHandle< JSArray > array, int index, DirectHandle< String > field_type_string, DirectHandle< String > value)
static std::string GetNumberingSystem(const icu::Locale &icu_locale)
static V8_WARN_UNUSED_RESULT MaybeHandle< String > ToString(Isolate *isolate, const icu::UnicodeString &string)
static Maybe< int > AddNumberElements(Isolate *isolate, const icu::FormattedValue &formatted, DirectHandle< JSArray > result, int start_index, DirectHandle< String > unit)
static Maybe< std::vector< std::string > > CanonicalizeLocaleList(Isolate *isolate, DirectHandle< Object > locales, bool only_return_one_result=false)
static Maybe< ResolvedLocale > ResolveLocale(Isolate *isolate, const std::set< std::string > &available_locales, const std::vector< std::string > &requested_locales, MatcherOption options, const std::set< std::string > &relevant_extension_keys)
static V8_WARN_UNUSED_RESULT Maybe< MatcherOption > GetLocaleMatcher(Isolate *isolate, DirectHandle< JSReceiver > options, const char *method_name)
static Maybe< std::string > ToLanguageTag(const icu::Locale &locale)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< String > FormattedToString(Isolate *isolate, const icu::FormattedValue &formatted)
static bool IsValidNumberingSystem(const std::string &value)
static void ValidateElements(Tagged< JSObject > object)
static DirectHandle< Managed< CppType > > From(Isolate *isolate, size_t estimated_size, std::shared_ptr< CppType > shared_ptr, AllocationType allocation_type=AllocationType::kYoung)
static constexpr Tagged< Smi > FromInt(int value)
#define THROW_NEW_ERROR_RETURN_VALUE(isolate, call, value)
#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call)
#define THROW_NEW_ERROR(isolate, call)
#define MAYBE_RETURN(call, value)
#define MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value)
DirectHandle< JSReceiver > options
Maybe< DurationRecord > ToPartialDuration(Isolate *isolate, DirectHandle< Object > temporal_duration_like_obj, const DurationRecord &input)
bool IsValidDuration(Isolate *isolate, const DurationRecord &dur)
MaybeDirectHandle< String > FormattedToString(Isolate *isolate, const icu::FormattedValue &formatted, const std::vector< std::vector< Part > > *parts, JSDurationFormat::Separator)
MaybeDirectHandle< JSReceiver > GetOptionsObject(Isolate *isolate, DirectHandle< Object > options, const char *method_name)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
Maybe< int > GetNumberOption(Isolate *isolate, DirectHandle< JSReceiver > options, DirectHandle< String > property, int min, int max, int fallback)
MaybeDirectHandle< JSArray > FormattedListToJSArray(Isolate *isolate, const icu::FormattedValue &formatted, const std::vector< std::vector< Part > > *parts, JSDurationFormat::Separator separator)
Maybe< bool > GetStringOption(Isolate *isolate, DirectHandle< JSReceiver > options, const char *property, const std::vector< const char * > &values, const char *method_name, std::unique_ptr< char[]> *result)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Maybe< T > Just(const T &t)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
static int32_t Sign(const DurationRecord &dur)
TimeDurationRecord time_duration