Skip to content

Commit 5f7b3fc

Browse files
Aditi-140012wrigja
authored andcommitted
Fixed Duration.prototype.total() return value
UPSTREAM_COMMIT=10e0ab3b4d300adba956ed0001289ac515e67951
1 parent 1b39988 commit 5f7b3fc

File tree

3 files changed

+47
-3
lines changed

3 files changed

+47
-3
lines changed

lib/duration.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ export class Duration implements Temporal.Duration {
344344
if (ES.IsTemporalZonedDateTime(relativeTo)) {
345345
intermediate = ES.MoveRelativeZonedDateTime(relativeTo, years, months, weeks, 0);
346346
}
347-
({ days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = ES.BalanceDuration(
347+
let balanceResult = ES.BalancePossiblyInfiniteDuration(
348348
days,
349349
hours,
350350
minutes,
@@ -354,7 +354,13 @@ export class Duration implements Temporal.Duration {
354354
nanoseconds,
355355
unit,
356356
intermediate
357-
));
357+
);
358+
if (balanceResult === 'positive overflow') {
359+
return Infinity;
360+
} else if (balanceResult === 'negative overflow') {
361+
return -Infinity;
362+
}
363+
({ days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = balanceResult);
358364
// Finally, truncate to the correct unit and calculate remainder
359365
const { total } = ES.RoundDuration(
360366
years,

lib/ecmascript.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3422,6 +3422,35 @@ export function BalanceDuration(
34223422
nanosecondsParam: number,
34233423
largestUnit: Temporal.DateTimeUnit,
34243424
relativeTo: ReturnType<typeof ToRelativeTemporalObject> = undefined
3425+
) {
3426+
let result = BalancePossiblyInfiniteDuration(
3427+
daysParam,
3428+
hoursParam,
3429+
minutesParam,
3430+
secondsParam,
3431+
millisecondsParam,
3432+
microsecondsParam,
3433+
nanosecondsParam,
3434+
largestUnit,
3435+
relativeTo
3436+
);
3437+
if (result === 'positive overflow' || result === 'negative overflow') {
3438+
throw new RangeError('Duration out of range');
3439+
} else {
3440+
return result;
3441+
}
3442+
}
3443+
3444+
export function BalancePossiblyInfiniteDuration(
3445+
daysParam: number,
3446+
hoursParam: number,
3447+
minutesParam: number,
3448+
secondsParam: number,
3449+
millisecondsParam: number,
3450+
microsecondsParam: number,
3451+
nanosecondsParam: number,
3452+
largestUnit: Temporal.DateTimeUnit,
3453+
relativeTo: ReturnType<typeof ToRelativeTemporalObject> = undefined
34253454
) {
34263455
let days = daysParam;
34273456
let nanosecondsBigInt: JSBI,
@@ -3513,6 +3542,16 @@ export function BalanceDuration(
35133542
const microseconds = JSBI.toNumber(microsecondsBigInt) * sign;
35143543
const nanoseconds = JSBI.toNumber(nanosecondsBigInt) * sign;
35153544

3545+
for (const prop of [days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds]) {
3546+
if (!NumberIsFinite(prop)) {
3547+
if (sign === 1) {
3548+
return 'positive overflow' as const;
3549+
} else {
3550+
return 'negative overflow' as const;
3551+
}
3552+
}
3553+
}
3554+
35163555
return { days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds };
35173556
}
35183557

test/expected-failures-todo-migrated-code.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-timezone-inst
224224
built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-timezone-wrong-type.js
225225
built-ins/Temporal/Duration/prototype/total/relativeto-string-datetime.js
226226
built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range.js
227-
built-ins/Temporal/Duration/prototype/total/total-value-infinity.js
228227
built-ins/Temporal/Instant/compare/argument-string-calendar-annotation.js
229228
built-ins/Temporal/Instant/compare/argument-string-date-with-utc-offset.js
230229
built-ins/Temporal/Instant/compare/argument-string-time-zone-annotation.js

0 commit comments

Comments
 (0)