LibJS: Make CombineDateAndTimeDuration infallible

This is an editorial change in the Temporal proposal. See:
794960c
This commit is contained in:
Timothy Flynn 2024-12-05 10:10:39 -05:00 committed by Tim Flynn
commit 0e81092685
Notes: github-actions[bot] 2024-12-05 21:06:37 +00:00
9 changed files with 41 additions and 41 deletions

View file

@ -89,8 +89,8 @@ InternalDuration to_internal_duration_record(VM& vm, Duration const& duration)
// 2. Let timeDuration be TimeDurationFromComponents(duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]).
auto time_duration = time_duration_from_components(duration.hours(), duration.minutes(), duration.seconds(), duration.milliseconds(), duration.microseconds(), duration.nanoseconds());
// 3. Return ! CombineDateAndTimeDuration(dateDuration, timeDuration).
return MUST(combine_date_and_time_duration(vm, date_duration, move(time_duration)));
// 3. Return CombineDateAndTimeDuration(dateDuration, timeDuration).
return combine_date_and_time_duration(date_duration, move(time_duration));
}
// 7.5.6 ToInternalDurationRecordWith24HourDays ( duration ), https://tc39.es/proposal-temporal/#sec-temporal-tointernaldurationrecordwith24hourdays
@ -105,8 +105,8 @@ InternalDuration to_internal_duration_record_with_24_hour_days(VM& vm, Duration
// 3. Let dateDuration be ! CreateDateDurationRecord(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], 0).
auto date_duration = MUST(create_date_duration_record(vm, duration.years(), duration.months(), duration.weeks(), 0));
// 4. Return ! CombineDateAndTimeDuration(dateDuration, timeDuration).
return MUST(combine_date_and_time_duration(vm, date_duration, move(time_duration)));
// 4. Return CombineDateAndTimeDuration(dateDuration, timeDuration).
return combine_date_and_time_duration(date_duration, move(time_duration));
}
// 7.5.7 ToDateDurationRecordWithoutTime ( duration ), https://tc39.es/proposal-temporal/#sec-temporal-todatedurationrecordwithouttime
@ -327,7 +327,7 @@ ThrowCompletionOr<DateDuration> adjust_date_duration_record(VM& vm, DateDuration
}
// 7.5.11 CombineDateAndTimeDuration ( dateDuration, timeDuration ), https://tc39.es/proposal-temporal/#sec-temporal-combinedateandtimeduration
ThrowCompletionOr<InternalDuration> combine_date_and_time_duration(VM& vm, DateDuration date_duration, TimeDuration time_duration)
InternalDuration combine_date_and_time_duration(DateDuration date_duration, TimeDuration time_duration)
{
// 1. Let dateSign be DateDurationSign(dateDuration).
auto date_sign = date_duration_sign(date_duration);
@ -335,9 +335,9 @@ ThrowCompletionOr<InternalDuration> combine_date_and_time_duration(VM& vm, DateD
// 2. Let timeSign be TimeDurationSign(timeDuration).
auto time_sign = time_duration_sign(time_duration);
// 3. If dateSign ≠ 0 and timeSign ≠ 0 and dateSign ≠ timeSign, throw a RangeError exception.
if (date_sign != 0 && time_sign != 0 && date_sign != time_sign)
return vm.throw_completion<RangeError>(ErrorType::TemporalInvalidDuration);
// 3. Assert: If dateSign ≠ 0 and timeSign ≠ 0, dateSign = timeSign.
if (date_sign != 0 && time_sign != 0)
VERIFY(date_sign == time_sign);
// 4. Return Internal Duration Record { [[Date]]: dateDuration, [[Time]]: timeDuration }.
return InternalDuration { date_duration, move(time_duration) };
@ -1067,8 +1067,8 @@ ThrowCompletionOr<CalendarNudgeResult> nudge_to_calendar_unit(VM& vm, i8 sign, I
nudged_epoch_ns = move(start_epoch_ns);
}
// 26. Set resultDuration to ! CombineDateAndTimeDuration(resultDuration, 0).
auto result_date_and_time_duration = MUST(combine_date_and_time_duration(vm, result_duration, TimeDuration { 0 }));
// 26. Set resultDuration to CombineDateAndTimeDuration(resultDuration, 0).
auto result_date_and_time_duration = combine_date_and_time_duration(result_duration, TimeDuration { 0 });
// 27. Let nudgeResult be Duration Nudge Result Record { [[Duration]]: resultDuration, [[NudgedEpochNs]]: nudgedEpochNs, [[DidExpandCalendarUnit]]: didExpandCalendarUnit }.
DurationNudgeResult nudge_result { .duration = move(result_date_and_time_duration), .nudged_epoch_ns = move(nudged_epoch_ns), .did_expand_calendar_unit = did_expand_calendar_unit };
@ -1148,8 +1148,8 @@ ThrowCompletionOr<DurationNudgeResult> nudge_to_zoned_time(VM& vm, i8 sign, Inte
// 14. Let dateDuration be ! AdjustDateDurationRecord(duration.[[Date]], duration.[[Date]].[[Days]] + dayDelta).
auto date_duration = MUST(adjust_date_duration_record(vm, duration.date, duration.date.days + day_delta));
// 15. Let resultDuration be ! CombineDateAndTimeDuration(dateDuration, roundedTimeDuration).
auto result_duration = MUST(combine_date_and_time_duration(vm, date_duration, move(rounded_time_duration)));
// 15. Let resultDuration be CombineDateAndTimeDuration(dateDuration, roundedTimeDuration).
auto result_duration = combine_date_and_time_duration(date_duration, move(rounded_time_duration));
// 16. Return Duration Nudge Result Record { [[Duration]]: resultDuration, [[NudgedEpochNs]]: nudgedEpochNs, [[DidExpandCalendarUnit]]: didRoundBeyondDay }.
return DurationNudgeResult { .duration = move(result_duration), .nudged_epoch_ns = move(nudged_epoch_ns), .did_expand_calendar_unit = did_round_beyond_day };
@ -1211,8 +1211,8 @@ ThrowCompletionOr<DurationNudgeResult> nudge_to_day_or_time(VM& vm, InternalDura
// 14. Let dateDuration be ! AdjustDateDurationRecord(duration.[[Date]], days).
auto date_duration = MUST(adjust_date_duration_record(vm, duration.date, days));
// 15. Let resultDuration be ! CombineDateAndTimeDuration(dateDuration, remainder).
auto result_duration = MUST(combine_date_and_time_duration(vm, date_duration, move(remainder)));
// 15. Let resultDuration be CombineDateAndTimeDuration(dateDuration, remainder).
auto result_duration = combine_date_and_time_duration(date_duration, move(remainder));
// 16. Return Duration Nudge Result Record { [[Duration]]: resultDuration, [[NudgedEpochNs]]: nudgedEpochNs, [[DidExpandCalendarUnit]]: didExpandDays }.
return DurationNudgeResult { .duration = move(result_duration), .nudged_epoch_ns = move(nudged_epoch_ns), .did_expand_calendar_unit = did_expand_days };
@ -1301,8 +1301,8 @@ ThrowCompletionOr<InternalDuration> bubble_relative_duration(VM& vm, i8 sign, In
// x. If beyondEndSign ≠ -sign, then
if (beyond_end_sign != -sign) {
// 1. Set duration to ! CombineDateAndTimeDuration(endDuration, 0).
duration = MUST(combine_date_and_time_duration(vm, end_duration, TimeDuration { 0 }));
// 1. Set duration to CombineDateAndTimeDuration(endDuration, 0).
duration = combine_date_and_time_duration(end_duration, TimeDuration { 0 });
}
// xi. Else,
else {
@ -1519,8 +1519,8 @@ ThrowCompletionOr<GC::Ref<Duration>> add_durations(VM& vm, ArithmeticOperation o
// 9. Let timeResult be ? AddTimeDuration(d1.[[Time]], d2.[[Time]]).
auto time_result = TRY(add_time_duration(vm, duration1.time, duration2.time));
// 10. Let result be ! CombineDateAndTimeDuration(ZeroDateDuration(), timeResult).
auto result = MUST(combine_date_and_time_duration(vm, zero_date_duration(vm), move(time_result)));
// 10. Let result be CombineDateAndTimeDuration(ZeroDateDuration(), timeResult).
auto result = combine_date_and_time_duration(zero_date_duration(vm), move(time_result));
// 11. Return ? TemporalDurationFromInternal(result, largestUnit).
return TRY(temporal_duration_from_internal(vm, result, largest_unit));

View file

@ -116,7 +116,7 @@ DateDuration to_date_duration_record_without_time(VM&, Duration const&);
ThrowCompletionOr<GC::Ref<Duration>> temporal_duration_from_internal(VM&, InternalDuration const&, Unit largest_unit);
ThrowCompletionOr<DateDuration> create_date_duration_record(VM&, double years, double months, double weeks, double days);
ThrowCompletionOr<DateDuration> adjust_date_duration_record(VM&, DateDuration const&, double days, Optional<double> weeks = {}, Optional<double> months = {});
ThrowCompletionOr<InternalDuration> combine_date_and_time_duration(VM&, DateDuration, TimeDuration);
InternalDuration combine_date_and_time_duration(DateDuration, TimeDuration);
ThrowCompletionOr<GC::Ref<Duration>> to_temporal_duration(VM&, Value);
i8 duration_sign(Duration const&);
i8 date_duration_sign(DateDuration const&);

View file

@ -424,16 +424,16 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::round)
// c. Let dateDuration be ? CreateDateDurationRecord(0, 0, 0, days).
auto date_duration = TRY(create_date_duration_record(vm, 0, 0, 0, days));
// d. Set internalDuration to ! CombineDateAndTimeDuration(dateDuration, 0).
internal_duration = MUST(combine_date_and_time_duration(vm, date_duration, TimeDuration { 0 }));
// d. Set internalDuration to CombineDateAndTimeDuration(dateDuration, 0).
internal_duration = combine_date_and_time_duration(date_duration, TimeDuration { 0 });
}
// 32. Else,
else {
// a. Let timeDuration be ? RoundTimeDuration(internalDuration.[[Time]], roundingIncrement, smallestUnit, roundingMode).
auto time_duration = TRY(round_time_duration(vm, internal_duration.time, Crypto::UnsignedBigInteger { rounding_increment }, smallest_unit_value, rounding_mode));
// b. Set internalDuration to ! CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration).
internal_duration = MUST(combine_date_and_time_duration(vm, zero_date_duration(vm), move(time_duration)));
// b. Set internalDuration to CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration).
internal_duration = combine_date_and_time_duration(zero_date_duration(vm), move(time_duration));
}
// 33. Return ? TemporalDurationFromInternal(internalDuration, largestUnit).
@ -600,8 +600,8 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::to_string)
// 13. Let timeDuration be ? RoundTimeDuration(internalDuration.[[Time]], precision.[[Increment]], precision.[[Unit]], roundingMode).
auto time_duration = TRY(round_time_duration(vm, internal_duration.time, precision.increment, precision.unit, rounding_mode));
// 14. Set internalDuration to ! CombineDateAndTimeDuration(internalDuration.[[Date]], timeDuration).
internal_duration = MUST(combine_date_and_time_duration(vm, internal_duration.date, move(time_duration)));
// 14. Set internalDuration to CombineDateAndTimeDuration(internalDuration.[[Date]], timeDuration).
internal_duration = combine_date_and_time_duration(internal_duration.date, move(time_duration));
// 15. Let roundedLargestUnit be LargerOfTwoTemporalUnits(largestUnit, SECOND).
auto rounded_largest_unit = larger_of_two_temporal_units(largest_unit, Unit::Second);

View file

@ -189,8 +189,8 @@ InternalDuration difference_instant(VM& vm, Crypto::SignedBigInteger const& nano
// 2. Set timeDuration to ! RoundTimeDuration(timeDuration, roundingIncrement, smallestUnit, roundingMode).
time_duration = MUST(round_time_duration(vm, time_duration, Crypto::UnsignedBigInteger { rounding_increment }, smallest_unit, rounding_mode));
// 3. Return ! CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration).
return MUST(combine_date_and_time_duration(vm, zero_date_duration(vm), move(time_duration)));
// 3. Return CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration).
return combine_date_and_time_duration(zero_date_duration(vm), move(time_duration));
}
// 8.5.7 RoundTemporalInstant ( ns, increment, unit, roundingMode ), https://tc39.es/proposal-temporal/#sec-temporal-roundtemporalinstant

View file

@ -365,8 +365,8 @@ ThrowCompletionOr<GC::Ref<Duration>> difference_temporal_plain_date(VM& vm, Dura
// 6. Let dateDifference be CalendarDateUntil(temporalDate.[[Calendar]], temporalDate.[[ISODate]], other.[[ISODate]], settings.[[LargestUnit]]).
auto date_difference = calendar_date_until(vm, temporal_date.calendar(), temporal_date.iso_date(), other->iso_date(), settings.largest_unit);
// 7. Let duration be ! CombineDateAndTimeDuration(dateDifference, 0).
auto duration = MUST(combine_date_and_time_duration(vm, date_difference, TimeDuration { 0 }));
// 7. Let duration be CombineDateAndTimeDuration(dateDifference, 0).
auto duration = combine_date_and_time_duration(date_difference, TimeDuration { 0 });
// 8. If settings.[[SmallestUnit]] is not DAY or settings.[[RoundingIncrement]] ≠ 1, then
if (settings.smallest_unit != Unit::Day || settings.rounding_increment != 1) {

View file

@ -330,8 +330,8 @@ InternalDuration difference_iso_date_time(VM& vm, ISODateTime const& iso_date_ti
date_difference.days = 0;
}
// 11. Return ! CombineDateAndTimeDuration(dateDifference, timeDuration).
return MUST(combine_date_and_time_duration(vm, date_difference, move(time_duration)));
// 11. Return CombineDateAndTimeDuration(dateDifference, timeDuration).
return combine_date_and_time_duration(date_difference, move(time_duration));
}
// 5.5.13 DifferencePlainDateTimeWithRounding ( isoDateTime1, isoDateTime2, calendar, largestUnit, roundingIncrement, smallestUnit, roundingMode ), https://tc39.es/proposal-temporal/#sec-temporal-differenceplaindatetimewithrounding
@ -339,8 +339,8 @@ ThrowCompletionOr<InternalDuration> difference_plain_date_time_with_rounding(VM&
{
// 1. If CompareISODateTime(isoDateTime1, isoDateTime2) = 0, then
if (compare_iso_date_time(iso_date_time1, iso_date_time2) == 0) {
// a. Return ! CombineDateAndTimeDuration(ZeroDateDuration(), 0).
return MUST(combine_date_and_time_duration(vm, zero_date_duration(vm), TimeDuration { 0 }));
// a. Return CombineDateAndTimeDuration(ZeroDateDuration(), 0).
return combine_date_and_time_duration(zero_date_duration(vm), TimeDuration { 0 });
}
// 2. Let diff be DifferenceISODateTime(isoDateTime1, isoDateTime2, calendar, largestUnit).

View file

@ -647,8 +647,8 @@ ThrowCompletionOr<GC::Ref<Duration>> difference_temporal_plain_time(VM& vm, Dura
// 5. Set timeDuration to ! RoundTimeDuration(timeDuration, settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]).
time_duration = MUST(round_time_duration(vm, time_duration, Crypto::UnsignedBigInteger { settings.rounding_increment }, settings.smallest_unit, settings.rounding_mode));
// 6. Let duration be ! CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration).
auto duration = MUST(combine_date_and_time_duration(vm, zero_date_duration(vm), move(time_duration)));
// 6. Let duration be CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration).
auto duration = combine_date_and_time_duration(zero_date_duration(vm), move(time_duration));
// 7. Let result be ! TemporalDurationFromInternal(duration, settings.[[LargestUnit]]).
auto result = MUST(temporal_duration_from_internal(vm, duration, settings.largest_unit));

View file

@ -241,8 +241,8 @@ ThrowCompletionOr<GC::Ref<Duration>> difference_temporal_plain_year_month(VM& vm
// 14. Let yearsMonthsDifference be ! AdjustDateDurationRecord(dateDifference, 0, 0).
auto years_months_difference = MUST(adjust_date_duration_record(vm, date_difference, 0, 0));
// 15. Let duration be ! CombineDateAndTimeDuration(yearsMonthsDifference, 0).
auto duration = MUST(combine_date_and_time_duration(vm, years_months_difference, TimeDuration { 0 }));
// 15. Let duration be CombineDateAndTimeDuration(yearsMonthsDifference, 0).
auto duration = combine_date_and_time_duration(years_months_difference, TimeDuration { 0 });
// 16. If settings.[[SmallestUnit]] is not MONTH or settings.[[RoundingIncrement]] ≠ 1, then
if (settings.smallest_unit != Unit::Month || settings.rounding_increment != 1) {

View file

@ -408,9 +408,9 @@ ThrowCompletionOr<Crypto::SignedBigInteger> add_zoned_date_time(VM& vm, Crypto::
// 6.5.6 DifferenceZonedDateTime ( ns1, ns2, timeZone, calendar, largestUnit ), https://tc39.es/proposal-temporal/#sec-temporal-differencezoneddatetime
ThrowCompletionOr<InternalDuration> difference_zoned_date_time(VM& vm, Crypto::SignedBigInteger const& nanoseconds1, Crypto::SignedBigInteger const& nanoseconds2, StringView time_zone, StringView calendar, Unit largest_unit)
{
// 1. If ns1 = ns2, return ! CombineDateAndTimeDuration(ZeroDateDuration(), 0).
// 1. If ns1 = ns2, return CombineDateAndTimeDuration(ZeroDateDuration(), 0).
if (nanoseconds1 == nanoseconds2)
return MUST(combine_date_and_time_duration(vm, zero_date_duration(vm), TimeDuration { 0 }));
return combine_date_and_time_duration(zero_date_duration(vm), TimeDuration { 0 });
// 2. Let startDateTime be GetISODateTimeFor(timeZone, ns1).
auto start_date_time = get_iso_date_time_for(time_zone, nanoseconds1);
@ -475,8 +475,8 @@ ThrowCompletionOr<InternalDuration> difference_zoned_date_time(VM& vm, Crypto::S
// 13. Let dateDifference be CalendarDateUntil(calendar, startDateTime.[[ISODate]], intermediateDateTime.[[ISODate]], dateLargestUnit).
auto date_difference = calendar_date_until(vm, calendar, start_date_time.iso_date, intermediate_date_time.iso_date, date_largest_unit);
// 14. Return ! CombineDateAndTimeDuration(dateDifference, timeDuration).
return MUST(combine_date_and_time_duration(vm, date_difference, move(time_duration)));
// 14. Return CombineDateAndTimeDuration(dateDifference, timeDuration).
return combine_date_and_time_duration(date_difference, move(time_duration));
}
// 6.5.7 DifferenceZonedDateTimeWithRounding ( ns1, ns2, timeZone, calendar, largestUnit, roundingIncrement, smallestUnit, roundingMode ), https://tc39.es/proposal-temporal/#sec-temporal-differencezoneddatetimewithrounding