diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp index 518f6351c2..011c8aa3ee 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp @@ -1236,64 +1236,67 @@ ThrowCompletionOr round_duration(VM& vm, double years, double m // h. Let days be days + monthsWeeksInDays. days += months_weeks_in_days; - // i. Let daysDuration be ? CreateTemporalDuration(0, 0, 0, days, 0, 0, 0, 0, 0, 0). + // i. Assert: days is an integer. + VERIFY(trunc(days) == days); + + // j. Let daysDuration be ? CreateTemporalDuration(0, 0, 0, days, 0, 0, 0, 0, 0, 0). auto* days_duration = TRY(create_temporal_duration(vm, 0, 0, 0, days, 0, 0, 0, 0, 0, 0)); - // j. Let daysLater be ? CalendarDateAdd(calendar, relativeTo, daysDuration, undefined, dateAdd). + // k. Let daysLater be ? CalendarDateAdd(calendar, relativeTo, daysDuration, undefined, dateAdd). auto* days_later = TRY(calendar_date_add(vm, *calendar, relative_to, *days_duration, nullptr, date_add)); - // k. Let untilOptions be OrdinaryObjectCreate(null). + // l. Let untilOptions be OrdinaryObjectCreate(null). auto* until_options = Object::create(realm, nullptr); - // l. Perform ! CreateDataPropertyOrThrow(untilOptions, "largestUnit", "year"). + // m. Perform ! CreateDataPropertyOrThrow(untilOptions, "largestUnit", "year"). MUST(until_options->create_data_property_or_throw(vm.names.largestUnit, js_string(vm, "year"sv))); - // m. Let timePassed be ? CalendarDateUntil(calendar, relativeTo, daysLater, untilOptions). + // n. Let timePassed be ? CalendarDateUntil(calendar, relativeTo, daysLater, untilOptions). auto* time_passed = TRY(calendar_date_until(vm, *calendar, relative_to, days_later, *until_options)); - // n. Let yearsPassed be timePassed.[[Years]]. + // o. Let yearsPassed be timePassed.[[Years]]. auto years_passed = time_passed->years(); - // o. Set years to years + yearsPassed. + // p. Set years to years + yearsPassed. years += years_passed; - // p. Let oldRelativeTo be relativeTo. + // q. Let oldRelativeTo be relativeTo. auto* old_relative_to = relative_to; - // q. Let yearsDuration be ! CreateTemporalDuration(yearsPassed, 0, 0, 0, 0, 0, 0, 0, 0, 0). + // r. Let yearsDuration be ! CreateTemporalDuration(yearsPassed, 0, 0, 0, 0, 0, 0, 0, 0, 0). years_duration = MUST(create_temporal_duration(vm, years_passed, 0, 0, 0, 0, 0, 0, 0, 0, 0)); - // r. Set relativeTo to ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd). + // s. Set relativeTo to ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd). relative_to = TRY(calendar_date_add(vm, *calendar, relative_to, *years_duration, nullptr, date_add)); - // s. Let daysPassed be DaysUntil(oldRelativeTo, relativeTo). + // t. Let daysPassed be DaysUntil(oldRelativeTo, relativeTo). auto days_passed = days_until(*old_relative_to, *relative_to); - // t. Set days to days - daysPassed. + // u. Set days to days - daysPassed. days -= days_passed; - // u. If days < 0, let sign be -1; else, let sign be 1. + // v. If days < 0, let sign be -1; else, let sign be 1. auto sign = days < 0 ? -1 : 1; - // v. Let oneYear be ! CreateTemporalDuration(sign, 0, 0, 0, 0, 0, 0, 0, 0, 0). + // w. Let oneYear be ! CreateTemporalDuration(sign, 0, 0, 0, 0, 0, 0, 0, 0, 0). auto* one_year = MUST(create_temporal_duration(vm, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); - // w. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear, dateAdd). + // x. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear, dateAdd). auto move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_year, date_add)); - // x. Let oneYearDays be moveResult.[[Days]]. + // y. Let oneYearDays be moveResult.[[Days]]. auto one_year_days = move_result.days; - // y. Let fractionalYears be years + days / abs(oneYearDays). + // z. Let fractionalYears be years + days / abs(oneYearDays). auto fractional_years = years + days / fabs(one_year_days); - // z. Set years to RoundNumberToIncrement(fractionalYears, increment, roundingMode). + // aa. Set years to RoundNumberToIncrement(fractionalYears, increment, roundingMode). years = round_number_to_increment(fractional_years, increment, rounding_mode); - // aa. Set remainder to fractionalYears - years. + // ab. Set remainder to fractionalYears - years. remainder = fractional_years - years; - // ab. Set months, weeks, and days to 0. + // ac. Set months, weeks, and days to 0. months = 0; weeks = 0; days = 0; @@ -1527,10 +1530,13 @@ ThrowCompletionOr round_duration(VM& vm, double years, double m remainder -= nanoseconds; } - // 19. Let duration be ? CreateDurationRecord(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). + // 19. Assert: days is an integer. + VERIFY(trunc(days) == days); + + // 20. Let duration be ? CreateDurationRecord(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). auto duration = TRY(create_duration_record(vm, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)); - // 20. Return the Record { [[DurationRecord]]: duration, [[Remainder]]: remainder }. + // 21. Return the Record { [[DurationRecord]]: duration, [[Remainder]]: remainder }. return RoundedDuration { .duration_record = duration, .remainder = remainder }; }