From 6b2e004c28f1fde9e50d23cd3c9c4fd5e32f61dc Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Tue, 16 Nov 2021 19:40:03 +0000 Subject: [PATCH] LibJS: Fix incorrect use of "modulo" in {hour,min,sec,ms}_from_time() These all would return incorrect results for negative time values. Also adds a missing floor() in sec_from_time(). --- Userland/Libraries/LibJS/Runtime/Date.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/Date.cpp b/Userland/Libraries/LibJS/Runtime/Date.cpp index b77c81828c..60e31f1359 100644 --- a/Userland/Libraries/LibJS/Runtime/Date.cpp +++ b/Userland/Libraries/LibJS/Runtime/Date.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -282,28 +283,28 @@ u8 month_from_time(double t) u8 hour_from_time(double t) { // 𝔽(floor(ℝ(t / msPerHour)) modulo HoursPerDay) - return static_cast(fmod(floor(t / MS_PER_HOUR), HOURS_PER_DAY)); + return static_cast(modulo(floor(t / MS_PER_HOUR), HOURS_PER_DAY)); } // MinFromTime(t), https://tc39.es/ecma262/#eqn-MinFromTime u8 min_from_time(double t) { // 𝔽(floor(ℝ(t / msPerMinute)) modulo MinutesPerHour) - return static_cast(fmod(floor(t / MS_PER_MINUTE), MINUTES_PER_HOUR)); + return static_cast(modulo(floor(t / MS_PER_MINUTE), MINUTES_PER_HOUR)); } // SecFromTime(t), https://tc39.es/ecma262/#eqn-SecFromTime u8 sec_from_time(double t) { // 𝔽(floor(ℝ(t / msPerSecond)) modulo SecondsPerMinute) - return static_cast(fmod(t / MS_PER_SECOND, SECONDS_PER_MINUTE)); + return static_cast(modulo(floor(t / MS_PER_SECOND), SECONDS_PER_MINUTE)); } // msFromTime(t), https://tc39.es/ecma262/#eqn-msFromTime u16 ms_from_time(double t) { // 𝔽(ℝ(t) modulo msPerSecond) - return static_cast(fmod(t, MS_PER_SECOND)); + return static_cast(modulo(t, MS_PER_SECOND)); } // 21.4.1.11 MakeTime ( hour, min, sec, ms ), https://tc39.es/ecma262/#sec-maketime