Bug 214795 - [JSC] Add Intl Enumeration APIs
Summary: [JSC] Add Intl Enumeration APIs
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Yusuke Suzuki
URL:
Keywords: InRadar
Depends on:
Blocks: 218829
  Show dependency treegraph
 
Reported: 2020-07-25 23:16 PDT by Yusuke Suzuki
Modified: 2021-08-24 12:28 PDT (History)
11 users (show)

See Also:


Attachments
Prototyping (17.01 KB, patch)
2020-07-26 00:40 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Prototyping (17.89 KB, patch)
2020-07-26 01:12 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (21.40 KB, patch)
2021-08-20 02:37 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (21.40 KB, patch)
2021-08-20 02:38 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (37.56 KB, patch)
2021-08-21 16:27 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (38.54 KB, patch)
2021-08-21 16:32 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (41.94 KB, patch)
2021-08-22 16:45 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (41.85 KB, patch)
2021-08-22 20:04 PDT, Yusuke Suzuki
ews-feeder: commit-queue-
Details | Formatted Diff | Diff
Patch (41.89 KB, patch)
2021-08-22 20:18 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (43.85 KB, patch)
2021-08-22 21:33 PDT, Yusuke Suzuki
ross.kirsling: review+
Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Yusuke Suzuki 2020-07-25 23:16:06 PDT
Prototyping?
https://github.com/tc39/proposal-intl-enumeration
Comment 1 Yusuke Suzuki 2020-07-26 00:40:33 PDT
Created attachment 405247 [details]
Prototyping
Comment 2 Yusuke Suzuki 2020-07-26 00:41:53 PDT
print(JSON.stringify(Intl.getSupportedCalendars()));
print(JSON.stringify(Intl.getSupportedCurrencies()));
print(JSON.stringify(Intl.getSupportedNumberingSystems()));
print(JSON.stringify(Intl.getSupportedTimeZones()));
print(JSON.stringify(Intl.getSupportedTimeZones({region: "US"})));
print(JSON.stringify(Intl.getSupportedUnits()));

