Skip to content
forked from v8/v8

Commit

Permalink
[intl] Sync to ECMA402 PR709 to not read option twice
Browse files Browse the repository at this point in the history
tc39/ecma402#709

Change DateTimeFormat logic to read option only once.
Track which fields is not undefined from the GetOptions.
Change test/intl to reflect the change and remove dup test.

PR709 reached TC39 consensus in July 2023 meeting.

Bug: v8:13908
Change-Id: I5a5429f6375a01b04e77093d32acb76ae1e40d11
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4706795
Commit-Queue: Frank Tang <ftang@chromium.org>
Reviewed-by: Shu-yu Guo <syg@chromium.org>
Cr-Commit-Position: refs/heads/main@{#89241}
  • Loading branch information
FrankYFTang authored and V8 LUCI CQ committed Jul 27, 2023
1 parent 8672781 commit 82b1da3
Show file tree
Hide file tree
Showing 11 changed files with 333 additions and 530 deletions.
398 changes: 170 additions & 228 deletions src/objects/js-date-time-format.cc

Large diffs are not rendered by default.

17 changes: 10 additions & 7 deletions src/objects/js-date-time-format.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,20 @@ namespace internal {
class JSDateTimeFormat
: public TorqueGeneratedJSDateTimeFormat<JSDateTimeFormat, JSObject> {
public:
// ecma-402/#sec-todatetimeoptions
enum class RequiredOption { kDate, kTime, kAny };
enum class DefaultsOption { kDate, kTime, kAll };

V8_WARN_UNUSED_RESULT static MaybeHandle<JSDateTimeFormat> New(
Isolate* isolate, Handle<Map> map, Handle<Object> locales,
Handle<Object> options, const char* service);

V8_WARN_UNUSED_RESULT static MaybeHandle<JSDateTimeFormat>
CreateDateTimeFormat(Isolate* isolate, Handle<Map> map,
Handle<Object> locales, Handle<Object> options,
RequiredOption required, DefaultsOption defaults,
const char* service);

V8_WARN_UNUSED_RESULT static MaybeHandle<JSObject> ResolvedOptions(
Isolate* isolate, Handle<JSDateTimeFormat> date_time_format);

Expand Down Expand Up @@ -80,13 +90,6 @@ class JSDateTimeFormat
Handle<Object> x_date_value, Handle<Object> y_date_value,
const char* method_name);

// ecma-402/#sec-todatetimeoptions
enum class RequiredOption { kDate, kTime, kAny };
enum class DefaultsOption { kDate, kTime, kAll };
V8_WARN_UNUSED_RESULT static MaybeHandle<JSObject> ToDateTimeOptions(
Isolate* isolate, Handle<Object> input_options, RequiredOption required,
DefaultsOption defaults);

V8_WARN_UNUSED_RESULT static MaybeHandle<String> ToLocaleDateTime(
Isolate* isolate, Handle<Object> date, Handle<Object> locales,
Handle<Object> options, RequiredOption required, DefaultsOption defaults,
Expand Down
84 changes: 36 additions & 48 deletions test/intl/date-format/constructor-date-style-order.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ let weekday = new Array();
let year = new Array();
let month = new Array();
let day = new Array();
let dayPeriod = new Array();
let hour = new Array();
let minute = new Array();
let second = new Array();
Expand All @@ -20,6 +21,7 @@ let dateStyle = new Array();
let timeStyle = new Array();
let timeZone = new Array();
let era = new Array();
let fractionalSecondDigits = new Array();
let timeZoneName = new Array();
let formatMatcher = new Array();

Expand All @@ -36,6 +38,9 @@ new Intl.DateTimeFormat(['en-US'], {
get day() {
day.push(++getCount);
},
get dayPeriod() {
dayPeriod.push(++getCount);
},
get hour() {
hour.push(++getCount);
},
Expand Down Expand Up @@ -70,68 +75,51 @@ new Intl.DateTimeFormat(['en-US'], {
get timeZoneName() {
timeZoneName.push(++getCount);
},
get fractionalSecondDigits() {
fractionalSecondDigits.push(++getCount);
},
get formatMatcher() {
formatMatcher.push(++getCount);
}
});

// Read by ToDateTimeOptions and also in Table 1
// https://tc39.es/proposal-intl-datetime-style/#table-datetimeformat-components
assertEquals(2, weekday.length);
assertEquals(2, year.length);
assertEquals(2, month.length);
assertEquals(2, day.length);
assertEquals(2, hour.length);
assertEquals(2, minute.length);
assertEquals(2, second.length);

// In Table 1
// https://tc39.es/proposal-intl-datetime-style/#table-datetimeformat-components
assertEquals(1, weekday.length);
assertEquals(1, hour.length);
assertEquals(1, minute.length);
assertEquals(1, second.length);
assertEquals(1, year.length);
assertEquals(1, month.length);
assertEquals(1, day.length);
assertEquals(1, era.length);
assertEquals(1, timeZoneName.length);

// Read by ToDateTimeOptions and InitializeDateTimeFormat
assertEquals(2, dateStyle.length);
assertEquals(2, timeStyle.length);

// Only read by InitializeDateTimeFormat
assertEquals(1, dateStyle.length);
assertEquals(1, timeStyle.length);
assertEquals(1, localeMatcher.length);
assertEquals(1, hour12.length);
assertEquals(1, hourCycle.length);
assertEquals(1, timeZone.length);
assertEquals(1, formatMatcher.length);

// ToDateTimeOptions
assertEquals(1, weekday[0]);
assertEquals(2, year[0]);
assertEquals(3, month[0]);
assertEquals(4, day[0]);
assertEquals(5, hour[0]);
assertEquals(6, minute[0]);
assertEquals(7, second[0]);
assertEquals(8, dateStyle[0]);
assertEquals(9, timeStyle[0]);

// InitializeDateTimeFormat
assertEquals(10, localeMatcher[0]);
assertEquals(11, hour12[0]);
assertEquals(12, hourCycle[0]);
assertEquals(13, timeZone[0]);
assertEquals(1, localeMatcher[0]);
assertEquals(2, hour12[0]);
assertEquals(3, hourCycle[0]);
assertEquals(4, timeZone[0]);

// Table 1 loop in InitializeDateTimeFormat
assertEquals(14, weekday[1]);
assertEquals(15, era[0]);
assertEquals(16, year[1]);
assertEquals(17, month[1]);
assertEquals(18, day[1]);
assertEquals(19, hour[1]);
assertEquals(20, minute[1]);
assertEquals(21, second[1]);
assertEquals(22, timeZoneName[0]);
assertEquals(5, weekday[0]);
assertEquals(6, era[0]);
assertEquals(7, year[0]);
assertEquals(8, month[0]);
assertEquals(9, day[0]);
assertEquals(10, dayPeriod[0]);
assertEquals(11, hour[0]);
assertEquals(12, minute[0]);
assertEquals(13, second[0]);
assertEquals(14, fractionalSecondDigits[0]);
assertEquals(15, timeZoneName[0]);

// After the Table 1 loop in InitializeDateTimeFormat
assertEquals(23, formatMatcher[0]);
assertEquals(24, dateStyle[1]);
assertEquals(25, timeStyle[1]);
assertEquals(16, formatMatcher[0]);
assertEquals(17, dateStyle[0]);
assertEquals(18, timeStyle[0]);

assertEquals(25, getCount);
assertEquals(18, getCount);
84 changes: 36 additions & 48 deletions test/intl/date-format/constructor-date-time-style-order.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ let weekday = new Array();
let year = new Array();
let month = new Array();
let day = new Array();
let dayPeriod = new Array();
let hour = new Array();
let minute = new Array();
let second = new Array();
Expand All @@ -20,6 +21,7 @@ let dateStyle = new Array();
let timeStyle = new Array();
let timeZone = new Array();
let era = new Array();
let fractionalSecondDigits = new Array();
let timeZoneName = new Array();
let formatMatcher = new Array();

Expand All @@ -36,6 +38,9 @@ new Intl.DateTimeFormat(['en-US'], {
get day() {
day.push(++getCount);
},
get dayPeriod() {
dayPeriod.push(++getCount);
},
get hour() {
hour.push(++getCount);
},
Expand Down Expand Up @@ -71,68 +76,51 @@ new Intl.DateTimeFormat(['en-US'], {
get timeZoneName() {
timeZoneName.push(++getCount);
},
get fractionalSecondDigits() {
fractionalSecondDigits.push(++getCount);
},
get formatMatcher() {
formatMatcher.push(++getCount);
}
});

// Read by ToDateTimeOptions and also in Table 1
// https://tc39.es/proposal-intl-datetime-style/#table-datetimeformat-components
assertEquals(2, weekday.length);
assertEquals(2, year.length);
assertEquals(2, month.length);
assertEquals(2, day.length);
assertEquals(2, hour.length);
assertEquals(2, minute.length);
assertEquals(2, second.length);

// In Table 1
// https://tc39.es/proposal-intl-datetime-style/#table-datetimeformat-components
assertEquals(1, weekday.length);
assertEquals(1, hour.length);
assertEquals(1, minute.length);
assertEquals(1, second.length);
assertEquals(1, year.length);
assertEquals(1, month.length);
assertEquals(1, day.length);
assertEquals(1, era.length);
assertEquals(1, timeZoneName.length);

// Read by ToDateTimeOptions and InitializeDateTimeFormat
assertEquals(2, dateStyle.length);
assertEquals(2, timeStyle.length);

// Only read by InitializeDateTimeFormat
assertEquals(1, dateStyle.length);
assertEquals(1, timeStyle.length);
assertEquals(1, localeMatcher.length);
assertEquals(1, hour12.length);
assertEquals(1, hourCycle.length);
assertEquals(1, timeZone.length);
assertEquals(1, formatMatcher.length);

// ToDateTimeOptions
assertEquals(1, weekday[0]);
assertEquals(2, year[0]);
assertEquals(3, month[0]);
assertEquals(4, day[0]);
assertEquals(5, hour[0]);
assertEquals(6, minute[0]);
assertEquals(7, second[0]);
assertEquals(8, dateStyle[0]);
assertEquals(9, timeStyle[0]);

// InitializeDateTimeFormat
assertEquals(10, localeMatcher[0]);
assertEquals(11, hour12[0]);
assertEquals(12, hourCycle[0]);
assertEquals(13, timeZone[0]);
assertEquals(1, localeMatcher[0]);
assertEquals(2, hour12[0]);
assertEquals(3, hourCycle[0]);
assertEquals(4, timeZone[0]);

// Table 1 loop in InitializeDateTimeFormat
assertEquals(14, weekday[1]);
assertEquals(15, era[0]);
assertEquals(16, year[1]);
assertEquals(17, month[1]);
assertEquals(18, day[1]);
assertEquals(19, hour[1]);
assertEquals(20, minute[1]);
assertEquals(21, second[1]);
assertEquals(22, timeZoneName[0]);
assertEquals(5, weekday[0]);
assertEquals(6, era[0]);
assertEquals(7, year[0]);
assertEquals(8, month[0]);
assertEquals(9, day[0]);
assertEquals(10, dayPeriod[0]);
assertEquals(11, hour[0]);
assertEquals(12, minute[0]);
assertEquals(13, second[0]);
assertEquals(14, fractionalSecondDigits[0]);
assertEquals(15, timeZoneName[0]);

// After the Table 1 loop in InitializeDateTimeFormat
assertEquals(23, formatMatcher[0]);
assertEquals(24, dateStyle[1]);
assertEquals(25, timeStyle[1]);
assertEquals(16, formatMatcher[0]);
assertEquals(17, dateStyle[0]);
assertEquals(18, timeStyle[0]);

assertEquals(25, getCount);
assertEquals(18, getCount);
Loading

0 comments on commit 82b1da3

Please sign in to comment.