Commit 5258f822 authored by Frank Tang's avatar Frank Tang Committed by Commit Bot

Remove flag from JSNumberFormat

Find out style from skeleton instead to reduce object size.

Bug: v8:10208
Change-Id: I7d26113311f51bc64ed0b259c3df81d526d5ab1b
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2055660Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Frank Tang <ftang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#66274}
parent 5b2822c9
......@@ -40,7 +40,6 @@ extern class JSNumberFormat extends JSObject {
icu_number_formatter:
Foreign; // Managed<icu::number::LocalizedNumberFormatter>
bound_format: JSFunction|Undefined;
flags: Smi;
}
extern class JSPluralRules extends JSObject {
......
......@@ -26,19 +26,6 @@ ACCESSORS(JSNumberFormat, icu_number_formatter,
kIcuNumberFormatterOffset)
ACCESSORS(JSNumberFormat, bound_format, Object, kBoundFormatOffset)
SMI_ACCESSORS(JSNumberFormat, flags, kFlagsOffset)
inline void JSNumberFormat::set_style(Style style) {
DCHECK_GE(StyleBits::kMax, style);
int hints = flags();
hints = StyleBits::update(hints, style);
set_flags(hints);
}
inline JSNumberFormat::Style JSNumberFormat::style() const {
return StyleBits::decode(flags());
}
CAST_ACCESSOR(JSNumberFormat)
} // namespace internal
......
......@@ -32,6 +32,10 @@ namespace internal {
namespace {
// [[Style]] is one of the values "decimal", "percent", "currency",
// or "unit" identifying the style of the number format.
enum class Style { DECIMAL, PERCENT, CURRENCY, UNIT };
// [[CurrencyDisplay]] is one of the values "code", "symbol", "name",
// or "narrowSymbol" identifying the display of the currency number format.
enum class CurrencyDisplay {
......@@ -306,15 +310,15 @@ bool IsWellFormedCurrencyCode(const std::string& currency) {
}
// Return the style as a String.
Handle<String> StyleAsString(Isolate* isolate, JSNumberFormat::Style style) {
Handle<String> StyleAsString(Isolate* isolate, Style style) {
switch (style) {
case JSNumberFormat::Style::PERCENT:
case Style::PERCENT:
return ReadOnlyRoots(isolate).percent_string_handle();
case JSNumberFormat::Style::CURRENCY:
case Style::CURRENCY:
return ReadOnlyRoots(isolate).currency_string_handle();
case JSNumberFormat::Style::UNIT:
case Style::UNIT:
return ReadOnlyRoots(isolate).unit_string_handle();
case JSNumberFormat::Style::DECIMAL:
case Style::DECIMAL:
return ReadOnlyRoots(isolate).decimal_string_handle();
}
UNREACHABLE();
......@@ -627,6 +631,19 @@ std::string UnitFromSkeleton(const icu::UnicodeString& skeleton) {
return result + "-per-" + str.substr(begin, end - begin);
}
Style StyleFromSkeleton(const icu::UnicodeString& skeleton) {
if (skeleton.indexOf("currency/") >= 0) {
return Style::CURRENCY;
}
if (skeleton.indexOf("measure-unit/") >= 0) {
return Style::UNIT;
}
if (skeleton.indexOf("percent ") >= 0) {
return Style::PERCENT;
}
return Style::DECIMAL;
}
} // anonymous namespace
icu::number::LocalizedNumberFormatter
......@@ -696,7 +713,7 @@ Handle<JSObject> JSNumberFormat::ResolvedOptions(
factory->NewStringFromAsciiChecked(numberingSystem.c_str()),
Just(kDontThrow))
.FromJust());
JSNumberFormat::Style style = number_format->style();
Style style = StyleFromSkeleton(skeleton);
CHECK(JSReceiver::CreateDataProperty(
isolate, options, factory->style_string(),
StyleAsString(isolate, style), Just(kDontThrow))
......@@ -719,7 +736,7 @@ Handle<JSObject> JSNumberFormat::ResolvedOptions(
.FromJust());
}
if (style == JSNumberFormat::Style::UNIT) {
if (style == Style::UNIT) {
std::string unit = UnitFromSkeleton(skeleton);
if (!unit.empty()) {
CHECK(JSReceiver::CreateDataProperty(
......@@ -918,15 +935,13 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
// 3. Let style be ? GetOption(options, "style", "string", « "decimal",
// "percent", "currency", "unit" », "decimal").
Maybe<JSNumberFormat::Style> maybe_style =
Intl::GetStringOption<JSNumberFormat::Style>(
isolate, options, "style", service,
{"decimal", "percent", "currency", "unit"},
{JSNumberFormat::Style::DECIMAL, JSNumberFormat::Style::PERCENT,
JSNumberFormat::Style::CURRENCY, JSNumberFormat::Style::UNIT},
JSNumberFormat::Style::DECIMAL);
Maybe<Style> maybe_style = Intl::GetStringOption<Style>(
isolate, options, "style", service,
{"decimal", "percent", "currency", "unit"},
{Style::DECIMAL, Style::PERCENT, Style::CURRENCY, Style::UNIT},
Style::DECIMAL);
MAYBE_RETURN(maybe_style, MaybeHandle<JSNumberFormat>());
JSNumberFormat::Style style = maybe_style.FromJust();
Style style = maybe_style.FromJust();
// 4. Set intlObj.[[Style]] to style.
......@@ -1014,7 +1029,7 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
// 12. If style is "currency", then
icu::UnicodeString currency_ustr;
if (style == JSNumberFormat::Style::CURRENCY) {
if (style == Style::CURRENCY) {
// 12.a. If currency is undefined, throw a TypeError exception.
if (!found_currency.FromJust()) {
THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kCurrencyCode),
......@@ -1047,7 +1062,7 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
}
// 13. If style is "unit", then
if (style == JSNumberFormat::Style::UNIT) {
if (style == Style::UNIT) {
// 13.a If unit is undefined, throw a TypeError exception.
if (unit == "") {
THROW_NEW_ERROR(isolate,
......@@ -1076,14 +1091,14 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
}
}
if (style == JSNumberFormat::Style::PERCENT) {
if (style == Style::PERCENT) {
icu_number_formatter = icu_number_formatter.unit(icu::NoUnit::percent())
.scale(icu::number::Scale::powerOfTen(2));
}
// 23. If style is "currency", then
int mnfd_default, mxfd_default;
if (style == JSNumberFormat::Style::CURRENCY) {
if (style == Style::CURRENCY) {
// b. Let cDigits be CurrencyDigits(currency).
int c_digits = CurrencyDigits(currency_ustr);
// c. Let mnfdDefault be cDigits.
......@@ -1095,7 +1110,7 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
// a. Let mnfdDefault be 0.
mnfd_default = 0;
// b. If style is "percent", then
if (style == JSNumberFormat::Style::PERCENT) {
if (style == Style::PERCENT) {
// i. Let mxfdDefault be 0.
mxfd_default = 0;
} else {
......@@ -1201,8 +1216,6 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
Handle<JSNumberFormat> number_format = Handle<JSNumberFormat>::cast(
isolate->factory()->NewFastOrSlowJSObjectFromMap(map));
DisallowHeapAllocation no_gc;
number_format->set_flags(0);
number_format->set_style(style);
number_format->set_locale(*locale_str);
number_format->set_icu_number_formatter(*managed_number_formatter);
......@@ -1442,10 +1455,15 @@ MaybeHandle<JSArray> JSNumberFormat::FormatToParts(
IcuFormatNumber(isolate, *fmt, numeric_obj, &fp_iter);
MAYBE_RETURN(maybe_format, Handle<JSArray>());
UErrorCode status = U_ZERO_ERROR;
bool style_is_unit =
Style::UNIT == StyleFromSkeleton(fmt->toSkeleton(status));
CHECK(U_SUCCESS(status));
Handle<JSArray> result = factory->NewJSArray(0);
Maybe<int> maybe_format_to_parts = ConstructParts(
isolate, maybe_format.FromJust(), &fp_iter, result, 0, numeric_obj,
number_format->style() == JSNumberFormat::Style::UNIT);
Maybe<int> maybe_format_to_parts =
ConstructParts(isolate, maybe_format.FromJust(), &fp_iter, result, 0,
numeric_obj, style_is_unit);
MAYBE_RETURN(maybe_format_to_parts, Handle<JSArray>());
return result;
......
......@@ -73,30 +73,10 @@ class JSNumberFormat : public JSObject {
DECL_PRINTER(JSNumberFormat)
DECL_VERIFIER(JSNumberFormat)
// [[Style]] is one of the values "decimal", "percent", "currency",
// or "unit" identifying the style of the number format.
// Note: "unit" is added in proposal-unified-intl-numberformat
enum class Style { DECIMAL, PERCENT, CURRENCY, UNIT };
inline void set_style(Style style);
inline Style style() const;
// Layout description.
DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize,
TORQUE_GENERATED_JS_NUMBER_FORMAT_FIELDS)
// Bit positions in |flags|.
#define FLAGS_BIT_FIELDS(V, _) \
V(StyleBits, Style, 2, _)
DEFINE_BIT_FIELDS(FLAGS_BIT_FIELDS)
#undef FLAGS_BIT_FIELDS
STATIC_ASSERT(Style::DECIMAL <= StyleBits::kMax);
STATIC_ASSERT(Style::PERCENT <= StyleBits::kMax);
STATIC_ASSERT(Style::CURRENCY <= StyleBits::kMax);
STATIC_ASSERT(Style::UNIT <= StyleBits::kMax);
DECL_ACCESSORS(locale, String)
DECL_ACCESSORS(icu_number_formatter,
Managed<icu::number::LocalizedNumberFormatter>)
......
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