["gregorian","japanese","buddhist","roc","persian","islamic-civil","islamic","hebrew","chinese","indian","coptic","ethiopic","ethiopic-amete-alem","iso8601","dangi","islamic-umalqura","islamic-tbla","islamic-rgsa"]
["AED","AFN","ALL","AMD","ANG","AOA","ARS","AUD","AWG","AZN","BAM","BBD","BDT","BGN","BHD","BIF","BMD","BND","BOB","BRL","BSD","BTN","BWP","BYN","BZD","CAD","CDF","CHF","CLP","CNY","COP","CRC","CUC","CUP","CVE","CZK","DJF","DKK","DOP","DZD","EGP","ERN","ETB","EUR","FJD","FKP","GBP","GEL","GHS","GIP","GMD","GNF","GTQ","GYD","HKD","HNL","HRK","HTG","HUF","IDR","ILS","INR","IQD","IRR","ISK","JMD","JOD","JPY","KES","KGS","KHR","KMF","KPW","KRW","KWD","KYD","KZT","LAK","LBP","LKR","LRD","LSL","LYD","MAD","MDL","MGA","MKD","MMK","MNT","MOP","MRU","MUR","MVR","MWK","MXN","MYR","MZN","NAD","NGN","NIO","NOK","NPR","NZD","OMR","PAB","PEN","PGK","PHP","PKR","PLN","PYG","QAR","RON","RSD","RUB","RWF","SAR","SBD","SCR","SDG","SEK","SGD","SHP","SLL","SOS","SRD","SSP","STN","SYP","SZL","THB","TJS","TMT","TND","TOP","TRY","TTD","TWD","TZS","UAH","UGX","USD","UYU","UZS","VEF","VND","VUV","WST","XAF","XCD","XOF","XPF","YER","ZAR","ZMW"]
["adlm","ahom","arab","arabext","armn","armnlow","bali","beng","bhks","brah","cakm","cham","cyrl","deva","diak","ethi","fullwide","geor","gong","gonm","grek","greklow","gujr","guru","hanidays","hanidec","hans","hansfin","hant","hantfin","hebr","hmng","hmnp","java","jpan","jpanfin","jpanyear","kali","khmr","knda","lana","lanatham","laoo","latn","lepc","limb","mathbold","mathdbl","mathmono","mathsanb","mathsans","mlym","modi","mong","mroo","mtei","mymr","mymrshan","mymrtlng","newa","nkoo","olck","orya","osma","rohg","roman","romanlow","saur","segment","shrd","sind","sinh","sora","sund","takr","talu","taml","tamldec","telu","thai","tibt","tirh","vaii","wara","wcho"]
["Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmera","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/La_Rioja","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Buenos_Aires","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Catamarca","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Coral_Harbour","America/Cordoba","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Godthab","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Indianapolis","America/Inuvik","America/Iqaluit","America/Jamaica","America/Jujuy","America/Juneau","America/Kentucky/Monticello","America/Kralendijk","America/La_Paz","America/Lima","America/Los_Angeles","America/Louisville","America/Lower_Princes","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Mendoza","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montreal","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santa_Isabel","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Katmandu","Asia/Khandyga","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","CET","CST6CDT","EET","EST5EDT","Etc/GMT","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8","Etc/GMT-9","Etc/UTC","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Factory","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","MET","MST7MDT","PST8PDT","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Ponape","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Truk","Pacific/Wake","Pacific/Wallis","SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT","SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7","SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT","SystemV/YST9","SystemV/YST9YDT","WET"]
["America/Adak","America/Anchorage","America/Boise","America/Chicago","America/Denver","America/Detroit","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Indianapolis","America/Juneau","America/Kentucky/Monticello","America/Los_Angeles","America/Louisville","America/Menominee","America/Metlakatla","America/New_York","America/Nome","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Phoenix","America/Sitka","America/Yakutat","Pacific/Honolulu"]
["acre","bit","byte","celsius","centimeter","day","degree","fahrenheit","fluid-ounce","foot","gallon","gigabit","gigabyte","gram","hectare","hour","inch","kilobit","kilobyte","kilogram","kilometer","liter","megabit","megabyte","meter","mile","mile-scandinavian","milliliter","millimeter","millisecond","minute","month","ounce","percent","petabyte","pound","second","stone","terabit","terabyte","week","yard","year"]
Comment 3 Yusuke Suzuki 2020-07-26 00:43:33 PDT
1. Intl.getSupportedCalendars should be canonicalized

ICU value is slightly different from https://tc39.es/proposal-intl-enumeration/#sec-availablecalendars

2. Intl.getSupportedTimeZones should be canonicalized

It includes some fun values like, "SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT","SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7","SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT","SystemV/YST9","SystemV/YST9YDT","WET"
Comment 4 Yusuke Suzuki 2020-07-26 00:49:47 PDT
BCP47 calendars
https://github.com/unicode-org/cldr/blob/master/common/bcp47/calendar.xml

We should use name in it.
Comment 5 Yusuke Suzuki 2020-07-26 01:12:02 PDT
Created attachment 405248 [details]
Prototyping
Comment 6 Radar WebKit Bug Importer 2020-08-01 23:17:19 PDT
<rdar://problem/66436864>
Comment 7 Yusuke Suzuki 2021-08-20 02:37:28 PDT
Created attachment 435960 [details]
Patch
Comment 8 Yusuke Suzuki 2021-08-20 02:38:56 PDT
Created attachment 435962 [details]
Patch
Comment 9 Yusuke Suzuki 2021-08-21 16:27:03 PDT
Created attachment 436093 [details]
Patch
Comment 10 Yusuke Suzuki 2021-08-21 16:32:50 PDT
Created attachment 436094 [details]
Patch
Comment 11 Yusuke Suzuki 2021-08-22 16:45:47 PDT
Created attachment 436140 [details]
Patch
Comment 12 Ross Kirsling 2021-08-22 18:47:24 PDT
Comment on attachment 436140 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=436140&action=review

