| From 836311710ca8d49fdf4d619e3a738a445c413605 Mon Sep 17 00:00:00 2001 |
| From: Ujjwal Sharma <ryzokuken@disroot.org> |
| Date: Wed, 22 Apr 2020 12:20:17 +0530 |
| Subject: [PATCH] deps: V8: backport 3f8dc4b2e5ba |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Original commit message: |
| |
| [intl] Remove soon-to-be removed getAllFieldPositions |
| |
| Needed to land ICU67.1 soon. |
| |
| Bug: v8:10393 |
| Change-Id: I3c7737ca600d6ccfdc46ffaddfb318ce60bc7618 |
| Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2136489 |
| Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> |
| Commit-Queue: Frank Tang <ftang@chromium.org> |
| Cr-Commit-Position: refs/heads/master@{#67027} |
| |
| Refs: https://github.com/v8/v8/commit/3f8dc4b2e5baf77b463334c769af85b79d8c1463 |
| |
| PR-URL: https://github.com/nodejs/node/pull/32993 |
| Reviewed-By: Michaël Zasso <targos@protonmail.com> |
| Reviewed-By: Matheus Marchini <mat@mmarchini.me> |
| Reviewed-By: Steven R Loomis <srloomis@us.ibm.com> |
| Reviewed-By: Richard Lau <riclau@uk.ibm.com> |
| --- |
| common.gypi | 2 +- |
| deps/v8/src/objects/js-number-format.cc | 72 +++++++++++++------------ |
| 2 files changed, 38 insertions(+), 36 deletions(-) |
| |
| diff --git a/common.gypi b/common.gypi |
| index b86e5e0..a7b37e6 100644 |
| --- a/common.gypi |
| +++ b/common.gypi |
| @@ -38,7 +38,7 @@ |
| |
| # Reset this number to 0 on major V8 upgrades. |
| # Increment by one for each non-official patch applied to deps/v8. |
| - 'v8_embedder_string': '-node.16', |
| + 'v8_embedder_string': '-node.17', |
| |
| ##### V8 defaults for Node.js ##### |
| |
| diff --git a/deps/v8/src/objects/js-number-format.cc b/deps/v8/src/objects/js-number-format.cc |
| index d1e3ef4..757c665 100644 |
| --- a/deps/v8/src/objects/js-number-format.cc |
| +++ b/deps/v8/src/objects/js-number-format.cc |
| @@ -1252,42 +1252,31 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate, |
| } |
| |
| namespace { |
| -Maybe<icu::UnicodeString> IcuFormatNumber( |
| +Maybe<bool> IcuFormatNumber( |
| Isolate* isolate, |
| const icu::number::LocalizedNumberFormatter& number_format, |
| - Handle<Object> numeric_obj, icu::FieldPositionIterator* fp_iter) { |
| + Handle<Object> numeric_obj, icu::number::FormattedNumber* formatted) { |
| // If it is BigInt, handle it differently. |
| UErrorCode status = U_ZERO_ERROR; |
| - icu::number::FormattedNumber formatted; |
| if (numeric_obj->IsBigInt()) { |
| Handle<BigInt> big_int = Handle<BigInt>::cast(numeric_obj); |
| Handle<String> big_int_string; |
| ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, big_int_string, |
| BigInt::ToString(isolate, big_int), |
| - Nothing<icu::UnicodeString>()); |
| - formatted = number_format.formatDecimal( |
| + Nothing<bool>()); |
| + *formatted = number_format.formatDecimal( |
| {big_int_string->ToCString().get(), big_int_string->length()}, status); |
| } else { |
| double number = numeric_obj->Number(); |
| - formatted = number_format.formatDouble(number, status); |
| + *formatted = number_format.formatDouble(number, status); |
| } |
| if (U_FAILURE(status)) { |
| // This happen because of icu data trimming trim out "unit". |
| // See https://bugs.chromium.org/p/v8/issues/detail?id=8641 |
| - THROW_NEW_ERROR_RETURN_VALUE(isolate, |
| - NewTypeError(MessageTemplate::kIcuError), |
| - Nothing<icu::UnicodeString>()); |
| - } |
| - if (fp_iter) { |
| - formatted.getAllFieldPositions(*fp_iter, status); |
| + THROW_NEW_ERROR_RETURN_VALUE( |
| + isolate, NewTypeError(MessageTemplate::kIcuError), Nothing<bool>()); |
| } |
| - icu::UnicodeString result = formatted.toString(status); |
| - if (U_FAILURE(status)) { |
| - THROW_NEW_ERROR_RETURN_VALUE(isolate, |
| - NewTypeError(MessageTemplate::kIcuError), |
| - Nothing<icu::UnicodeString>()); |
| - } |
| - return Just(result); |
| + return Just(true); |
| } |
| |
| } // namespace |
| @@ -1298,10 +1287,16 @@ MaybeHandle<String> JSNumberFormat::FormatNumeric( |
| Handle<Object> numeric_obj) { |
| DCHECK(numeric_obj->IsNumeric()); |
| |
| - Maybe<icu::UnicodeString> maybe_format = |
| - IcuFormatNumber(isolate, number_format, numeric_obj, nullptr); |
| + icu::number::FormattedNumber formatted; |
| + Maybe<bool> maybe_format = |
| + IcuFormatNumber(isolate, number_format, numeric_obj, &formatted); |
| MAYBE_RETURN(maybe_format, Handle<String>()); |
| - return Intl::ToString(isolate, maybe_format.FromJust()); |
| + UErrorCode status = U_ZERO_ERROR; |
| + icu::UnicodeString result = formatted.toString(status); |
| + if (U_FAILURE(status)) { |
| + THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kIcuError), String); |
| + } |
| + return Intl::ToString(isolate, result); |
| } |
| |
| namespace { |
| @@ -1414,12 +1409,18 @@ std::vector<NumberFormatSpan> FlattenRegionsToParts( |
| } |
| |
| namespace { |
| -Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted, |
| - icu::FieldPositionIterator* fp_iter, |
| +Maybe<int> ConstructParts(Isolate* isolate, |
| + icu::number::FormattedNumber* formatted, |
| Handle<JSArray> result, int start_index, |
| Handle<Object> numeric_obj, bool style_is_unit) { |
| + UErrorCode status = U_ZERO_ERROR; |
| + icu::UnicodeString formatted_text = formatted->toString(status); |
| + if (U_FAILURE(status)) { |
| + THROW_NEW_ERROR_RETURN_VALUE( |
| + isolate, NewTypeError(MessageTemplate::kIcuError), Nothing<int>()); |
| + } |
| DCHECK(numeric_obj->IsNumeric()); |
| - int32_t length = formatted.length(); |
| + int32_t length = formatted_text.length(); |
| int index = start_index; |
| if (length == 0) return Just(index); |
| |
| @@ -1428,13 +1429,14 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted, |
| // other region covers some part of the formatted string. It's possible |
| // there's another field with exactly the same begin and end as this backdrop, |
| // in which case the backdrop's field_id of -1 will give it lower priority. |
| - regions.push_back(NumberFormatSpan(-1, 0, formatted.length())); |
| + regions.push_back(NumberFormatSpan(-1, 0, formatted_text.length())); |
| |
| { |
| - icu::FieldPosition fp; |
| - while (fp_iter->next(fp)) { |
| - regions.push_back(NumberFormatSpan(fp.getField(), fp.getBeginIndex(), |
| - fp.getEndIndex())); |
| + icu::ConstrainedFieldPosition cfp; |
| + cfp.constrainCategory(UFIELD_CATEGORY_NUMBER); |
| + while (formatted->nextPosition(cfp, status)) { |
| + regions.push_back( |
| + NumberFormatSpan(cfp.getField(), cfp.getStart(), cfp.getLimit())); |
| } |
| } |
| |
| @@ -1456,7 +1458,7 @@ Maybe<int> ConstructParts(Isolate* isolate, const icu::UnicodeString& formatted, |
| Handle<String> substring; |
| ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| isolate, substring, |
| - Intl::ToString(isolate, formatted, part.begin_pos, part.end_pos), |
| + Intl::ToString(isolate, formatted_text, part.begin_pos, part.end_pos), |
| Nothing<int>()); |
| Intl::AddElement(isolate, result, index, field_type_string, substring); |
| ++index; |
| @@ -1476,14 +1478,14 @@ MaybeHandle<JSArray> JSNumberFormat::FormatToParts( |
| number_format->icu_number_formatter().raw(); |
| CHECK_NOT_NULL(fmt); |
| |
| - icu::FieldPositionIterator fp_iter; |
| - Maybe<icu::UnicodeString> maybe_format = |
| - IcuFormatNumber(isolate, *fmt, numeric_obj, &fp_iter); |
| + icu::number::FormattedNumber formatted; |
| + Maybe<bool> maybe_format = |
| + IcuFormatNumber(isolate, *fmt, numeric_obj, &formatted); |
| MAYBE_RETURN(maybe_format, Handle<JSArray>()); |
| |
| Handle<JSArray> result = factory->NewJSArray(0); |
| Maybe<int> maybe_format_to_parts = ConstructParts( |
| - isolate, maybe_format.FromJust(), &fp_iter, result, 0, numeric_obj, |
| + isolate, &formatted, result, 0, numeric_obj, |
| number_format->style() == JSNumberFormat::Style::UNIT); |
| MAYBE_RETURN(maybe_format_to_parts, Handle<JSArray>()); |
| |
| -- |
| 2.26.2 |
| |