Skip to content

Commit 794960c

Browse files
ptomatoMs2ger
authored andcommitted
Editorial: CombineDateAndTimeDuration is infallible
We now have proven that all of the call sites cannot provide a date duration and time duration with mixed signs. So we change the exception to an assertion. h/t Anba Closes: #3023
1 parent 6860ad1 commit 794960c

File tree

8 files changed

+24
-23
lines changed

8 files changed

+24
-23
lines changed

polyfill/lib/ecmascript.mjs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2964,9 +2964,10 @@ export function TemporalDurationFromInternal(internalDuration, largestUnit) {
29642964
export function CombineDateAndTimeDuration(dateDuration, timeDuration) {
29652965
const dateSign = DateDurationSign(dateDuration);
29662966
const timeSign = timeDuration.sign();
2967-
if (dateSign !== 0 && timeSign !== 0 && dateSign !== timeSign) {
2968-
throw new RangeErrorCtor('mixed-sign values not allowed as duration fields');
2969-
}
2967+
assert(
2968+
dateSign === 0 || timeSign === 0 || dateSign === timeSign,
2969+
'should not be able to create mixed sign duration fields here'
2970+
);
29702971
return { date: dateDuration, time: timeDuration };
29712972
}
29722973

spec/duration.html

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -452,10 +452,10 @@ <h1>Temporal.Duration.prototype.round ( _roundTo_ )</h1>
452452
1. Let _fractionalDays_ be TotalTimeDuration(_internalDuration_.[[Time]], ~day~).
453453
1. Let _days_ be RoundNumberToIncrement(_fractionalDays_, _roundingIncrement_, _roundingMode_).
454454
1. Let _dateDuration_ be ? CreateDateDurationRecord(0, 0, 0, _days_).
455-
1. Set _internalDuration_ to ! CombineDateAndTimeDuration(_dateDuration_, 0).
455+
1. Set _internalDuration_ to CombineDateAndTimeDuration(_dateDuration_, 0).
456456
1. Else,
457457
1. Let _timeDuration_ be ? RoundTimeDuration(_internalDuration_.[[Time]], _roundingIncrement_, _smallestUnit_, _roundingMode_).
458-
1. Set _internalDuration_ to ! CombineDateAndTimeDuration(ZeroDateDuration(), _timeDuration_).
458+
1. Set _internalDuration_ to CombineDateAndTimeDuration(ZeroDateDuration(), _timeDuration_).
459459
1. Return ? TemporalDurationFromInternal(_internalDuration_, _largestUnit_).
460460
</emu-alg>
461461
</emu-clause>
@@ -521,7 +521,7 @@ <h1>Temporal.Duration.prototype.toString ( [ _options_ ] )</h1>
521521
1. Let _largestUnit_ be DefaultTemporalLargestUnit(_duration_).
522522
1. Let _internalDuration_ be ToInternalDurationRecord(_duration_).
523523
1. Let _timeDuration_ be ? RoundTimeDuration(_internalDuration_.[[Time]], _precision_.[[Increment]], _precision_.[[Unit]], _roundingMode_).
524-
1. Set _internalDuration_ to ! CombineDateAndTimeDuration(_internalDuration_.[[Date]], _timeDuration_).
524+
1. Set _internalDuration_ to CombineDateAndTimeDuration(_internalDuration_.[[Date]], _timeDuration_).
525525
1. Let _roundedLargestUnit_ be LargerOfTwoTemporalUnits(_largestUnit_, ~second~).
526526
1. Let _roundedDuration_ be ? TemporalDurationFromInternal(_internalDuration_, _roundedLargestUnit_).
527527
1. Return TemporalDurationToString(_roundedDuration_, _precision_.[[Precision]]).
@@ -883,7 +883,7 @@ <h1>
883883
<emu-alg>
884884
1. Let _dateDuration_ be ! CreateDateDurationRecord(_duration_.[[Years]], _duration_.[[Months]], _duration_.[[Weeks]], _duration_.[[Days]]).
885885
1. Let _timeDuration_ be TimeDurationFromComponents(_duration_.[[Hours]], _duration_.[[Minutes]], _duration_.[[Seconds]], _duration_.[[Milliseconds]], _duration_.[[Microseconds]], _duration_.[[Nanoseconds]]).
886-
1. Return ! CombineDateAndTimeDuration(_dateDuration_, _timeDuration_).
886+
1. Return CombineDateAndTimeDuration(_dateDuration_, _timeDuration_).
887887
</emu-alg>
888888
</emu-clause>
889889

@@ -901,7 +901,7 @@ <h1>
901901
1. Let _timeDuration_ be TimeDurationFromComponents(_duration_.[[Hours]], _duration_.[[Minutes]], _duration_.[[Seconds]], _duration_.[[Milliseconds]], _duration_.[[Microseconds]], _duration_.[[Nanoseconds]]).
902902
1. Set _timeDuration_ to ! Add24HourDaysToTimeDuration(_timeDuration_, _duration_.[[Days]]).
903903
1. Let _dateDuration_ be ! CreateDateDurationRecord(_duration_.[[Years]], _duration_.[[Months]], _duration_.[[Weeks]], 0).
904-
1. Return ! CombineDateAndTimeDuration(_dateDuration_, _timeDuration_).
904+
1. Return CombineDateAndTimeDuration(_dateDuration_, _timeDuration_).
905905
</emu-alg>
906906
</emu-clause>
907907

@@ -1047,7 +1047,7 @@ <h1>
10471047
CombineDateAndTimeDuration (
10481048
_dateDuration_: a Date Duration Record,
10491049
_timeDuration_: a time duration,
1050-
): either a normal completion containing an Internal Duration Record or a throw completion
1050+
): an Internal Duration Record
10511051
</h1>
10521052
<dl class="header">
10531053
<dt>description</dt>
@@ -1056,7 +1056,7 @@ <h1>
10561056
<emu-alg>
10571057
1. Let _dateSign_ be DateDurationSign(_dateDuration_).
10581058
1. Let _timeSign_ be TimeDurationSign(_timeDuration_).
1059-
1. If _dateSign_ ≠ 0 and _timeSign_ ≠ 0 and _dateSign_ _timeSign_, throw a *RangeError* exception.
1059+
1. Assert: If _dateSign_ ≠ 0 and _timeSign_ ≠ 0, _dateSign_ = _timeSign_.
10601060
1. Return Internal Duration Record {
10611061
[[Date]]: _dateDuration_,
10621062
[[Time]]: _timeDuration_
@@ -1648,7 +1648,7 @@ <h1>
16481648
1. Let _didExpandCalendarUnit_ be *false*.
16491649
1. Let _resultDuration_ be _startDuration_.
16501650
1. Let _nudgedEpochNs_ be _startEpochNs_.
1651-
1. Set _resultDuration_ to ! CombineDateAndTimeDuration(_resultDuration_, 0).
1651+
1. Set _resultDuration_ to CombineDateAndTimeDuration(_resultDuration_, 0).
16521652
1. Let _nudgeResult_ be Duration Nudge Result Record { [[Duration]]: _resultDuration_, [[NudgedEpochNs]]: _nudgedEpochNs_, [[DidExpandCalendarUnit]]: _didExpandCalendarUnit_ }.
16531653
1. Return the Record { [[NudgeResult]]: _nudgeResult_, [[Total]]: _total_ }.
16541654
</emu-alg>
@@ -1695,7 +1695,7 @@ <h1>
16951695
1. Let _dayDelta_ be 0.
16961696
1. Let _nudgedEpochNs_ be AddTimeDurationToEpochNanoseconds(_roundedTimeDuration_, _startEpochNs_).
16971697
1. Let _dateDuration_ be ! AdjustDateDurationRecord(_duration_.[[Date]], _duration_.[[Date]].[[Days]] + _dayDelta_).
1698-
1. Let _resultDuration_ be ! CombineDateAndTimeDuration(_dateDuration_, _roundedTimeDuration_).
1698+
1. Let _resultDuration_ be CombineDateAndTimeDuration(_dateDuration_, _roundedTimeDuration_).
16991699
1. Return Duration Nudge Result Record { [[Duration]]: _resultDuration_, [[NudgedEpochNs]]: _nudgedEpochNs_, [[DidExpandCalendarUnit]]: _didRoundBeyondDay_ }.
17001700
</emu-alg>
17011701
</emu-clause>
@@ -1734,7 +1734,7 @@ <h1>
17341734
1. Set _days_ to _roundedWholeDays_.
17351735
1. Set _remainder_ to ! AddTimeDuration(_roundedTime_, TimeDurationFromComponents(-_roundedWholeDays_ * HoursPerDay, 0, 0, 0, 0, 0)).
17361736
1. Let _dateDuration_ be ! AdjustDateDurationRecord(_duration_.[[Date]], _days_).
1737-
1. Let _resultDuration_ be ! CombineDateAndTimeDuration(_dateDuration_, _remainder_).
1737+
1. Let _resultDuration_ be CombineDateAndTimeDuration(_dateDuration_, _remainder_).
17381738
1. Return Duration Nudge Result Record { [[Duration]]: _resultDuration_, [[NudgedEpochNs]]: _nudgedEpochNs_, [[DidExpandCalendarUnit]]: _didExpandDays_ }.
17391739
</emu-alg>
17401740
</emu-clause>
@@ -1786,7 +1786,7 @@ <h1>
17861786
1. Let _beyondEnd_ be _nudgedEpochNs_ - _endEpochNs_.
17871787
1. If _beyondEnd_ &lt; 0, let _beyondEndSign_ be -1; else if _beyondEnd_ > 0, let _beyondEndSign_ be 1; else let _beyondEndSign_ be 0.
17881788
1. If _beyondEndSign_ ≠ -_sign_, then
1789-
1. Set _duration_ to ! CombineDateAndTimeDuration(_endDuration_, 0).
1789+
1. Set _duration_ to CombineDateAndTimeDuration(_endDuration_, 0).
17901790
1. Else,
17911791
1. Set _done_ to *true*.
17921792
1. Set _unitIndex_ to _unitIndex_ - 1.
@@ -1926,7 +1926,7 @@ <h1>
19261926
1. Let _d1_ be ToInternalDurationRecordWith24HourDays(_duration_).
19271927
1. Let _d2_ be ToInternalDurationRecordWith24HourDays(_other_).
19281928
1. Let _timeResult_ be ? AddTimeDuration(_d1_.[[Time]], _d2_.[[Time]]).
1929-
1. Let _result_ be ! CombineDateAndTimeDuration(ZeroDateDuration(), _timeResult_).
1929+
1. Let _result_ be CombineDateAndTimeDuration(ZeroDateDuration(), _timeResult_).
19301930
1. Return ? TemporalDurationFromInternal(_result_, _largestUnit_).
19311931
</emu-alg>
19321932
</emu-clause>

spec/instant.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ <h1>
474474
<emu-alg>
475475
1. Let _timeDuration_ be TimeDurationFromEpochNanosecondsDifference(_ns2_, _ns1_).
476476
1. Set _timeDuration_ to ! RoundTimeDuration(_timeDuration_, _roundingIncrement_, _smallestUnit_, _roundingMode_).
477-
1. Return ! CombineDateAndTimeDuration(ZeroDateDuration(), _timeDuration_).
477+
1. Return CombineDateAndTimeDuration(ZeroDateDuration(), _timeDuration_).
478478
</emu-alg>
479479
</emu-clause>
480480

spec/plaindate.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,7 @@ <h1>
898898
1. If CompareISODate(_temporalDate_.[[ISODate]], _other_.[[ISODate]]) = 0, then
899899
1. Return ! CreateTemporalDuration(0, 0, 0, 0, 0, 0, 0, 0, 0, 0).
900900
1. Let _dateDifference_ be CalendarDateUntil(_temporalDate_.[[Calendar]], _temporalDate_.[[ISODate]], _other_.[[ISODate]], _settings_.[[LargestUnit]]).
901-
1. Let _duration_ be ! CombineDateAndTimeDuration(_dateDifference_, 0).
901+
1. Let _duration_ be CombineDateAndTimeDuration(_dateDifference_, 0).
902902
1. If _settings_.[[SmallestUnit]] is not ~day~ or _settings_.[[RoundingIncrement]] ≠ 1, then
903903
1. Let _isoDateTime_ be CombineISODateAndTimeRecord(_temporalDate_.[[ISODate]], MidnightTimeRecord()).
904904
1. Let _isoDateTimeOther_ be CombineISODateAndTimeRecord(_other_.[[ISODate]], MidnightTimeRecord()).

spec/plaindatetime.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,7 @@ <h1>
978978
1. If _largestUnit_ is not _dateLargestUnit_, then
979979
1. Set _timeDuration_ to ! Add24HourDaysToTimeDuration(_timeDuration_, _dateDifference_.[[Days]]).
980980
1. Set _dateDifference_.[[Days]] to 0.
981-
1. Return ! CombineDateAndTimeDuration(_dateDifference_, _timeDuration_).
981+
1. Return CombineDateAndTimeDuration(_dateDifference_, _timeDuration_).
982982
</emu-alg>
983983
</emu-clause>
984984

@@ -1000,7 +1000,7 @@ <h1>
10001000
</dl>
10011001
<emu-alg>
10021002
1. If CompareISODateTime(_isoDateTime1_, _isoDateTime2_) = 0, then
1003-
1. Return ! CombineDateAndTimeDuration(ZeroDateDuration(), 0).
1003+
1. Return CombineDateAndTimeDuration(ZeroDateDuration(), 0).
10041004
1. Let _diff_ be DifferenceISODateTime(_isoDateTime1_, _isoDateTime2_, _calendar_, _largestUnit_).
10051005
1. If _smallestUnit_ is ~nanosecond~ and _roundingIncrement_ = 1, return _diff_.
10061006
1. Let _destEpochNs_ be GetUTCEpochNanoseconds(_isoDateTime2_).

spec/plaintime.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ <h1>
932932
1. Let _settings_ be ? GetDifferenceSettings(_operation_, _resolvedOptions_, ~time~, « », ~nanosecond~, ~hour~).
933933
1. Let _timeDuration_ be DifferenceTime(_temporalTime_.[[Time]], _other_.[[Time]]).
934934
1. Set _timeDuration_ to ! RoundTimeDuration(_timeDuration_, _settings_.[[RoundingIncrement]], _settings_.[[SmallestUnit]], _settings_.[[RoundingMode]]).
935-
1. Let _duration_ be ! CombineDateAndTimeDuration(ZeroDateDuration(), _timeDuration_).
935+
1. Let _duration_ be CombineDateAndTimeDuration(ZeroDateDuration(), _timeDuration_).
936936
1. Let _result_ be ! TemporalDurationFromInternal(_duration_, _settings_.[[LargestUnit]]).
937937
1. If _operation_ is ~since~, set _result_ to CreateNegatedTemporalDuration(_result_).
938938
1. Return _result_.

spec/plainyearmonth.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ <h1>
610610
1. Let _otherDate_ be ? CalendarDateFromFields(_calendar_, _otherFields_, ~constrain~).
611611
1. Let _dateDifference_ be CalendarDateUntil(_calendar_, _thisDate_, _otherDate_, _settings_.[[LargestUnit]]).
612612
1. Let _yearsMonthsDifference_ be ! AdjustDateDurationRecord(_dateDifference_, 0, 0).
613-
1. Let _duration_ be ! CombineDateAndTimeDuration(_yearsMonthsDifference_, 0).
613+
1. Let _duration_ be CombineDateAndTimeDuration(_yearsMonthsDifference_, 0).
614614
1. If _settings_.[[SmallestUnit]] is not ~month~ or _settings_.[[RoundingIncrement]] ≠ 1, then
615615
1. Let _isoDateTime_ be CombineISODateAndTimeRecord(_thisDate_, MidnightTimeRecord()).
616616
1. Let _isoDateTimeOther_ be CombineISODateAndTimeRecord(_otherDate_, MidnightTimeRecord()).

spec/zoneddatetime.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,7 @@ <h1>
11181118
</dd>
11191119
</dl>
11201120
<emu-alg>
1121-
1. If _ns1_ = _ns2_, return ! CombineDateAndTimeDuration(ZeroDateDuration(), 0).
1121+
1. If _ns1_ = _ns2_, return CombineDateAndTimeDuration(ZeroDateDuration(), 0).
11221122
1. Let _startDateTime_ be GetISODateTimeFor(_timeZone_, _ns1_).
11231123
1. Let _endDateTime_ be GetISODateTimeFor(_timeZone_, _ns2_).
11241124
1. If _ns2_ - _ns1_ &lt; 0, let _sign_ be -1; else let _sign_ be 1.
@@ -1139,7 +1139,7 @@ <h1>
11391139
1. Assert: _success_ is *true*.
11401140
1. Let _dateLargestUnit_ be LargerOfTwoTemporalUnits(_largestUnit_, ~day~).
11411141
1. Let _dateDifference_ be CalendarDateUntil(_calendar_, _startDateTime_.[[ISODate]], _intermediateDateTime_.[[ISODate]], _dateLargestUnit_).
1142-
1. Return ! CombineDateAndTimeDuration(_dateDifference_, _timeDuration_).
1142+
1. Return CombineDateAndTimeDuration(_dateDifference_, _timeDuration_).
11431143
</emu-alg>
11441144
</emu-clause>
11451145

0 commit comments

Comments
 (0)