From aa5b144f9024cb155f34464849988250e4df5935 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sun, 6 Jun 2021 02:33:55 +0300 Subject: [PATCH] LibJS: Correct modulo behaviour in to_i32 to match the specification --- Userland/Libraries/LibJS/Runtime/Value.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index c63d9b7fbb..1801f75245 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -566,7 +566,8 @@ i32 Value::to_i32_slow_case(GlobalObject& global_object) const auto int_val = floor(abs); if (signbit(value)) int_val = -int_val; - auto int32bit = fmod(int_val, 4294967296.0); + auto remainder = fmod(int_val, 4294967296.0); + auto int32bit = remainder >= 0.0 ? remainder : remainder + 4294967296.0; // The notation “x modulo y” computes a value k of the same sign as y if (int32bit >= 2147483648.0) int32bit -= 4294967296.0; return static_cast(int32bit);