v8-remove-soon-to-be-removed-getAllFieldPositions.patch 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. From 3f8dc4b2e5baf77b463334c769af85b79d8c1463 Mon Sep 17 00:00:00 2001
  2. From: Frank Tang <ftang@chromium.org>
  3. Date: Fri, 3 Apr 2020 23:13:54 -0700
  4. Subject: [PATCH] [intl] Remove soon-to-be removed getAllFieldPositions
  5. Needed to land ICU67.1 soon.
  6. Bug: v8:10393
  7. Change-Id: I3c7737ca600d6ccfdc46ffaddfb318ce60bc7618
  8. Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2136489
  9. Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
  10. Commit-Queue: Frank Tang <ftang@chromium.org>
  11. Cr-Commit-Position: refs/heads/master@{#67027}
  12. ---
  13. src/objects/js-number-format.cc | 77 +++++++++++++++++----------------
  14. 1 file changed, 39 insertions(+), 38 deletions(-)
  15. diff --git a/src/objects/js-number-format.cc b/src/objects/js-number-format.cc
  16. index ad831c5c36..bcd44031d5 100644
  17. --- a/src/objects/js-number-format.cc
  18. +++ b/src/objects/js-number-format.cc
  19. @@ -1241,44 +1241,33 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
  20. }
  21. namespace {
  22. -Maybe<icu::UnicodeString> IcuFormatNumber(
  23. +Maybe<bool> IcuFormatNumber(
  24. Isolate* isolate,
  25. const icu::number::LocalizedNumberFormatter& number_format,
  26. - Handle<Object> numeric_obj, icu::FieldPositionIterator* fp_iter) {
  27. + Handle<Object> numeric_obj, icu::number::FormattedNumber* formatted) {
  28. // If it is BigInt, handle it differently.
  29. UErrorCode status = U_ZERO_ERROR;
  30. - icu::number::FormattedNumber formatted;
  31. if (numeric_obj->IsBigInt()) {
  32. Handle<BigInt> big_int = Handle<BigInt>::cast(numeric_obj);
  33. Handle<String> big_int_string;
  34. ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, big_int_string,
  35. BigInt::ToString(isolate, big_int),
  36. - Nothing<icu::UnicodeString>());
  37. - formatted = number_format.formatDecimal(
  38. + Nothing<bool>());
  39. + *formatted = number_format.formatDecimal(
  40. {big_int_string->ToCString().get(), big_int_string->length()}, status);
  41. } else {
  42. double number = numeric_obj->IsNaN()
  43. ? std::numeric_limits<double>::quiet_NaN()
  44. : numeric_obj->Number();
  45. - formatted = number_format.formatDouble(number, status);
  46. + *formatted = number_format.formatDouble(number, status);
  47. }
  48. if (U_FAILURE(status)) {
  49. // This happen because of icu data trimming trim out "unit".
  50. // See https://bugs.chromium.org/p/v8/issues/detail?id=8641
  51. - THROW_NEW_ERROR_RETURN_VALUE(isolate,
  52. - NewTypeError(MessageTemplate::kIcuError),
  53. - Nothing<icu::UnicodeString>());
  54. - }
  55. - if (fp_iter) {
  56. - formatted.getAllFieldPositions(*fp_iter, status);
  57. - }
  58. - icu::UnicodeString result = formatted.toString(status);
  59. - if (U_FAILURE(status)) {
  60. - THROW_NEW_ERROR_RETURN_VALUE(isolate,
  61. - NewTypeError(MessageTemplate::kIcuError),
  62. - Nothing<icu::UnicodeString>());
  63. + THROW_NEW_ERROR_RETURN_VALUE(
  64. + isolate, NewTypeError(MessageTemplate::kIcuError), Nothing<bool>());
  65. }
  66. - return Just(result);
  67. + return Just(true);
  68. }
  69. } // namespace
  70. @@ -1289,10 +1278,16 @@ MaybeHandle<String> JSNumberFormat::FormatNumeric(
  71. Handle<Object> numeric_obj) {
  72. DCHECK(numeric_obj->IsNumeric());
  73. - Maybe<icu::UnicodeString> maybe_format =
  74. - IcuFormatNumber(isolate, number_format, numeric_obj, nullptr);
  75. + icu::number::FormattedNumber formatted;
  76. + Maybe<bool> maybe_format =
  77. + IcuFormatNumber(isolate, number_format, numeric_obj, &formatted);
  78. MAYBE_RETURN(maybe_format, Handle<String>());
  79. - return Intl::ToString(isolate, maybe_format.FromJust());
  80. + UErrorCode status = U_ZERO_ERROR;
  81. + icu::UnicodeString result = formatted.toString(status);
  82. + if (U_FAILURE(status)) {
  83. + THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kIcuError), String);
  84. + }
  85. + return Intl::ToString(isolate, result);
  86. }
  87. namespace {
  88. @@ -1405,12 +1400,18 @@ std::vector<NumberFormatSpan> FlattenRegionsToParts(
  89. }
  90. namespace {
  91. -Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
  92. - icu::FieldPositionIterator* fp_iter,
  93. +Maybe<int> ConstructParts(Isolate* isolate,
  94. + icu::number::FormattedNumber* formatted,
  95. Handle<JSArray> result, int start_index,
  96. Handle<Object> numeric_obj, bool style_is_unit) {
  97. + UErrorCode status = U_ZERO_ERROR;
  98. + icu::UnicodeString formatted_text = formatted->toString(status);
  99. + if (U_FAILURE(status)) {
  100. + THROW_NEW_ERROR_RETURN_VALUE(
  101. + isolate, NewTypeError(MessageTemplate::kIcuError), Nothing<int>());
  102. + }
  103. DCHECK(numeric_obj->IsNumeric());
  104. - int32_t length = formatted.length();
  105. + int32_t length = formatted_text.length();
  106. int index = start_index;
  107. if (length == 0) return Just(index);
  108. @@ -1419,13 +1420,14 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
  109. // other region covers some part of the formatted string. It's possible
  110. // there's another field with exactly the same begin and end as this backdrop,
  111. // in which case the backdrop's field_id of -1 will give it lower priority.
  112. - regions.push_back(NumberFormatSpan(-1, 0, formatted.length()));
  113. + regions.push_back(NumberFormatSpan(-1, 0, formatted_text.length()));
  114. {
  115. - icu::FieldPosition fp;
  116. - while (fp_iter->next(fp)) {
  117. - regions.push_back(NumberFormatSpan(fp.getField(), fp.getBeginIndex(),
  118. - fp.getEndIndex()));
  119. + icu::ConstrainedFieldPosition cfp;
  120. + cfp.constrainCategory(UFIELD_CATEGORY_NUMBER);
  121. + while (formatted->nextPosition(cfp, status)) {
  122. + regions.push_back(
  123. + NumberFormatSpan(cfp.getField(), cfp.getStart(), cfp.getLimit()));
  124. }
  125. }
  126. @@ -1447,7 +1449,7 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted,
  127. Handle<String> substring;
  128. ASSIGN_RETURN_ON_EXCEPTION_VALUE(
  129. isolate, substring,
  130. - Intl::ToString(isolate, formatted, part.begin_pos, part.end_pos),
  131. + Intl::ToString(isolate, formatted_text, part.begin_pos, part.end_pos),
  132. Nothing<int>());
  133. Intl::AddElement(isolate, result, index, field_type_string, substring);
  134. ++index;
  135. @@ -1467,20 +1469,19 @@ MaybeHandle<JSArray> JSNumberFormat::FormatToParts(
  136. number_format->icu_number_formatter().raw();
  137. CHECK_NOT_NULL(fmt);
  138. - icu::FieldPositionIterator fp_iter;
  139. - Maybe<icu::UnicodeString> maybe_format =
  140. - IcuFormatNumber(isolate, *fmt, numeric_obj, &fp_iter);
  141. + icu::number::FormattedNumber formatted;
  142. + Maybe<bool> maybe_format =
  143. + IcuFormatNumber(isolate, *fmt, numeric_obj, &formatted);
  144. MAYBE_RETURN(maybe_format, Handle<JSArray>());
  145. -
  146. UErrorCode status = U_ZERO_ERROR;
  147. +
  148. bool style_is_unit =
  149. Style::UNIT == StyleFromSkeleton(fmt->toSkeleton(status));
  150. CHECK(U_SUCCESS(status));
  151. Handle<JSArray> result = factory->NewJSArray(0);
  152. - Maybe<int> maybe_format_to_parts =
  153. - ConstructParts(isolate, maybe_format.FromJust(), &fp_iter, result, 0,
  154. - numeric_obj, style_is_unit);
  155. + Maybe<int> maybe_format_to_parts = ConstructParts(
  156. + isolate, &formatted, result, 0, numeric_obj, style_is_unit);
  157. MAYBE_RETURN(maybe_format_to_parts, Handle<JSArray>());
  158. return result;