Commit 2ace4e1a authored by Frank Tang's avatar Frank Tang Committed by V8 LUCI CQ

[intl] Optimize NumberFormatv3

Remove internal slot of LocalizedNumberRangeFormatter
in NumberFormat and PluralRules and converted from
LocalizedNumberFormatter on the calls require it instead.

Bug: chromium:1307699, chromium:1307698
Change-Id: I9be1b7dd1c931f273d845359ca4de1273ea837a8
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3555261Reviewed-by: 's avatarShu-yu Guo <syg@chromium.org>
Commit-Queue: Frank Tang <ftang@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81078}
parent f0fbdfec
......@@ -25,9 +25,6 @@ TQ_OBJECT_CONSTRUCTORS_IMPL(JSNumberFormat)
ACCESSORS(JSNumberFormat, icu_number_formatter,
Managed<icu::number::LocalizedNumberFormatter>,
kIcuNumberFormatterOffset)
ACCESSORS(JSNumberFormat, icu_number_range_formatter,
Managed<icu::number::LocalizedNumberRangeFormatter>,
kIcuNumberRangeFormatterOffset)
} // namespace internal
} // namespace v8
......
......@@ -1648,24 +1648,12 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
icu::number::LocalizedNumberFormatter icu_number_formatter =
settings.locale(icu_locale);
icu::number::LocalizedNumberRangeFormatter icu_number_range_formatter =
icu::number::UnlocalizedNumberRangeFormatter()
.numberFormatterBoth(settings)
.locale(icu_locale);
Handle<Managed<icu::number::LocalizedNumberFormatter>>
managed_number_formatter =
Managed<icu::number::LocalizedNumberFormatter>::FromRawPtr(
isolate, 0,
new icu::number::LocalizedNumberFormatter(icu_number_formatter));
Handle<Managed<icu::number::LocalizedNumberRangeFormatter>>
managed_number_range_formatter =
Managed<icu::number::LocalizedNumberRangeFormatter>::FromRawPtr(
isolate, 0,
new icu::number::LocalizedNumberRangeFormatter(
icu_number_range_formatter));
// Now all properties are ready, so we can allocate the result object.
Handle<JSNumberFormat> number_format = Handle<JSNumberFormat>::cast(
isolate->factory()->NewFastOrSlowJSObjectFromMap(map));
......@@ -1673,8 +1661,6 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
number_format->set_locale(*locale_str);
number_format->set_icu_number_formatter(*managed_number_formatter);
number_format->set_icu_number_range_formatter(
*managed_number_range_formatter);
number_format->set_bound_format(*factory->undefined_value());
// 31. Return numberFormat.
......@@ -2089,11 +2075,16 @@ MaybeHandle<T> PartitionNumberRangePattern(Isolate* isolate,
Maybe<icu::Formattable> maybe_y = ToFormattable(isolate, y, "end");
MAYBE_RETURN(maybe_y, MaybeHandle<T>());
icu::number::LocalizedNumberRangeFormatter* nrfmt =
number_format->icu_number_range_formatter().raw();
CHECK_NOT_NULL(nrfmt);
Maybe<icu::number::LocalizedNumberRangeFormatter> maybe_range_formatter =
JSNumberFormat::GetRangeFormatter(
isolate, number_format->locale(),
*number_format->icu_number_formatter().raw());
MAYBE_RETURN(maybe_range_formatter, MaybeHandle<T>());
icu::number::LocalizedNumberRangeFormatter nrfmt =
maybe_range_formatter.FromJust();
UErrorCode status = U_ZERO_ERROR;
icu::number::FormattedNumberRange formatted = nrfmt->formatFormattableRange(
icu::number::FormattedNumberRange formatted = nrfmt.formatFormattableRange(
maybe_x.FromJust(), maybe_y.FromJust(), status);
if (U_FAILURE(status)) {
THROW_NEW_ERROR_RETURN_VALUE(
......@@ -2140,6 +2131,26 @@ MaybeHandle<JSArray> FormatRangeToJSArray(
} // namespace
Maybe<icu::number::LocalizedNumberRangeFormatter>
JSNumberFormat::GetRangeFormatter(
Isolate* isolate, String locale,
const icu::number::LocalizedNumberFormatter& number_formatter) {
UErrorCode status = U_ZERO_ERROR;
UParseError perror;
icu::number::LocalizedNumberRangeFormatter range_formatter =
icu::number::UnlocalizedNumberRangeFormatter()
.numberFormatterBoth(icu::number::NumberFormatter::forSkeleton(
number_formatter.toSkeleton(status), perror, status))
.locale(
icu::Locale::forLanguageTag(locale.ToCString().get(), status));
if (U_FAILURE(status)) {
THROW_NEW_ERROR_RETURN_VALUE(
isolate, NewTypeError(MessageTemplate::kIcuError),
Nothing<icu::number::LocalizedNumberRangeFormatter>());
}
return Just(range_formatter);
}
MaybeHandle<String> JSNumberFormat::FormatNumeric(
Isolate* isolate,
const icu::number::LocalizedNumberFormatter& number_format,
......
......@@ -88,12 +88,15 @@ class JSNumberFormat
const Intl::NumberFormatDigitOptions& digit_options,
int rounding_increment, ShowTrailingZeros show);
V8_WARN_UNUSED_RESULT static Maybe<icu::number::LocalizedNumberRangeFormatter>
GetRangeFormatter(
Isolate* isolate, String locale,
const icu::number::LocalizedNumberFormatter& number_formatter);
DECL_PRINTER(JSNumberFormat)
DECL_ACCESSORS(icu_number_formatter,
Managed<icu::number::LocalizedNumberFormatter>)
DECL_ACCESSORS(icu_number_range_formatter,
Managed<icu::number::LocalizedNumberRangeFormatter>)
TQ_OBJECT_CONSTRUCTORS(JSNumberFormat)
};
......
......@@ -8,7 +8,5 @@ extern class JSNumberFormat extends JSObject {
locale: String;
icu_number_formatter:
Foreign; // Managed<icu::number::LocalizedNumberFormatter>
icu_number_range_formatter:
Foreign; // Managed<icu::number::LocalizedNumberRangeFormatter>
bound_format: JSFunction|Undefined;
}
......@@ -28,9 +28,6 @@ ACCESSORS(JSPluralRules, icu_plural_rules, Managed<icu::PluralRules>,
ACCESSORS(JSPluralRules, icu_number_formatter,
Managed<icu::number::LocalizedNumberFormatter>,
kIcuNumberFormatterOffset)
ACCESSORS(JSPluralRules, icu_number_range_formatter,
Managed<icu::number::LocalizedNumberRangeFormatter>,
kIcuNumberRangeFormatterOffset)
inline void JSPluralRules::set_type(Type type) {
DCHECK_LE(type, TypeBit::kMax);
......
......@@ -146,10 +146,6 @@ MaybeHandle<JSPluralRules> JSPluralRules::New(Isolate* isolate, Handle<Map> map,
icu::number::LocalizedNumberFormatter icu_number_formatter =
settings.locale(icu_locale);
icu::number::LocalizedNumberRangeFormatter icu_number_range_formatter =
icu::number::UnlocalizedNumberRangeFormatter()
.numberFormatterBoth(settings)
.locale(icu_locale);
Handle<Managed<icu::PluralRules>> managed_plural_rules =
Managed<icu::PluralRules>::FromUniquePtr(isolate, 0,
......@@ -160,12 +156,6 @@ MaybeHandle<JSPluralRules> JSPluralRules::New(Isolate* isolate, Handle<Map> map,
Managed<icu::number::LocalizedNumberFormatter>::FromRawPtr(
isolate, 0,
new icu::number::LocalizedNumberFormatter(icu_number_formatter));
Handle<Managed<icu::number::LocalizedNumberRangeFormatter>>
managed_number_range_formatter =
Managed<icu::number::LocalizedNumberRangeFormatter>::FromRawPtr(
isolate, 0,
new icu::number::LocalizedNumberRangeFormatter(
icu_number_range_formatter));
// Now all properties are ready, so we can allocate the result object.
Handle<JSPluralRules> plural_rules = Handle<JSPluralRules>::cast(
......@@ -181,7 +171,6 @@ MaybeHandle<JSPluralRules> JSPluralRules::New(Isolate* isolate, Handle<Map> map,
plural_rules->set_icu_plural_rules(*managed_plural_rules);
plural_rules->set_icu_number_formatter(*managed_number_formatter);
plural_rules->set_icu_number_range_formatter(*managed_number_range_formatter);
// 13. Return pluralRules.
return plural_rules;
......@@ -213,12 +202,17 @@ MaybeHandle<String> JSPluralRules::ResolvePluralRange(
icu::PluralRules* icu_plural_rules = plural_rules->icu_plural_rules().raw();
DCHECK_NOT_NULL(icu_plural_rules);
icu::number::LocalizedNumberRangeFormatter* fmt =
plural_rules->icu_number_range_formatter().raw();
DCHECK_NOT_NULL(fmt);
Maybe<icu::number::LocalizedNumberRangeFormatter> maybe_range_formatter =
JSNumberFormat::GetRangeFormatter(
isolate, plural_rules->locale(),
*plural_rules->icu_number_formatter().raw());
MAYBE_RETURN(maybe_range_formatter, MaybeHandle<String>());
icu::number::LocalizedNumberRangeFormatter nrfmt =
maybe_range_formatter.FromJust();
UErrorCode status = U_ZERO_ERROR;
icu::number::FormattedNumberRange formatted = fmt->formatFormattableRange(
icu::number::FormattedNumberRange formatted = nrfmt.formatFormattableRange(
icu::Formattable(x), icu::Formattable(y), status);
DCHECK(U_SUCCESS(status));
......
......@@ -72,8 +72,6 @@ class JSPluralRules
DECL_ACCESSORS(icu_plural_rules, Managed<icu::PluralRules>)
DECL_ACCESSORS(icu_number_formatter,
Managed<icu::number::LocalizedNumberFormatter>)
DECL_ACCESSORS(icu_number_range_formatter,
Managed<icu::number::LocalizedNumberRangeFormatter>)
TQ_OBJECT_CONSTRUCTORS(JSPluralRules)
};
......
......@@ -15,6 +15,4 @@ extern class JSPluralRules extends JSObject {
icu_plural_rules: Foreign; // Managed<icu::PluralRules>
icu_number_formatter:
Foreign; // Managed<icu::number::LocalizedNumberFormatter>
icu_number_range_formatter:
Foreign; // Managed<icu::number::LocalizedNumberRangeFormatter>
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment