瀏覽代碼

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.
Linus Groh 4 年之前
父節點
當前提交
9fca86109b
共有 1 個文件被更改,包括 1 次插入1 次删除
  1. 1 1
      Libraries/LibJS/Runtime/Value.cpp

+ 1 - 1
Libraries/LibJS/Runtime/Value.cpp

@@ -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();