diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp index de7a9df375..3d281e125b 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp @@ -1063,8 +1063,8 @@ ThrowCompletionOr move_relative_date(GlobalObject& globa // 1. Let newDate be ? CalendarDateAdd(calendar, relativeTo, duration, options). auto* new_date = TRY(calendar_date_add(global_object, calendar, &relative_to, duration)); - // 2. Let days be ! DaysUntil(relativeTo, newDate). - auto days = days_until(global_object, relative_to, *new_date); + // 2. Let days be DaysUntil(relativeTo, newDate). + auto days = days_until(relative_to, *new_date); // 3. Return the Record { [[RelativeTo]]: newDate, [[Days]]: days }. return MoveRelativeDateResult { .relative_to = make_handle(new_date), .days = days }; @@ -1190,8 +1190,8 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d // e. Let yearsMonthsWeeksLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, undefined, dateAdd). auto* years_months_weeks_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months_weeks, nullptr, date_add)); - // f. Let monthsWeeksInDays be ? DaysUntil(yearsLater, yearsMonthsWeeksLater). - auto months_weeks_in_days = days_until(global_object, *years_later, *years_months_weeks_later); + // f. Let monthsWeeksInDays be DaysUntil(yearsLater, yearsMonthsWeeksLater). + auto months_weeks_in_days = days_until(*years_later, *years_months_weeks_later); // g. Set relativeTo to yearsLater. relative_to = years_later; @@ -1229,8 +1229,8 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d // r. Set relativeTo to ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd). relative_to = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_duration, nullptr, date_add)); - // s. Let daysPassed be ? DaysUntil(oldRelativeTo, relativeTo). - auto days_passed = days_until(global_object, *old_relative_to, *relative_to); + // s. Let daysPassed be DaysUntil(oldRelativeTo, relativeTo). + auto days_passed = days_until(*old_relative_to, *relative_to); // t. Set days to days - daysPassed. days -= days_passed; @@ -1280,8 +1280,8 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d // e. Let yearsMonthsWeeksLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, undefined, dateAdd). auto* years_months_weeks_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months_weeks, nullptr, date_add)); - // f. Let weeksInDays be ? DaysUntil(yearsMonthsLater, yearsMonthsWeeksLater). - auto weeks_in_days = days_until(global_object, *years_months_later, *years_months_weeks_later); + // f. Let weeksInDays be DaysUntil(yearsMonthsLater, yearsMonthsWeeksLater). + auto weeks_in_days = days_until(*years_months_later, *years_months_weeks_later); // g. Set relativeTo to yearsMonthsLater. relative_to = years_months_later; diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h index c9934ce127..b407d37cb1 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -163,13 +164,22 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_duration( // 7.5.22 DaysUntil ( earlier, later ), https://tc39.es/proposal-temporal/#sec-temporal-daysuntil template -double days_until(GlobalObject& global_object, EarlierObjectType& earlier, LaterObjectType& later) +double days_until(EarlierObjectType& earlier, LaterObjectType& later) { - // 1. Let difference be ! DifferenceISODate(earlier.[[ISOYear]], earlier.[[ISOMonth]], earlier.[[ISODay]], later.[[ISOYear]], later.[[ISOMonth]], later.[[ISODay]], "day"). - auto difference = difference_iso_date(global_object, earlier.iso_year(), earlier.iso_month(), earlier.iso_day(), later.iso_year(), later.iso_month(), later.iso_day(), "day"sv); + // 1. Let epochDays1 be MakeDay(𝔽(earlier.[[ISOYear]]), 𝔽(earlier.[[ISOMonth]] - 1), 𝔽(earlier.[[ISODay]])). + auto epoch_days_1 = make_day(earlier.iso_year(), earlier.iso_month() - 1, earlier.iso_day()); - // 2. Return difference.[[Days]]. - return difference.days; + // 2. Assert: epochDays1 is finite. + VERIFY(isfinite(epoch_days_1)); + + // 3. Let epochDays2 be MakeDay(𝔽(later.[[ISOYear]]), 𝔽(later.[[ISOMonth]] - 1), 𝔽(later.[[ISODay]])). + auto epoch_days_2 = make_day(later.iso_year(), later.iso_month() - 1, later.iso_day()); + + // 4. Assert: epochDays2 is finite. + VERIFY(isfinite(epoch_days_2)); + + // 5. Return ℝ(epochDays2) - ℝ(epochDays1). + return epoch_days_2 - epoch_days_1; } }