From fb66d8df7ad8057f37f777076ca9e9d56ff4fe23 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20Bargull?= Date: Mon, 15 Apr 2024 18:27:23 +0000 Subject: [PATCH] Bug 1874684 - Part 15: Prefer int64_t in Add24HourDaysToNormalizedTimeDuration. r=sfink Switch to `int64_t` to avoid some unnecessary `int64_t -> double -> int64_t` conversions. Differential Revision: https://phabricator.services.mozilla.com/D198549 --- js/src/builtin/temporal/Duration.cpp | 30 ++++++++++++++---------------- js/src/builtin/temporal/Duration.h | 2 +- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/js/src/builtin/temporal/Duration.cpp b/js/src/builtin/temporal/Duration.cpp index c49643eb2233..3a08746f80e3 100644 --- a/js/src/builtin/temporal/Duration.cpp +++ b/js/src/builtin/temporal/Duration.cpp @@ -7,6 +7,7 @@ #include "builtin/temporal/Duration.h" #include "mozilla/Assertions.h" +#include "mozilla/Casting.h" #include "mozilla/CheckedInt.h" #include "mozilla/EnumSet.h" #include "mozilla/FloatingPoint.h" @@ -314,18 +315,11 @@ static mozilla::Maybe NormalizeSeconds( * Normalize a days amount into a time duration. Return Nothing if the value is * too large. */ -static mozilla::Maybe NormalizeDays(double days) { - MOZ_ASSERT(IsInteger(days)); - +static mozilla::Maybe NormalizeDays(int64_t days) { do { - int64_t intDays; - if (!mozilla::NumberEqualsInt64(days, &intDays)) { - break; - } - // Compute the overall amount of milliseconds. auto millis = - mozilla::CheckedInt64(intDays) * ToMilliseconds(TemporalUnit::Day); + mozilla::CheckedInt64(days) * ToMilliseconds(TemporalUnit::Day); if (!millis.isValid()) { break; } @@ -485,10 +479,9 @@ static bool SubtractNormalizedTimeDuration(JSContext* cx, * Add24HourDaysToNormalizedTimeDuration ( d, days ) */ bool js::temporal::Add24HourDaysToNormalizedTimeDuration( - JSContext* cx, const NormalizedTimeDuration& d, double days, + JSContext* cx, const NormalizedTimeDuration& d, int64_t days, NormalizedTimeDuration* result) { MOZ_ASSERT(IsValidNormalizedTimeDuration(d)); - MOZ_ASSERT(IsInteger(days)); // Step 1. auto normalizedDays = NormalizeDays(days); @@ -2084,8 +2077,13 @@ static bool AddDuration(JSContext* cx, const Duration& one, const Duration& two, } // Step 6.e. - if (!Add24HourDaysToNormalizedTimeDuration( - cx, normalized, one.days + two.days, &normalized)) { + int64_t days1 = mozilla::AssertedCast(one.days); + int64_t days2 = mozilla::AssertedCast(two.days); + auto totalDays = mozilla::CheckedInt64(days1) + days2; + MOZ_ASSERT(totalDays.isValid(), "adding two duration days can't overflow"); + + if (!Add24HourDaysToNormalizedTimeDuration(cx, normalized, totalDays.value(), + &normalized)) { return false; } @@ -4564,7 +4562,7 @@ static bool Duration_compare(JSContext* cx, unsigned argc, Value* vp) { } // Steps 13-14. - double days1, days2; + int64_t days1, days2; if (calendarUnitsPresent) { // FIXME: spec issue - directly throw an error if plainRelativeTo is undef. @@ -4607,10 +4605,10 @@ static bool Duration_compare(JSContext* cx, unsigned argc, Value* vp) { days2 = unbalanceResult2.days; } else { // Step 14.a. - days1 = one.days; + days1 = mozilla::AssertedCast(one.days); // Step 14.b. - days2 = two.days; + days2 = mozilla::AssertedCast(two.days); } // Step 15. diff --git a/js/src/builtin/temporal/Duration.h b/js/src/builtin/temporal/Duration.h index cecae3d66191..854501a150b6 100644 --- a/js/src/builtin/temporal/Duration.h +++ b/js/src/builtin/temporal/Duration.h @@ -190,7 +190,7 @@ inline int32_t NormalizedTimeDurationSign(const NormalizedTimeDuration& d) { */ bool Add24HourDaysToNormalizedTimeDuration(JSContext* cx, const NormalizedTimeDuration& d, - double days, + int64_t days, NormalizedTimeDuration* result); /** -- 2.11.4.GIT