LibJS: Fix integer overflow in Number::exponentiate

The exponent might be larger than the range of values representable by
an i32, so we have to use the `fmod` function instead of the modulo
operator.

This fixes 3 test262 tests on AArch64. No changes on x86-64.
This commit is contained in:
Daniel Bertalan 2023-06-26 10:23:19 +02:00 committed by Andreas Kling
parent 56fb5a3f5d
commit 5aef8f280f
Notes: sideshowbarker 2024-07-17 02:28:18 +09:00

View file

@ -1936,7 +1936,7 @@ static Value exp_double(Value base, Value exponent)
// 5. If base is -∞𝔽, then
if (base.is_negative_infinity()) {
auto is_odd_integral_number = exponent.is_integral_number() && (static_cast<i32>(exponent.as_double()) % 2 != 0);
auto is_odd_integral_number = exponent.is_integral_number() && (fmod(exponent.as_double(), 2.0) != 0);
// a. If exponent > +0𝔽, then
if (exponent.as_double() > 0) {
@ -1958,7 +1958,7 @@ static Value exp_double(Value base, Value exponent)
// 7. If base is -0𝔽, then
if (base.is_negative_zero()) {
auto is_odd_integral_number = exponent.is_integral_number() && (static_cast<i32>(exponent.as_double()) % 2 != 0);
auto is_odd_integral_number = exponent.is_integral_number() && (fmod(exponent.as_double(), 2.0) != 0);
// a. If exponent > +0𝔽, then
if (exponent.as_double() > 0) {