@@ -1187,42 +1187,31 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
11871187}
11881188
11891189namespace {
1190- Maybe<icu::UnicodeString > IcuFormatNumber (
1190+ Maybe<bool > IcuFormatNumber (
11911191 Isolate* isolate,
11921192 const icu::number::LocalizedNumberFormatter& number_format,
1193- Handle<Object> numeric_obj, icu::FieldPositionIterator* fp_iter ) {
1193+ Handle<Object> numeric_obj, icu::number::FormattedNumber* formatted ) {
11941194 // If it is BigInt, handle it differently.
11951195 UErrorCode status = U_ZERO_ERROR;
1196- icu::number::FormattedNumber formatted;
11971196 if (numeric_obj->IsBigInt ()) {
11981197 Handle<BigInt> big_int = Handle<BigInt>::cast (numeric_obj);
11991198 Handle<String> big_int_string;
12001199 ASSIGN_RETURN_ON_EXCEPTION_VALUE (isolate, big_int_string,
12011200 BigInt::ToString (isolate, big_int),
1202- Nothing<icu::UnicodeString >());
1203- formatted = number_format.formatDecimal (
1201+ Nothing<bool >());
1202+ * formatted = number_format.formatDecimal (
12041203 {big_int_string->ToCString ().get (), big_int_string->length ()}, status);
12051204 } else {
12061205 double number = numeric_obj->Number ();
1207- formatted = number_format.formatDouble (number, status);
1206+ * formatted = number_format.formatDouble (number, status);
12081207 }
12091208 if (U_FAILURE (status)) {
12101209 // This happen because of icu data trimming trim out "unit".
12111210 // See https://bugs.chromium.org/p/v8/issues/detail?id=8641
1212- THROW_NEW_ERROR_RETURN_VALUE (isolate,
1213- NewTypeError (MessageTemplate::kIcuError ),
1214- Nothing<icu::UnicodeString>());
1215- }
1216- if (fp_iter) {
1217- formatted.getAllFieldPositions (*fp_iter, status);
1211+ THROW_NEW_ERROR_RETURN_VALUE (
1212+ isolate, NewTypeError (MessageTemplate::kIcuError ), Nothing<bool >());
12181213 }
1219- icu::UnicodeString result = formatted.toString (status);
1220- if (U_FAILURE (status)) {
1221- THROW_NEW_ERROR_RETURN_VALUE (isolate,
1222- NewTypeError (MessageTemplate::kIcuError ),
1223- Nothing<icu::UnicodeString>());
1224- }
1225- return Just (result);
1214+ return Just (true );
12261215}
12271216
12281217} // namespace
@@ -1233,10 +1222,16 @@ MaybeHandle<String> JSNumberFormat::FormatNumeric(
12331222 Handle<Object> numeric_obj) {
12341223 DCHECK (numeric_obj->IsNumeric ());
12351224
1236- Maybe<icu::UnicodeString> maybe_format =
1237- IcuFormatNumber (isolate, number_format, numeric_obj, nullptr );
1225+ icu::number::FormattedNumber formatted;
1226+ Maybe<bool > maybe_format =
1227+ IcuFormatNumber (isolate, number_format, numeric_obj, &formatted);
12381228 MAYBE_RETURN (maybe_format, Handle<String>());
1239- return Intl::ToString (isolate, maybe_format.FromJust ());
1229+ UErrorCode status = U_ZERO_ERROR;
1230+ icu::UnicodeString result = formatted.toString (status);
1231+ if (U_FAILURE (status)) {
1232+ THROW_NEW_ERROR (isolate, NewTypeError (MessageTemplate::kIcuError ), String);
1233+ }
1234+ return Intl::ToString (isolate, result);
12401235}
12411236
12421237namespace {
@@ -1349,12 +1344,18 @@ std::vector<NumberFormatSpan> FlattenRegionsToParts(
13491344}
13501345
13511346namespace {
1352- Maybe<int > ConstructParts (Isolate* isolate, const icu::UnicodeString& formatted,
1353- icu::FieldPositionIterator* fp_iter ,
1347+ Maybe<int > ConstructParts (Isolate* isolate,
1348+ icu::number::FormattedNumber* formatted ,
13541349 Handle<JSArray> result, int start_index,
13551350 Handle<Object> numeric_obj, bool style_is_unit) {
1351+ UErrorCode status = U_ZERO_ERROR;
1352+ icu::UnicodeString formatted_text = formatted->toString (status);
1353+ if (U_FAILURE (status)) {
1354+ THROW_NEW_ERROR_RETURN_VALUE (
1355+ isolate, NewTypeError (MessageTemplate::kIcuError ), Nothing<int >());
1356+ }
13561357 DCHECK (numeric_obj->IsNumeric ());
1357- int32_t length = formatted .length ();
1358+ int32_t length = formatted_text .length ();
13581359 int index = start_index;
13591360 if (length == 0 ) return Just (index);
13601361
@@ -1363,13 +1364,14 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
13631364 // other region covers some part of the formatted string. It's possible
13641365 // there's another field with exactly the same begin and end as this backdrop,
13651366 // in which case the backdrop's field_id of -1 will give it lower priority.
1366- regions.push_back (NumberFormatSpan (-1 , 0 , formatted .length ()));
1367+ regions.push_back (NumberFormatSpan (-1 , 0 , formatted_text .length ()));
13671368
13681369 {
1369- icu::FieldPosition fp;
1370- while (fp_iter->next (fp)) {
1371- regions.push_back (NumberFormatSpan (fp.getField (), fp.getBeginIndex (),
1372- fp.getEndIndex ()));
1370+ icu::ConstrainedFieldPosition cfp;
1371+ cfp.constrainCategory (UFIELD_CATEGORY_NUMBER);
1372+ while (formatted->nextPosition (cfp, status)) {
1373+ regions.push_back (
1374+ NumberFormatSpan (cfp.getField (), cfp.getStart (), cfp.getLimit ()));
13731375 }
13741376 }
13751377
@@ -1391,7 +1393,7 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
13911393 Handle<String> substring;
13921394 ASSIGN_RETURN_ON_EXCEPTION_VALUE (
13931395 isolate, substring,
1394- Intl::ToString (isolate, formatted , part.begin_pos , part.end_pos ),
1396+ Intl::ToString (isolate, formatted_text , part.begin_pos , part.end_pos ),
13951397 Nothing<int >());
13961398 Intl::AddElement (isolate, result, index, field_type_string, substring);
13971399 ++index;
@@ -1411,14 +1413,14 @@ MaybeHandle<JSArray> JSNumberFormat::FormatToParts(
14111413 number_format->icu_number_formatter ().raw ();
14121414 CHECK_NOT_NULL (fmt);
14131415
1414- icu::FieldPositionIterator fp_iter ;
1415- Maybe<icu::UnicodeString > maybe_format =
1416- IcuFormatNumber (isolate, *fmt, numeric_obj, &fp_iter );
1416+ icu::number::FormattedNumber formatted ;
1417+ Maybe<bool > maybe_format =
1418+ IcuFormatNumber (isolate, *fmt, numeric_obj, &formatted );
14171419 MAYBE_RETURN (maybe_format, Handle<JSArray>());
14181420
14191421 Handle<JSArray> result = factory->NewJSArray (0 );
14201422 Maybe<int > maybe_format_to_parts = ConstructParts (
1421- isolate, maybe_format. FromJust (), &fp_iter , result, 0 , numeric_obj,
1423+ isolate, &formatted , result, 0 , numeric_obj,
14221424 number_format->style () == JSNumberFormat::Style::UNIT);
14231425 MAYBE_RETURN (maybe_format_to_parts, Handle<JSArray>());
14241426
0 commit comments