commit 832ab64ac0fef1e9ed5bb0759bf4419d4948adaf
parent c285f533dca03ad24aee56b4d42e9a1a4a21d5df
Author: André Bargull <andre.bargull@gmail.com>
Date: Thu, 27 Nov 2025 10:03:35 +0000
Bug 1955545 - Part 1: Remove support for "islamic" and "islamic-rgsa" calendars in Temporal. r=spidermonkey-reviewers,dminor
Implements `Temporal` related changes from:
<https://github.com/tc39/proposal-intl-era-monthcode/pull/46>
Differential Revision: https://phabricator.services.mozilla.com/D272027
Diffstat:
7 files changed, 11 insertions(+), 74 deletions(-)
diff --git a/js/src/builtin/temporal/Calendar.cpp b/js/src/builtin/temporal/Calendar.cpp
@@ -341,12 +341,8 @@ std::string_view js::temporal::CalendarIdentifier(CalendarId calendarId) {
return "hebrew";
case CalendarId::Indian:
return "indian";
- case CalendarId::Islamic:
- return "islamic";
case CalendarId::IslamicCivil:
return "islamic-civil";
- case CalendarId::IslamicRGSA:
- return "islamic-rgsa";
case CalendarId::IslamicTabular:
return "islamic-tbla";
case CalendarId::IslamicUmmAlQura:
@@ -537,12 +533,7 @@ static inline bool DayOfMonthCanBeZero(CalendarId calendarId) {
// Workaround when day-of-month returns zero.
//
// See <https://github.com/unicode-org/icu4x/issues/5069>.
- static constexpr mozilla::EnumSet<CalendarId> calendars{
- CalendarId::Islamic,
- CalendarId::IslamicRGSA,
- CalendarId::IslamicUmmAlQura,
- };
- return calendars.contains(calendarId);
+ return calendarId == CalendarId::IslamicUmmAlQura;
}
static inline int32_t OrdinalMonth(CalendarId calendarId,
@@ -626,9 +617,6 @@ static auto ToAnyCalendarKind(CalendarId id) {
return icu4x::capi::CalendarKind_Indian;
case CalendarId::IslamicCivil:
return icu4x::capi::CalendarKind_HijriTabularTypeIIFriday;
- case CalendarId::Islamic:
- case CalendarId::IslamicRGSA:
- return icu4x::capi::CalendarKind_HijriSimulatedMecca;
case CalendarId::IslamicTabular:
return icu4x::capi::CalendarKind_HijriTabularTypeIIThursday;
case CalendarId::IslamicUmmAlQura:
@@ -687,8 +675,6 @@ static uint32_t MaximumISOYear(CalendarId calendarId) {
return 10'000;
}
- case CalendarId::Islamic:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicUmmAlQura: {
// Lower limit for these calendars to avoid running into ICU4X assertions.
//
@@ -727,8 +713,6 @@ static uint32_t MaximumCalendarYear(CalendarId calendarId) {
return 10'000;
}
- case CalendarId::Islamic:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicUmmAlQura: {
// Lower limit for these calendars to avoid running into ICU4X assertions.
//
@@ -888,12 +872,9 @@ static constexpr std::string_view IcuEraName(CalendarId calendar, EraCode era) {
return "shaka";
}
- // https://docs.rs/icu/latest/icu/calendar/cal/struct.HijriSimulated.html#era-codes
// https://docs.rs/icu/latest/icu/calendar/cal/struct.HijriTabular.html#era-codes
// https://docs.rs/icu/latest/icu/calendar/cal/struct.HijriUmmAlQura.html#era-codes
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura: {
MOZ_ASSERT(era == EraCode::Standard || era == EraCode::Inverse);
@@ -1252,9 +1233,7 @@ static UniqueICU4XDate CreateDateFrom(JSContext* cx, CalendarId calendarId,
case CalendarId::EthiopianAmeteAlem:
case CalendarId::Gregorian:
case CalendarId::Indian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Japanese:
@@ -1520,9 +1499,7 @@ static bool CalendarDateYear(JSContext* cx, CalendarId calendar,
case CalendarId::Indian:
case CalendarId::Persian:
case CalendarId::Gregorian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Japanese: {
@@ -3116,9 +3093,7 @@ bool js::temporal::CalendarInLeapYear(JSContext* cx,
break;
}
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura: {
MOZ_ASSERT(!CalendarHasLeapMonths(calendarId));
@@ -3764,9 +3739,7 @@ static bool NonISODateAdd(JSContext* cx, CalendarId calendarId,
case CalendarId::EthiopianAmeteAlem:
case CalendarId::Hebrew:
case CalendarId::Indian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Persian:
@@ -4160,9 +4133,7 @@ static bool NonISODateUntil(JSContext* cx, CalendarId calendarId,
case CalendarId::EthiopianAmeteAlem:
case CalendarId::Hebrew:
case CalendarId::Indian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Persian:
diff --git a/js/src/builtin/temporal/Calendar.h b/js/src/builtin/temporal/Calendar.h
@@ -57,9 +57,7 @@ enum class CalendarId : int32_t {
Indian,
// Islamic lunar calendars.
- Islamic,
IslamicCivil,
- IslamicRGSA,
IslamicTabular,
IslamicUmmAlQura,
@@ -84,17 +82,7 @@ inline constexpr auto availableCalendars = {
CalendarId::Gregorian,
CalendarId::Hebrew,
CalendarId::Indian,
-// See Bug 1950425, this calendar is only available on Nightly due to
-// inconsistencies between ICU4X and ICU4C.
-#ifdef NIGHTLY_BUILD
- CalendarId::Islamic,
-#endif
CalendarId::IslamicCivil,
-// See Bug 1950425, this calendar is only available on Nightly due to
-// inconsistencies between ICU4X and ICU4C.
-#ifdef NIGHTLY_BUILD
- CalendarId::IslamicRGSA,
-#endif
CalendarId::IslamicTabular,
// See Bug 1950425, this calendar is only available on Nightly due to
// inconsistencies between ICU4X and ICU4C.
diff --git a/js/src/builtin/temporal/Era.h b/js/src/builtin/temporal/Era.h
@@ -127,9 +127,7 @@ constexpr auto& CalendarEras(CalendarId id) {
return eras::Standard;
case CalendarId::Gregorian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::ROC:
@@ -165,9 +163,7 @@ constexpr auto& CalendarEraNames(CalendarId calendar, EraCode era) {
: eras::names::GregorianInverse;
}
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura: {
MOZ_ASSERT(era == EraCode::Standard || era == EraCode::Inverse);
@@ -228,9 +224,7 @@ constexpr bool CalendarEraStartsAtYearBoundary(CalendarId id) {
// Calendar system which use multiple eras, but each era starts at a year
// boundary.
case CalendarId::Gregorian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::ROC:
diff --git a/js/src/builtin/temporal/MonthCode.h b/js/src/builtin/temporal/MonthCode.h
@@ -178,7 +178,6 @@ class MonthCodes final {
//
// https://docs.rs/icu/latest/icu/calendar/cal/struct.Buddhist.html#month-codes
// https://docs.rs/icu/latest/icu/calendar/cal/struct.Indian.html#month-codes
-// https://docs.rs/icu/latest/icu/calendar/cal/struct.HijriSimulated.html#month-codes
// https://docs.rs/icu/latest/icu/calendar/cal/struct.HijriTabular.html#month-codes
// https://docs.rs/icu/latest/icu/calendar/cal/struct.HijriUmmAlQura.html#month-codes
// https://docs.rs/icu/latest/icu/calendar/cal/struct.Japanese.html#month-codes
@@ -228,9 +227,7 @@ constexpr auto& CalendarMonthCodes(CalendarId id) {
case CalendarId::Buddhist:
case CalendarId::Gregorian:
case CalendarId::Indian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Persian:
@@ -262,9 +259,7 @@ constexpr bool CalendarHasLeapMonths(CalendarId id) {
case CalendarId::EthiopianAmeteAlem:
case CalendarId::Gregorian:
case CalendarId::Indian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Japanese:
@@ -289,9 +284,7 @@ constexpr bool CalendarHasEpagomenalMonths(CalendarId id) {
case CalendarId::Gregorian:
case CalendarId::Hebrew:
case CalendarId::Indian:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
case CalendarId::Japanese:
@@ -344,9 +337,7 @@ constexpr std::pair<int32_t, int32_t> CalendarDaysInMonth(CalendarId id) {
case CalendarId::Chinese:
case CalendarId::Dangi:
case CalendarId::Hebrew:
- case CalendarId::Islamic:
case CalendarId::IslamicCivil:
- case CalendarId::IslamicRGSA:
case CalendarId::IslamicTabular:
case CalendarId::IslamicUmmAlQura:
return {29, 30};
@@ -449,9 +440,7 @@ constexpr std::pair<int32_t, int32_t> CalendarDaysInMonth(CalendarId id,
return {30, 30};
}
- // Islamic calendars have 29-30 days per month.
- case CalendarId::Islamic:
- case CalendarId::IslamicRGSA:
+ // IslamicUmmAlQura calendar has 29-30 days per month.
case CalendarId::IslamicUmmAlQura:
return {29, 30};
diff --git a/js/src/tests/jstests.list b/js/src/tests/jstests.list
@@ -864,6 +864,10 @@ skip script test262/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.
# https://github.com/tc39/test262/pull/4659
skip script test262/staging/Intl402/Temporal/old/indian-calendar.js
+# "Intl era and monthCode" proposal should clarify if "islamic" and "islamic-rgsa" are still allowed
+# for Intl.DisplayNames.
+skip script test262/intl402/Intl/supportedValuesOf/calendars-accepted-by-DisplayNames.js
+
##############################################
# Enable Iterator Helpers tests in the shell #
@@ -1055,16 +1059,11 @@ skip script test262/built-ins/Temporal/ZonedDateTime/prototype/until/argument-st
# See Bug 1950425, skip tests for calendars disabled in release or beta
skip-if(release_or_beta) script non262/Temporal/Intl/defaults.js
skip-if(release_or_beta) script test262/staging/Intl402/Temporal/old/non-iso-calendars-islamic-umalqura.js
-skip-if(release_or_beta) script test262/staging/Intl402/Temporal/old/islamic-calendars-islamic.js
-skip-if(release_or_beta) script test262/staging/Intl402/Temporal/old/islamic-calendars-islamic-rgsa.js
skip-if(release_or_beta) script test262/staging/Intl402/Temporal/old/islamic-calendars-islamic-umalqura.js
skip-if(release_or_beta) script test262/intl402/Temporal/PlainMonthDay/from/constrain-to-leap-day.js
# Try re-enabling when Bug 1954138 or Bug 1955545 are fixed.
-skip script test262/staging/Intl402/Temporal/old/non-iso-calendars-islamic.js
-skip script test262/staging/Intl402/Temporal/old/non-iso-calendars-islamic-rgsa.js
skip script test262/intl402/DateTimeFormat/constructor-options-calendar-islamic-fallback.js
-skip script test262/staging/Intl402/Temporal/old/islamic-calendars-islamic-rgsa.js
# https://github.com/tc39/proposal-intl-era-monthcode/issues/23. ICU4X 2.0 doesn't have inverse type
skip script test262/staging/Intl402/Temporal/old/non-iso-calendars-coptic.js
diff --git a/js/src/tests/non262/Temporal/Intl/consistent-dates.js b/js/src/tests/non262/Temporal/Intl/consistent-dates.js
@@ -228,15 +228,6 @@ const tests = {
end: {iso: "2293-11-30", year: 6054, monthCode: "M02", day: 30},
},
],
- "islamic": [
- // TODO: Not yet supported.
-
- // Date ranges in 2000..2030 where ICU4C and ICU4X compute different results.
- // {
- // start: {iso: "2000-01-01", year: 1420, monthCode: "M09", day: 23},
- // end: {iso: "2029-12-31", year: 1451, monthCode: "M08", day: 25},
- // },
- ],
"islamic-umalqura": [
// TODO: Not yet supported.
diff --git a/js/src/tests/non262/Temporal/Intl/defaults.js b/js/src/tests/non262/Temporal/Intl/defaults.js
@@ -25,6 +25,11 @@ let plainTime = zonedDateTime.toPlainTime();
for (let locale of locales) {
for (let calendar of Intl.supportedValuesOf("calendar")) {
+ // Invalid calendar identifiers for Temporal.
+ if (calendar === "islamic" || calendar === "islamic-rgsa") {
+ continue;
+ }
+
// Calendar must match for YearMonth and MonthDay.
//
// https://github.com/js-temporal/proposal-temporal-v2/issues/29