From 35daa934d52350d37dc5939e7ffc0b0ec7fd12a1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20Bargull?= Date: Thu, 25 Apr 2024 09:41:10 +0000 Subject: [PATCH] =?utf8?q?Bug=201893155=20-=20Part=203:=20Replace=20AddISO?= =?utf8?q?Date=20=E2=86=92=20BalanceISODate=20if=20only=20adding=20days.?= =?utf8?q?=20r=3Dspidermonkey-reviewers,dminor?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Changes from: https://github.com/tc39/proposal-temporal/commit/623e2c9117f1ea5dface5821ed874fd59b873107 Depends on D208478 Differential Revision: https://phabricator.services.mozilla.com/D208479 --- js/src/builtin/temporal/Duration.cpp | 13 ++++++------- js/src/builtin/temporal/PlainDate.cpp | 10 +++++++--- js/src/builtin/temporal/PlainDate.h | 2 +- js/src/builtin/temporal/PlainYearMonth.cpp | 7 ++----- js/src/builtin/temporal/TimeZone.cpp | 14 ++++---------- js/src/builtin/temporal/ZonedDateTime.cpp | 3 +-- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/js/src/builtin/temporal/Duration.cpp b/js/src/builtin/temporal/Duration.cpp index 354ebae0ae55..54e467374b75 100644 --- a/js/src/builtin/temporal/Duration.cpp +++ b/js/src/builtin/temporal/Duration.cpp @@ -3560,8 +3560,8 @@ static bool RoundDurationYear(JSContext* cx, const NormalizedDuration& duration, // Step 9.h. PlainDate isoResult; - if (!AddISODate(cx, yearsLaterDate, {0, 0, 0, fractionalDays.truncate()}, - TemporalOverflow::Constrain, &isoResult)) { + if (!BalanceISODate(cx, yearsLaterDate, fractionalDays.truncate(), + &isoResult)) { return false; } @@ -3703,9 +3703,8 @@ static bool RoundDurationMonth(JSContext* cx, // Step 10.h. PlainDate isoResult; - if (!AddISODate(cx, yearsMonthsLaterDate, - {0, 0, 0, fractionalDays.truncate()}, - TemporalOverflow::Constrain, &isoResult)) { + if (!BalanceISODate(cx, yearsMonthsLaterDate, fractionalDays.truncate(), + &isoResult)) { return false; } @@ -3816,8 +3815,8 @@ static bool RoundDurationWeek(JSContext* cx, const NormalizedDuration& duration, // Step 11.a PlainDate isoResult; - if (!AddISODate(cx, relativeToDate, {0, 0, 0, fractionalDays.truncate()}, - TemporalOverflow::Constrain, &isoResult)) { + if (!BalanceISODate(cx, relativeToDate, fractionalDays.truncate(), + &isoResult)) { return false; } diff --git a/js/src/builtin/temporal/PlainDate.cpp b/js/src/builtin/temporal/PlainDate.cpp index e65070313a98..a15d95cdc140 100644 --- a/js/src/builtin/temporal/PlainDate.cpp +++ b/js/src/builtin/temporal/PlainDate.cpp @@ -690,15 +690,19 @@ PlainDate js::temporal::BalanceISODateNew(int32_t year, int32_t month, /** * BalanceISODate ( year, month, day ) */ -bool js::temporal::BalanceISODate(JSContext* cx, int32_t year, int32_t month, - int64_t day, PlainDate* result) { +bool js::temporal::BalanceISODate(JSContext* cx, const PlainDate& date, + int64_t days, PlainDate* result) { + MOZ_ASSERT(IsValidISODate(date)); + MOZ_ASSERT(ISODateTimeWithinLimits(date)); + + int64_t day = int64_t(date.day) + days; if (!CanBalanceISODay(day)) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_TEMPORAL_PLAIN_DATE_INVALID); return false; } - *result = BalanceISODate(year, month, int32_t(day)); + *result = BalanceISODate(date.year, date.month, int32_t(day)); return true; } diff --git a/js/src/builtin/temporal/PlainDate.h b/js/src/builtin/temporal/PlainDate.h index 454b689fa9eb..f8217eb5e02f 100644 --- a/js/src/builtin/temporal/PlainDate.h +++ b/js/src/builtin/temporal/PlainDate.h @@ -246,7 +246,7 @@ int32_t CompareISODate(const PlainDate& one, const PlainDate& two); /** * BalanceISODate ( year, month, day ) */ -bool BalanceISODate(JSContext* cx, int32_t year, int32_t month, int64_t day, +bool BalanceISODate(JSContext* cx, const PlainDate& date, int64_t days, PlainDate* result); /** diff --git a/js/src/builtin/temporal/PlainYearMonth.cpp b/js/src/builtin/temporal/PlainYearMonth.cpp index 8aee509d2205..c28277e2be18 100644 --- a/js/src/builtin/temporal/PlainYearMonth.cpp +++ b/js/src/builtin/temporal/PlainYearMonth.cpp @@ -674,11 +674,8 @@ static bool AddDurationToOrSubtractDurationFromPlainYearMonth( auto nextMonthDate = ToPlainDate(unwrappedNextMonth); // Step 14.c. - PlainDate endOfMonthISO; - if (!AddISODate(cx, nextMonthDate, {0, 0, 0, -1}, - TemporalOverflow::Constrain, &endOfMonthISO)) { - return false; - } + auto endOfMonthISO = BalanceISODate(nextMonthDate.year, nextMonthDate.month, + nextMonthDate.day - 1); // Step 14.d. Rooted endOfMonth(cx); diff --git a/js/src/builtin/temporal/TimeZone.cpp b/js/src/builtin/temporal/TimeZone.cpp index d4d7e085a973..8282b6739e9a 100644 --- a/js/src/builtin/temporal/TimeZone.cpp +++ b/js/src/builtin/temporal/TimeZone.cpp @@ -1895,11 +1895,8 @@ bool js::temporal::DisambiguatePossibleInstants( "subtracting nanoseconds is at most one day"); // Step 19.c. - PlainDate earlierDate; - if (!AddISODate(cx, dateTime.date, {0, 0, 0, earlierTime.days}, - TemporalOverflow::Constrain, &earlierDate)) { - return false; - } + auto earlierDate = BalanceISODate(dateTime.date.year, dateTime.date.month, + dateTime.date.day + earlierTime.days); // Step 19.d. Rooted calendar(cx, CalendarValue(cx->names().iso8601)); @@ -1936,11 +1933,8 @@ bool js::temporal::DisambiguatePossibleInstants( "adding nanoseconds is at most one day"); // Step 23. - PlainDate laterDate; - if (!AddISODate(cx, dateTime.date, {0, 0, 0, laterTime.days}, - TemporalOverflow::Constrain, &laterDate)) { - return false; - } + auto laterDate = BalanceISODate(dateTime.date.year, dateTime.date.month, + dateTime.date.day + laterTime.days); // Step 24. Rooted calendar(cx, CalendarValue(cx->names().iso8601)); diff --git a/js/src/builtin/temporal/ZonedDateTime.cpp b/js/src/builtin/temporal/ZonedDateTime.cpp index 34291ff7acfa..74f085923e46 100644 --- a/js/src/builtin/temporal/ZonedDateTime.cpp +++ b/js/src/builtin/temporal/ZonedDateTime.cpp @@ -1340,8 +1340,7 @@ static bool RoundISODateTime(JSContext* cx, const PlainDateTime& dateTime, // Step 4. PlainDate balanceResult; - if (!BalanceISODate(cx, date.year, date.month, - int64_t(date.day) + roundedTime.days, &balanceResult)) { + if (!BalanceISODate(cx, date, roundedTime.days, &balanceResult)) { return false; } -- 2.11.4.GIT