Commit c8233829 authored by Frank Tang's avatar Frank Tang Committed by Commit Bot

Hide date related types from Intl.DisplayNames

To sync with https://github.com/tc39/proposal-intl-displaynames/pull/63

Bug: v8:10069
Change-Id: I64921c348a69ca7b265d498cac9e7da9f3e3f755
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1975038Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Frank Tang <ftang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#65530}
parent 6ce3046e
......@@ -211,9 +211,10 @@ DEFINE_IMPLICATION(harmony_import_meta, harmony_dynamic_import)
V(harmony_top_level_await, "harmony top level await")
#ifdef V8_INTL_SUPPORT
#define HARMONY_INPROGRESS(V) \
HARMONY_INPROGRESS_BASE(V) \
V(harmony_intl_displaynames, "Intl.DisplayNames")
#define HARMONY_INPROGRESS(V) \
HARMONY_INPROGRESS_BASE(V) \
V(harmony_intl_displaynames, "Intl.DisplayNames") \
V(harmony_intl_displaynames_date_types, "Intl.DisplayNames date types")
#else
#define HARMONY_INPROGRESS(V) HARMONY_INPROGRESS_BASE(V)
#endif
......
......@@ -4277,6 +4277,7 @@ EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_top_level_await)
#ifdef V8_INTL_SUPPORT
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_intl_add_calendar_numbering_system)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_intl_displaynames_date_types)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_intl_dateformat_day_period)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(
harmony_intl_dateformat_fractional_second_digits)
......
......@@ -517,22 +517,25 @@ MaybeHandle<JSDisplayNames> JSDisplayNames::New(Isolate* isolate,
Intl::MatcherOption matcher = maybe_locale_matcher.FromJust();
std::unique_ptr<char[]> calendar_str = nullptr;
const std::vector<const char*> empty_values = {};
// 10. Let calendar be ? GetOption(options, "calendar",
// "string", undefined, undefined).
Maybe<bool> maybe_calendar = Intl::GetStringOption(
isolate, options, "calendar", empty_values, service, &calendar_str);
MAYBE_RETURN(maybe_calendar, MaybeHandle<JSDisplayNames>());
// 11. If calendar is not undefined, then
if (maybe_calendar.FromJust() && calendar_str != nullptr) {
// a. If calendar does not match the (3*8alphanum) *("-" (3*8alphanum))
// sequence, throw a RangeError exception.
if (!Intl::IsWellFormedCalendar(calendar_str.get())) {
THROW_NEW_ERROR(
isolate,
NewRangeError(MessageTemplate::kInvalid, factory->calendar_string(),
factory->NewStringFromAsciiChecked(calendar_str.get())),
JSDisplayNames);
if (FLAG_harmony_intl_displaynames_date_types) {
const std::vector<const char*> empty_values = {};
// 10. Let calendar be ? GetOption(options, "calendar",
// "string", undefined, undefined).
Maybe<bool> maybe_calendar = Intl::GetStringOption(
isolate, options, "calendar", empty_values, service, &calendar_str);
MAYBE_RETURN(maybe_calendar, MaybeHandle<JSDisplayNames>());
// 11. If calendar is not undefined, then
if (maybe_calendar.FromJust() && calendar_str != nullptr) {
// a. If calendar does not match the (3*8alphanum) *("-" (3*8alphanum))
// sequence, throw a RangeError exception.
if (!Intl::IsWellFormedCalendar(calendar_str.get())) {
THROW_NEW_ERROR(
isolate,
NewRangeError(
MessageTemplate::kInvalid, factory->calendar_string(),
factory->NewStringFromAsciiChecked(calendar_str.get())),
JSDisplayNames);
}
}
}
......@@ -541,12 +544,15 @@ MaybeHandle<JSDisplayNames> JSDisplayNames::New(Isolate* isolate,
// ecma402/#sec-Intl.DisplayNames-internal-slots
// The value of the [[RelevantExtensionKeys]] internal slot is
// « "ca" ».
std::set<std::string> relevant_extension_keys = {"ca"};
std::set<std::string> relevant_extension_keys_ca = {"ca"};
std::set<std::string> relevant_extension_keys = {};
// 13. Let r be ResolveLocale(%DisplayNames%.[[AvailableLocales]],
// requestedLocales, opt, %DisplayNames%.[[RelevantExtensionKeys]]).
Intl::ResolvedLocale r =
Intl::ResolveLocale(isolate, JSDisplayNames::GetAvailableLocales(),
requested_locales, matcher, relevant_extension_keys);
Intl::ResolvedLocale r = Intl::ResolveLocale(
isolate, JSDisplayNames::GetAvailableLocales(), requested_locales,
matcher,
FLAG_harmony_intl_displaynames_date_types ? relevant_extension_keys_ca
: relevant_extension_keys);
icu::Locale icu_locale = r.icu_locale;
UErrorCode status = U_ZERO_ERROR;
......@@ -570,22 +576,34 @@ MaybeHandle<JSDisplayNames> JSDisplayNames::New(Isolate* isolate,
// 16. Let type be ? GetOption(options, "type", "string", « "language",
// "region", "script", "currency", "weekday", "month", "quarter",
// "dayPeriod", "dateTimeField" », "language").
Maybe<Type> maybe_type = Intl::GetStringOption<Type>(
isolate, options, "type", "Intl.DisplayNames",
{"language", "region", "script", "currency", "weekday", "month",
"quarter", "dayPeriod", "dateTimeField"},
{
Type::kLanguage,
Type::kRegion,
Type::kScript,
Type::kCurrency,
Type::kWeekday,
Type::kMonth,
Type::kQuarter,
Type::kDayPeriod,
Type::kDateTimeField,
},
Type::kLanguage);
Maybe<Type> maybe_type =
FLAG_harmony_intl_displaynames_date_types
? Intl::GetStringOption<Type>(
isolate, options, "type", "Intl.DisplayNames",
{"language", "region", "script", "currency", "weekday", "month",
"quarter", "dayPeriod", "dateTimeField"},
{
Type::kLanguage,
Type::kRegion,
Type::kScript,
Type::kCurrency,
Type::kWeekday,
Type::kMonth,
Type::kQuarter,
Type::kDayPeriod,
Type::kDateTimeField,
},
Type::kLanguage)
: Intl::GetStringOption<Type>(
isolate, options, "type", "Intl.DisplayNames",
{"language", "region", "script", "currency"},
{
Type::kLanguage,
Type::kRegion,
Type::kScript,
Type::kCurrency,
},
Type::kLanguage);
MAYBE_RETURN(maybe_type, MaybeHandle<JSDisplayNames>());
Type type_enum = maybe_type.FromJust();
......
......@@ -84,21 +84,6 @@ assertDoesNotThrow(
assertDoesNotThrow(
() => new Intl.DisplayNames('sr', {type: 'currency'}));
assertDoesNotThrow(
() => new Intl.DisplayNames('sr', {type: 'month'}));
assertDoesNotThrow(
() => new Intl.DisplayNames('sr', {type: 'weekday'}));
assertDoesNotThrow(
() => new Intl.DisplayNames('sr', {type: 'quarter'}));
assertDoesNotThrow(
() => new Intl.DisplayNames('sr', {type: 'dayPeriod'}));
assertDoesNotThrow(
() => new Intl.DisplayNames('sr', {type: 'dateTimeField'}));
assertThrows(
() => new Intl.DisplayNames('sr', {type: ''}),
RangeError);
......@@ -15,8 +15,7 @@ assertEquals('language', displayNames.resolvedOptions().type);
assertEquals('code', displayNames.resolvedOptions().fallback);
const styles = ["long", "short", "narrow"];
const types = ["language", "region", "script", "currency", "weekday", "month",
"quarter", "dayPeriod", "dateTimeField"];
const types = ["language", "region", "script", "currency"];
const fallbacks = ["code", "none"];
styles.forEach(function(style) {
......
......@@ -457,6 +457,10 @@
# https://bugs.chromium.org/p/v8/issues/detail?id=7472
'intl402/NumberFormat/currency-digits': [FAIL],
# https://bugs.chromium.org/p/v8/issues/detail?id=10069
'intl402/DisplayNames/options-type-valid': [FAIL],
'intl402/DisplayNames/prototype/resolvedOptions/option-type': [FAIL],
# https://bugs.chromium.org/p/v8/issues/detail?id=7831
'language/statements/generators/generator-created-after-decl-inst': [FAIL],
'language/expressions/generators/generator-created-after-decl-inst': [FAIL],
......
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