mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-12 11:09:18 +00:00
LibJS: Make CombineDateAndTimeDuration infallible
This is an editorial change in the Temporal proposal. See:
794960c
This commit is contained in:
parent
e29c6d2a80
commit
0e81092685
Notes:
github-actions[bot]
2024-12-05 21:06:37 +00:00
Author: https://github.com/trflynn89
Commit: 0e81092685
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2790
Reviewed-by: https://github.com/gmta ✅
9 changed files with 41 additions and 41 deletions
|
@ -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));
|
||||
|
|
|
@ -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&);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue