فهرست منبع

LibJS: Add explicit assertion for days

This is an editorial change in Temporal spec.

See: https://github.com/tc39/proposal-temporal/commit/15b7293b38956a99805a48ab042a780a343cb5e2
Smrtnyk 2 سال پیش
والد
کامیت
56abb01ee3
1فایلهای تغییر یافته به همراه28 افزوده شده و 22 حذف شده
  1. 28 22
      Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp

+ 28 - 22
Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp

@@ -1236,64 +1236,67 @@ ThrowCompletionOr<RoundedDuration> 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<RoundedDuration> 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 };
 }