LibJS: Make bitwise NOT work correctly with NaN and Infinity

This was missing a "toInt32()" which returns 0 for NaN and Infinity.
From the spec:

    6.1.6.1.2 Number::bitwiseNOT ( x )

    The abstract operation Number::bitwiseNOT takes argument x (a Number).
    It performs the following steps when called:

        Let oldValue be ! ToInt32(x).
        Return the result of applying bitwise complement to oldValue.
        The mathematical value of the result is exactly representable as
        a 32-bit two's complement bit string.

Fixes #4868.
This commit is contained in:
Linus Groh 2021-01-09 16:36:25 +01:00 committed by Andreas Kling
parent c55cb7843a
commit 9fca86109b
Notes: sideshowbarker 2024-07-18 23:59:59 +09:00

View file

@ -669,7 +669,7 @@ Value bitwise_not(GlobalObject& global_object, Value lhs)
if (global_object.vm().exception())
return {};
if (lhs_numeric.is_number())
return Value(~(i32)lhs_numeric.as_double());
return Value(~lhs_numeric.to_i32(global_object));
auto big_integer_bitwise_not = lhs_numeric.as_bigint().big_integer();
big_integer_bitwise_not = big_integer_bitwise_not.plus(Crypto::SignedBigInteger { 1 });
big_integer_bitwise_not.negate();