commit 0624561f4306c2efb34f28da4cd41473b7c78459
parent 593174a0f7153fe141176ea64015899eaafb8db4
Author: André Bargull <andre.bargull@gmail.com>
Date: Thu, 27 Nov 2025 10:03:33 +0000
Bug 1998672 - Part 1: Add TemporalUnit::Unset. r=spidermonkey-reviewers,dminor
Used in the next part.
Differential Revision: https://phabricator.services.mozilla.com/D272018
Diffstat:
6 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/js/src/builtin/intl/DurationFormat.cpp b/js/src/builtin/intl/DurationFormat.cpp
@@ -314,6 +314,7 @@ static auto ToDurationValue(const temporal::Duration& duration,
return DurationValue{duration.microseconds};
case TemporalUnit::Nanosecond:
return DurationValue{duration.nanoseconds};
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
}
@@ -348,6 +349,7 @@ static PropertyName* DurationDisplayName(temporal::TemporalUnit unit,
return cx->names().microsecondsDisplay;
case TemporalUnit::Nanosecond:
return cx->names().nanosecondsDisplay;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
}
@@ -403,6 +405,7 @@ static PropertyName* DurationStyleName(temporal::TemporalUnit unit,
return cx->names().microsecondsStyle;
case TemporalUnit::Nanosecond:
return cx->names().nanosecondsStyle;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
}
@@ -481,6 +484,7 @@ static DurationUnitOptions GetUnitOptions(const DurationFormatOptions& options,
return GET_UNIT_OPTIONS(microseconds);
case TemporalUnit::Nanosecond:
return GET_UNIT_OPTIONS(nanoseconds);
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
@@ -531,6 +535,7 @@ static void SetUnitOptions(DurationFormatOptions& options,
case TemporalUnit::Nanosecond:
SET_UNIT_OPTIONS(nanoseconds);
return;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
@@ -688,6 +693,7 @@ static std::string_view UnitName(temporal::TemporalUnit unit) {
return "microsecond";
case TemporalUnit::Nanosecond:
return "nanosecond";
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
}
@@ -721,6 +727,7 @@ static auto PartUnitName(temporal::TemporalUnit unit) {
return &JSAtomState::microsecond;
case TemporalUnit::Nanosecond:
return &JSAtomState::nanosecond;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
}
diff --git a/js/src/builtin/intl/DurationFormat.h b/js/src/builtin/intl/DurationFormat.h
@@ -68,17 +68,17 @@ class DurationFormatObject : public NativeObject {
static const JSClass& protoClass_;
static constexpr uint32_t INTERNALS_SLOT = 0;
- static constexpr uint32_t NUMBER_FORMAT_YEARS_SLOT = 1;
- static constexpr uint32_t NUMBER_FORMAT_MONTHS_SLOT = 2;
- static constexpr uint32_t NUMBER_FORMAT_WEEKS_SLOT = 3;
- static constexpr uint32_t NUMBER_FORMAT_DAYS_SLOT = 4;
- static constexpr uint32_t NUMBER_FORMAT_HOURS_SLOT = 5;
- static constexpr uint32_t NUMBER_FORMAT_MINUTES_SLOT = 6;
- static constexpr uint32_t NUMBER_FORMAT_SECONDS_SLOT = 7;
- static constexpr uint32_t NUMBER_FORMAT_MILLISECONDS_SLOT = 8;
- static constexpr uint32_t NUMBER_FORMAT_MICROSECONDS_SLOT = 9;
- static constexpr uint32_t NUMBER_FORMAT_NANOSECONDS_SLOT = 10;
- static constexpr uint32_t LIST_FORMAT_SLOT = 11;
+ static constexpr uint32_t LIST_FORMAT_SLOT = 1;
+ static constexpr uint32_t NUMBER_FORMAT_YEARS_SLOT = 2;
+ static constexpr uint32_t NUMBER_FORMAT_MONTHS_SLOT = 3;
+ static constexpr uint32_t NUMBER_FORMAT_WEEKS_SLOT = 4;
+ static constexpr uint32_t NUMBER_FORMAT_DAYS_SLOT = 5;
+ static constexpr uint32_t NUMBER_FORMAT_HOURS_SLOT = 6;
+ static constexpr uint32_t NUMBER_FORMAT_MINUTES_SLOT = 7;
+ static constexpr uint32_t NUMBER_FORMAT_SECONDS_SLOT = 8;
+ static constexpr uint32_t NUMBER_FORMAT_MILLISECONDS_SLOT = 9;
+ static constexpr uint32_t NUMBER_FORMAT_MICROSECONDS_SLOT = 10;
+ static constexpr uint32_t NUMBER_FORMAT_NANOSECONDS_SLOT = 11;
static constexpr uint32_t OPTIONS_SLOT = 12;
static constexpr uint32_t TIME_SEPARATOR_SLOT = 13;
static constexpr uint32_t SLOT_COUNT = 14;
diff --git a/js/src/builtin/temporal/Duration.cpp b/js/src/builtin/temporal/Duration.cpp
@@ -593,6 +593,7 @@ static Duration TemporalDurationFromInternal(const TimeDuration& timeDuration,
case TemporalUnit::Millisecond:
case TemporalUnit::Microsecond:
case TemporalUnit::Nanosecond:
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
MOZ_CRASH("Unexpected temporal unit");
}
@@ -770,6 +771,7 @@ bool js::temporal::TemporalDurationFromInternal(
return true;
}
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
break;
}
@@ -2587,8 +2589,8 @@ static bool BubbleRelativeDuration(
while (unit > largestUnit) {
using TemporalUnitType = std::underlying_type_t<TemporalUnit>;
- static_assert(static_cast<TemporalUnitType>(TemporalUnit::Auto) == 0,
- "TemporalUnit::Auto has value zero");
+ static_assert(static_cast<TemporalUnitType>(TemporalUnit::Auto) == 1,
+ "TemporalUnit::Auto has value one");
MOZ_ASSERT(unit > TemporalUnit::Auto, "can subtract unit by one");
// Steps 4, 6.a, and 6.c.
diff --git a/js/src/builtin/temporal/PlainTime.cpp b/js/src/builtin/temporal/PlainTime.cpp
@@ -802,6 +802,7 @@ TimeRecord js::temporal::RoundTime(const Time& time, Increment increment,
result = &nanosecond;
break;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
case TemporalUnit::Year:
case TemporalUnit::Month:
diff --git a/js/src/builtin/temporal/Temporal.h b/js/src/builtin/temporal/Temporal.h
@@ -258,7 +258,7 @@ bool GetTemporalFractionalSecondDigitsOption(JSContext* cx,
struct SecondsStringPrecision final {
Precision precision = Precision{0};
- TemporalUnit unit = TemporalUnit::Auto;
+ TemporalUnit unit = TemporalUnit::Unset;
Increment increment = Increment{1};
};
@@ -354,8 +354,8 @@ inline const char* ToName(TemporalAddDuration addDuration) {
}
struct DifferenceSettings final {
- TemporalUnit smallestUnit = TemporalUnit::Auto;
- TemporalUnit largestUnit = TemporalUnit::Auto;
+ TemporalUnit smallestUnit = TemporalUnit::Unset;
+ TemporalUnit largestUnit = TemporalUnit::Unset;
TemporalRoundingMode roundingMode = TemporalRoundingMode::Trunc;
Increment roundingIncrement = Increment{1};
};
diff --git a/js/src/builtin/temporal/TemporalUnit.h b/js/src/builtin/temporal/TemporalUnit.h
@@ -13,6 +13,7 @@
namespace js::temporal {
enum class TemporalUnit {
+ Unset,
Auto,
Year,
Month,
@@ -43,6 +44,7 @@ constexpr int64_t ToNanoseconds(TemporalUnit unit) {
case TemporalUnit::Nanosecond:
return 1;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
case TemporalUnit::Year:
case TemporalUnit::Month:
@@ -67,6 +69,7 @@ constexpr int64_t ToMicroseconds(TemporalUnit unit) {
case TemporalUnit::Microsecond:
return 1;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
case TemporalUnit::Year:
case TemporalUnit::Month:
@@ -90,6 +93,7 @@ constexpr int64_t ToMilliseconds(TemporalUnit unit) {
case TemporalUnit::Millisecond:
return 1;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
case TemporalUnit::Year:
case TemporalUnit::Month:
@@ -112,6 +116,7 @@ constexpr int64_t ToSeconds(TemporalUnit unit) {
case TemporalUnit::Second:
return 1;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
case TemporalUnit::Year:
case TemporalUnit::Month:
@@ -141,6 +146,7 @@ constexpr int64_t UnitsPerDay(TemporalUnit unit) {
case TemporalUnit::Nanosecond:
return 86'400'000'000'000;
+ case TemporalUnit::Unset:
case TemporalUnit::Auto:
case TemporalUnit::Year:
case TemporalUnit::Month:
@@ -152,6 +158,8 @@ constexpr int64_t UnitsPerDay(TemporalUnit unit) {
constexpr const char* TemporalUnitToString(TemporalUnit unit) {
switch (unit) {
+ case TemporalUnit::Unset:
+ return "unset";
case TemporalUnit::Auto:
return "auto";
case TemporalUnit::Year: