Skip to content

Commit

Permalink
Editorial: Return zero early in BalancePossiblyInfinite...Relative
Browse files Browse the repository at this point in the history
This avoids calling NanosecondsToDays with the precalculated datetime
parameter present but undefined, which is disallowed according to that
operation's type assertions.

Credits to Anba for catching this.

Closes: #2694
  • Loading branch information
ptomato committed Oct 11, 2023
1 parent 97698d3 commit 3b507f0
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 2 deletions.
5 changes: 4 additions & 1 deletion polyfill/lib/ecmascript.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3552,9 +3552,12 @@ export function BalancePossiblyInfiniteTimeDurationRelative(

const endNs = AddInstant(intermediateNs, hours, minutes, seconds, milliseconds, microseconds, nanoseconds);
nanoseconds = endNs.subtract(startNs);
if (nanoseconds.isZero()) {
return { days: 0, hours: 0, minutes: 0, seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 0 };
}

if (largestUnit === 'year' || largestUnit === 'month' || largestUnit === 'week' || largestUnit === 'day') {
if (!nanoseconds.isZero()) precalculatedPlainDateTime ??= GetPlainDateTimeFor(timeZone, startInstant, 'iso8601');
precalculatedPlainDateTime ??= GetPlainDateTimeFor(timeZone, startInstant, 'iso8601');
({ days, nanoseconds } = NanosecondsToDays(nanoseconds, zonedRelativeTo, precalculatedPlainDateTime));
largestUnit = 'hour';
} else {
Expand Down
3 changes: 2 additions & 1 deletion spec/duration.html
Original file line number Diff line number Diff line change
Expand Up @@ -1351,8 +1351,9 @@ <h1>
1. Set _intermediateNs_ to _intermediateResult_.[[EpochNanoseconds]].
1. Let _endNs_ be AddInstant(_intermediateNs_, _hours_, _minutes_, _seconds_, _milliseconds_, _microseconds_, _nanoseconds_).
1. Set _nanoseconds_ to ℝ(_endNs_ - _zonedRelativeTo_.[[Nanoseconds]]).
1. If _nanoseconds_ = 0, return ! CreateTimeDurationRecord(0, 0, 0, 0, 0, 0, 0).
1. If _largestUnit_ is one of *"year"*, *"month"*, *"week"*, or *"day"*, then
1. If _nanoseconds_ &ne; 0 and _precalculatedPlainDateTime_ is *undefined*, set _precalculatedPlainDateTime_ to ? GetPlainDateTimeFor(_zonedRelativeTo_.[[TimeZone]], _startInstant_, *"iso8601"*).
1. If _precalculatedPlainDateTime_ is *undefined*, set _precalculatedPlainDateTime_ to ? GetPlainDateTimeFor(_zonedRelativeTo_.[[TimeZone]], _startInstant_, *"iso8601"*).
1. Let _result_ be ? NanosecondsToDays(_nanoseconds_, _zonedRelativeTo_, _precalculatedPlainDateTime_).
1. Set _days_ to _result_.[[Days]].
1. Set _largestUnit_ to *"hour"*.
Expand Down

0 comments on commit 3b507f0

Please sign in to comment.