Source/JavaScriptCore/ChangeLog

 12021-07-10 Yusuke Suzuki <ysuzuki@apple.com>
 2
 3 [JSC] Extend Intl TimeZoneName Option
 4 https://bugs.webkit.org/show_bug.cgi?id=227831
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 https://github.com/tc39/proposal-intl-extend-timezonename
 9
 10 This patch implements Extend Intl TimeZoneName proposal, which adds "shortOffset", "longOffset", "shortGeneric", "longGeneric"
 11 timeZoneName variants.
 12
 13 * runtime/IntlDateTimeFormat.cpp:
 14 (JSC::IntlDateTimeFormat::setFormatsFromPattern):
 15 (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
 16 (JSC::IntlDateTimeFormat::timeZoneNameString):
 17 * runtime/IntlDateTimeFormat.h:
 18
1192021-07-08 Yijia Huang <yijia_huang@apple.com>
220
321 Add Air opcode add/sub-and-shift for ARM64 and select this instruction in Air

Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp

@@void IntlDateTimeFormat::setFormatsFromPattern(const StringView& pattern)
411411 m_second = Second::TwoDigit;
412412 break;
413413 case 'z':
414  case 'v':
415  case 'V':
416414 if (count == 1)
417415 m_timeZoneName = TimeZoneName::Short;
418416 else if (count == 4)
419417 m_timeZoneName = TimeZoneName::Long;
420418 break;
 419 case 'O':
 420 if (count == 1)
 421 m_timeZoneName = TimeZoneName::ShortOffset;
 422 else if (count == 4)
 423 m_timeZoneName = TimeZoneName::LongOffset;
 424 break;
 425 case 'v':
 426 case 'V':
 427 if (count == 1)
 428 m_timeZoneName = TimeZoneName::ShortGeneric;
 429 else if (count == 4)
 430 m_timeZoneName = TimeZoneName::LongGeneric;
 431 break;
421432 case 'S':
422433 m_fractionalSecondDigits = count;
423434 break;

@@void IntlDateTimeFormat::initializeDateTimeFormat(JSGlobalObject* globalObject,
789800 for (unsigned i = 0; i < fractionalSecondDigits; ++i)
790801 skeletonBuilder.append('S');
791802
792  TimeZoneName timeZoneName = intlOption<TimeZoneName>(globalObject, options, vm.propertyNames->timeZoneName, { { "short"_s, TimeZoneName::Short }, { "long"_s, TimeZoneName::Long } }, "timeZoneName must be \"short\" or \"long\""_s, TimeZoneName::None);
 803 TimeZoneName timeZoneName = intlOption<TimeZoneName>(globalObject, options, vm.propertyNames->timeZoneName, { { "short"_s, TimeZoneName::Short }, { "long"_s, TimeZoneName::Long }, { "shortOffset"_s, TimeZoneName::ShortOffset }, { "longOffset"_s, TimeZoneName::LongOffset }, { "shortGeneric"_s, TimeZoneName::ShortGeneric}, { "longGeneric"_s, TimeZoneName::LongGeneric } }, "timeZoneName must be \"short\", \"long\", \"shortOffset\", \"longOffset\", \"shortGenric\", or \"longGeneric\""_s, TimeZoneName::None);
793804 RETURN_IF_EXCEPTION(scope, void());
794805 switch (timeZoneName) {
795806 case TimeZoneName::Short:

@@void IntlDateTimeFormat::initializeDateTimeFormat(JSGlobalObject* globalObject,
798809 case TimeZoneName::Long:
799810 skeletonBuilder.append("zzzz");
800811 break;
 812 case TimeZoneName::ShortOffset:
 813 skeletonBuilder.append('O');
 814 break;
 815 case TimeZoneName::LongOffset:
 816 skeletonBuilder.append("OOOO");
 817 break;
 818 case TimeZoneName::ShortGeneric:
 819 skeletonBuilder.append('v');
 820 break;
 821 case TimeZoneName::LongGeneric:
 822 skeletonBuilder.append("vvvv");
 823 break;
801824 case TimeZoneName::None:
802825 break;
803826 }

@@ASCIILiteral IntlDateTimeFormat::timeZoneNameString(TimeZoneName timeZoneName)
11001123 return "short"_s;
11011124 case TimeZoneName::Long:
11021125 return "long"_s;
 1126 case TimeZoneName::ShortOffset:
 1127 return "shortOffset"_s;
 1128 case TimeZoneName::LongOffset:
 1129 return "longOffset"_s;
 1130 case TimeZoneName::ShortGeneric:
 1131 return "shortGeneric"_s;
 1132 case TimeZoneName::LongGeneric:
 1133 return "longGeneric"_s;
11031134 case TimeZoneName::None:
11041135 ASSERT_NOT_REACHED();
11051136 return ASCIILiteral::null();

Source/JavaScriptCore/runtime/IntlDateTimeFormat.h

@@class IntlDateTimeFormat final : public JSNonFinalObject {
102102 enum class Hour : uint8_t { None, TwoDigit, Numeric };
103103 enum class Minute : uint8_t { None, TwoDigit, Numeric };
104104 enum class Second : uint8_t { None, TwoDigit, Numeric };
105  enum class TimeZoneName : uint8_t { None, Short, Long };
 105 enum class TimeZoneName : uint8_t { None, Short, Long, ShortOffset, LongOffset, ShortGeneric, LongGeneric };
106106 enum class DateTimeStyle : uint8_t { None, Full, Long, Medium, Short };
107107
108108 void setFormatsFromPattern(const StringView&);

JSTests/ChangeLog

 12021-07-10 Yusuke Suzuki <ysuzuki@apple.com>
 2
 3 [JSC] Extend Intl TimeZoneName Option
 4 https://bugs.webkit.org/show_bug.cgi?id=227831
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * stress/intl-extended-timezone-names.js: Added.
 9 (shouldBe):
 10 (timeZoneTest):
 11 (vm.icuVersion):
 12
1132021-07-08 Yusuke Suzuki <ysuzuki@apple.com>
214
315 [JSC] Update Intl.Locale test after AppleICU update

JSTests/stress/intl-extended-timezone-names.js

 1function shouldBe(actual, expected) {
 2 if (actual !== expected)
 3 throw new Error("bad value: " + actual);
 4}
 5
 6let timeZoneNames = ["short", "long", "shortOffset", "longOffset", "shortGeneric", "longGeneric"];
 7let date = new Date(1625939282389);
 8
 9function timeZoneTest(date, locale, expectedSet, timeZone = "America/Los_Angeles")
 10{
 11 timeZoneNames.forEach(function(timeZoneName) {
 12 let formatter = new Intl.DateTimeFormat(locale, {
 13 year: "numeric",
 14 month: "numeric",
 15 day: "numeric",
 16 hour: "2-digit",
 17 minute: "2-digit",
 18 second: "2-digit",
 19 timeZone,
 20 timeZoneName
 21 });
 22 let actual = formatter.format(date);
 23 shouldBe(actual, expectedSet[timeZoneName]);
 24 // print(`${timeZoneName}: "${actual}",`);
 25 });
 26}
 27
 28if ($vm.icuVersion() > 64) {
 29 timeZoneTest(date, "en", {
 30 short: "7/10/2021, 10:48:02 AM PDT",
 31 long: "7/10/2021, 10:48:02 AM Pacific Daylight Time",
 32 shortOffset: "7/10/2021, 10:48:02 AM GMT-7",
 33 longOffset: "7/10/2021, 10:48:02 AM GMT-07:00",
 34 shortGeneric: "7/10/2021, 10:48:02 AM PT",
 35 longGeneric: "7/10/2021, 10:48:02 AM Pacific Time",
 36 });
 37
 38 timeZoneTest(date, "en", {
 39 short: "7/10/2021, 11:18:02 PM GMT+5:30",
 40 long: "7/10/2021, 11:18:02 PM India Standard Time",
 41 shortOffset: "7/10/2021, 11:18:02 PM GMT+5:30",
 42 longOffset: "7/10/2021, 11:18:02 PM GMT+05:30",
 43 shortGeneric: "7/10/2021, 11:18:02 PM India Time",
 44 longGeneric: "7/10/2021, 11:18:02 PM India Standard Time",
 45 }, "Asia/Calcutta");
 46
 47 timeZoneTest(date, "zh-Hant", {
 48 short: "2021/7/10 PDT 上午10:48:02",
 49 long: "2021/7/10 太平洋夏令時間 上午10:48:02",
 50 shortOffset: "2021/7/10 GMT-7 上午10:48:02",
 51 longOffset: "2021/7/10 GMT-07:00 上午10:48:02",
 52 shortGeneric: "2021/7/10 PT 上午10:48:02",
 53 longGeneric: "2021/7/10 太平洋時間 上午10:48:02",
 54 });
 55
 56 timeZoneTest(date, "ja-JP", {
 57 short: "2021/7/10 10:48:02 GMT-7",
 58 long: "2021/7/10 10時48分02秒 アメリカ太平洋夏時間",
 59 shortOffset: "2021/7/10 10時48分02秒 GMT-7",
 60 longOffset: "2021/7/10 10時48分02秒 GMT-07:00",
 61 shortGeneric: "2021/7/10 10:48:02 ロサンゼルス時間",
 62 longGeneric: "2021/7/10 10:48:02 アメリカ太平洋時間",
 63 });
 64
 65 timeZoneTest(date, "ja-JP", {
 66 short: "2021/7/11 02:48:02 JST",
 67 long: "2021/7/11 02時48分02秒 日本標準時",
 68 shortOffset: "2021/7/11 02時48分02秒 GMT+9",
 69 longOffset: "2021/7/11 02時48分02秒 GMT+09:00",
 70 shortGeneric: "2021/7/11 02:48:02 JST",
 71 longGeneric: "2021/7/11 02:48:02 日本標準時",
 72 }, "Asia/Tokyo");
 73}