> Source/JavaScriptCore/runtime/IntlObject.h:68
> +extern JS_EXPORT_PRIVATE const MeasureUnit simpleUnits[43];

Hmm, it feels a little gross to need to hardcode a magic number in the header like this...

> JSTests/stress/intl-enumeration.js:19
> +shouldBe(JSON.stringify(calendars), `["buddhist","chinese","coptic","dangi","ethioaa","ethiopic","gregory","hebrew","indian","islamic","islamic-civil","islamic-rgsa","islamic-tbla","islamic-umalqura","iso8601","japanese","persian","roc"]`);

Are we sure that all current ICU versions will have these exact values for each enumeration?
Comment 13 Yusuke Suzuki 2021-08-22 20:04:27 PDT
Created attachment 436144 [details]
Patch
Comment 14 Yusuke Suzuki 2021-08-22 20:18:42 PDT
Created attachment 436145 [details]
Patch
Comment 15 Yusuke Suzuki 2021-08-22 21:24:52 PDT
Comment on attachment 436140 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=436140&action=review

>> Source/JavaScriptCore/runtime/IntlObject.h:68
>> +extern JS_EXPORT_PRIVATE const MeasureUnit simpleUnits[43];
> 
> Hmm, it feels a little gross to need to hardcode a magic number in the header like this...

Currently, this is the only way to achieve this unfortunately.

>> JSTests/stress/intl-enumeration.js:19
>> +shouldBe(JSON.stringify(calendars), `["buddhist","chinese","coptic","dangi","ethioaa","ethiopic","gregory","hebrew","indian","islamic","islamic-civil","islamic-rgsa","islamic-tbla","islamic-umalqura","iso8601","japanese","persian","roc"]`);
> 
> Are we sure that all current ICU versions will have these exact values for each enumeration?

Not sure, but at least, it passed EWS. We should just modify when we found another things since it is not possible to collect all candidates of all ICU versions.
Comment 16 Yusuke Suzuki 2021-08-22 21:33:48 PDT
Created attachment 436147 [details]
Patch
Comment 17 Yusuke Suzuki 2021-08-22 21:38:03 PDT
Comment on attachment 436140 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=436140&action=review

>>> Source/JavaScriptCore/runtime/IntlObject.h:68
>>> +extern JS_EXPORT_PRIVATE const MeasureUnit simpleUnits[43];
>> 
>> Hmm, it feels a little gross to need to hardcode a magic number in the header like this...
> 
> Currently, this is the only way to achieve this unfortunately.

At least, if the number is incorrect, it becomes compile error.

1. If the number is smaller than the number of actual entries, of course it becomes compile error in C++.
2. If the number is larger than the number of actual entries, it becomes compile error since we cannot initialize MeasureUnit without specifying values.
Comment 18 Ross Kirsling 2021-08-23 10:32:21 PDT
Comment on attachment 436147 [details]
Patch

r=me

(In reply to Yusuke Suzuki from comment #15)
> >> JSTests/stress/intl-enumeration.js:19
> >> +shouldBe(JSON.stringify(calendars), `["buddhist","chinese","coptic","dangi","ethioaa","ethiopic","gregory","hebrew","indian","islamic","islamic-civil","islamic-rgsa","islamic-tbla","islamic-umalqura","iso8601","japanese","persian","roc"]`);
> > 
> > Are we sure that all current ICU versions will have these exact values for each enumeration?
> 
> Not sure, but at least, it passed EWS. We should just modify when we found
> another things since it is not possible to collect all candidates of all ICU
> versions.

Fair enough; I guess I was thinking like "`calendars` contains _at least_ these values", etc.
Comment 19 Yusuke Suzuki 2021-08-24 12:28:43 PDT
Committed r281513 (240886@main): <https://commits.webkit.org/240886@main>