@@ -1239,44 +1239,33 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
12391239}
12401240
12411241namespace {
1242- Maybe<icu::UnicodeString > IcuFormatNumber (
1242+ Maybe<bool > IcuFormatNumber (
12431243 Isolate* isolate,
12441244 const icu::number::LocalizedNumberFormatter& number_format,
1245- Handle<Object> numeric_obj, icu::FieldPositionIterator* fp_iter ) {
1245+ Handle<Object> numeric_obj, icu::number::FormattedNumber* formatted ) {
12461246 // If it is BigInt, handle it differently.
12471247 UErrorCode status = U_ZERO_ERROR;
1248- icu::number::FormattedNumber formatted;
12491248 if (numeric_obj->IsBigInt ()) {
12501249 Handle<BigInt> big_int = Handle<BigInt>::cast (numeric_obj);
12511250 Handle<String> big_int_string;
12521251 ASSIGN_RETURN_ON_EXCEPTION_VALUE (isolate, big_int_string,
12531252 BigInt::ToString (isolate, big_int),
1254- Nothing<icu::UnicodeString >());
1255- formatted = number_format.formatDecimal (
1253+ Nothing<bool >());
1254+ * formatted = number_format.formatDecimal (
12561255 {big_int_string->ToCString ().get (), big_int_string->length ()}, status);
12571256 } else {
12581257 double number = numeric_obj->IsNaN ()
12591258 ? std::numeric_limits<double >::quiet_NaN ()
12601259 : numeric_obj->Number ();
1261- formatted = number_format.formatDouble (number, status);
1260+ * formatted = number_format.formatDouble (number, status);
12621261 }
12631262 if (U_FAILURE (status)) {
12641263 // This happen because of icu data trimming trim out "unit".
12651264 // See https://bugs.chromium.org/p/v8/issues/detail?id=8641
1266- THROW_NEW_ERROR_RETURN_VALUE (isolate,
1267- NewTypeError (MessageTemplate::kIcuError ),
1268- Nothing<icu::UnicodeString>());
1269- }
1270- if (fp_iter) {
1271- formatted.getAllFieldPositions (*fp_iter, status);
1272- }
1273- icu::UnicodeString result = formatted.toString (status);
1274- if (U_FAILURE (status)) {
1275- THROW_NEW_ERROR_RETURN_VALUE (isolate,
1276- NewTypeError (MessageTemplate::kIcuError ),
1277- Nothing<icu::UnicodeString>());
1265+ THROW_NEW_ERROR_RETURN_VALUE (
1266+ isolate, NewTypeError (MessageTemplate::kIcuError ), Nothing<bool >());
12781267 }
1279- return Just (result );
1268+ return Just (true );
12801269}
12811270
12821271} // namespace
@@ -1287,10 +1276,16 @@ MaybeHandle<String> JSNumberFormat::FormatNumeric(
12871276 Handle<Object> numeric_obj) {
12881277 DCHECK (numeric_obj->IsNumeric ());
12891278
1290- Maybe<icu::UnicodeString> maybe_format =
1291- IcuFormatNumber (isolate, number_format, numeric_obj, nullptr );
1279+ icu::number::FormattedNumber formatted;
1280+ Maybe<bool > maybe_format =
1281+ IcuFormatNumber (isolate, number_format, numeric_obj, &formatted);
12921282 MAYBE_RETURN (maybe_format, Handle<String>());
1293- return Intl::ToString (isolate, maybe_format.FromJust ());
1283+ UErrorCode status = U_ZERO_ERROR;
1284+ icu::UnicodeString result = formatted.toString (status);
1285+ if (U_FAILURE (status)) {
1286+ THROW_NEW_ERROR (isolate, NewTypeError (MessageTemplate::kIcuError ), String);
1287+ }
1288+ return Intl::ToString (isolate, result);
12941289}
12951290
12961291namespace {
@@ -1403,12 +1398,18 @@ std::vector<NumberFormatSpan> FlattenRegionsToParts(
14031398}
14041399
14051400namespace {
1406- Maybe<int > ConstructParts (Isolate* isolate, const icu::UnicodeString& formatted,
1407- icu::FieldPositionIterator* fp_iter ,
1401+ Maybe<int > ConstructParts (Isolate* isolate,
1402+ icu::number::FormattedNumber* formatted ,
14081403 Handle<JSArray> result, int start_index,
14091404 Handle<Object> numeric_obj, bool style_is_unit) {
1405+ UErrorCode status = U_ZERO_ERROR;
1406+ icu::UnicodeString formatted_text = formatted->toString (status);
1407+ if (U_FAILURE (status)) {
1408+ THROW_NEW_ERROR_RETURN_VALUE (
1409+ isolate, NewTypeError (MessageTemplate::kIcuError ), Nothing<int >());
1410+ }
14101411 DCHECK (numeric_obj->IsNumeric ());
1411- int32_t length = formatted .length ();
1412+ int32_t length = formatted_text .length ();
14121413 int index = start_index;
14131414 if (length == 0 ) return Just (index);
14141415
@@ -1417,13 +1418,14 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
14171418 // other region covers some part of the formatted string. It's possible
14181419 // there's another field with exactly the same begin and end as this backdrop,
14191420 // in which case the backdrop's field_id of -1 will give it lower priority.
1420- regions.push_back (NumberFormatSpan (-1 , 0 , formatted .length ()));
1421+ regions.push_back (NumberFormatSpan (-1 , 0 , formatted_text .length ()));
14211422
14221423 {
1423- icu::FieldPosition fp;
1424- while (fp_iter->next (fp)) {
1425- regions.push_back (NumberFormatSpan (fp.getField (), fp.getBeginIndex (),
1426- fp.getEndIndex ()));
1424+ icu::ConstrainedFieldPosition cfp;
1425+ cfp.constrainCategory (UFIELD_CATEGORY_NUMBER);
1426+ while (formatted->nextPosition (cfp, status)) {
1427+ regions.push_back (
1428+ NumberFormatSpan (cfp.getField (), cfp.getStart (), cfp.getLimit ()));
14271429 }
14281430 }
14291431
@@ -1445,7 +1447,7 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
14451447 Handle<String> substring;
14461448 ASSIGN_RETURN_ON_EXCEPTION_VALUE (
14471449 isolate, substring,
1448- Intl::ToString (isolate, formatted , part.begin_pos , part.end_pos ),
1450+ Intl::ToString (isolate, formatted_text , part.begin_pos , part.end_pos ),
14491451 Nothing<int >());
14501452 Intl::AddElement (isolate, result, index, field_type_string, substring);
14511453 ++index;
@@ -1465,20 +1467,19 @@ MaybeHandle<JSArray> JSNumberFormat::FormatToParts(
14651467 number_format->icu_number_formatter ().raw ();
14661468 CHECK_NOT_NULL (fmt);
14671469
1468- icu::FieldPositionIterator fp_iter ;
1469- Maybe<icu::UnicodeString > maybe_format =
1470- IcuFormatNumber (isolate, *fmt, numeric_obj, &fp_iter );
1470+ icu::number::FormattedNumber formatted ;
1471+ Maybe<bool > maybe_format =
1472+ IcuFormatNumber (isolate, *fmt, numeric_obj, &formatted );
14711473 MAYBE_RETURN (maybe_format, Handle<JSArray>());
1472-
14731474 UErrorCode status = U_ZERO_ERROR;
1475+
14741476 bool style_is_unit =
14751477 Style::UNIT == StyleFromSkeleton (fmt->toSkeleton (status));
14761478 CHECK (U_SUCCESS (status));
14771479
14781480 Handle<JSArray> result = factory->NewJSArray (0 );
1479- Maybe<int > maybe_format_to_parts =
1480- ConstructParts (isolate, maybe_format.FromJust (), &fp_iter, result, 0 ,
1481- numeric_obj, style_is_unit);
1481+ Maybe<int > maybe_format_to_parts = ConstructParts (
1482+ isolate, &formatted, result, 0 , numeric_obj, style_is_unit);
14821483 MAYBE_RETURN (maybe_format_to_parts, Handle<JSArray>());
14831484
14841485 return result;
0 commit comments