diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index ccbaf70d34..901558ecee 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -186,6 +186,18 @@ Value bitwise_and(Value lhs, Value rhs) Value bitwise_or(Value lhs, Value rhs) { + bool lhs_invalid = lhs.is_undefined() || lhs.is_null() || lhs.is_nan() || lhs.is_infinity(); + bool rhs_invalid = rhs.is_undefined() || rhs.is_null() || rhs.is_nan() || rhs.is_infinity(); + + if (lhs_invalid && rhs_invalid) + return Value(0); + + if (lhs_invalid || rhs_invalid) + return lhs_invalid ? rhs.to_number() : lhs.to_number(); + + if (!rhs.is_number() && !lhs.is_number()) + return Value(0); + return Value((i32)lhs.to_number().as_double() | (i32)rhs.to_number().as_double()); } diff --git a/Libraries/LibJS/Tests/binary-bitwise-operators-basic.js b/Libraries/LibJS/Tests/binary-bitwise-operators-basic.js index e941e0c8f3..81a772d9e6 100644 --- a/Libraries/LibJS/Tests/binary-bitwise-operators-basic.js +++ b/Libraries/LibJS/Tests/binary-bitwise-operators-basic.js @@ -48,14 +48,14 @@ try { assert(("42" | 6) === 46); assert((x | y) === 7); assert((x | [[[[12]]]]) === 15); - // FIXME: These should all return 0 - // assert((undefined | y) === 7); - // assert(("a" | "b") === 0); - // assert((null | null) === 0); - // assert((undefined | undefined) === 0); - // assert((NaN | NaN) === 0); - // assert((Infinity | Infinity) === 0); - // assert((-Infinity | Infinity) === 0); + assert((undefined | y) === 7); + assert(("a" | "b") === 0); + assert((null | null) === 0); + assert((undefined | undefined) === 0); + assert((NaN | NaN) === 0); + assert((NaN | 6) === 6); + assert((Infinity | Infinity) === 0); + assert((-Infinity | Infinity) === 0); console.log("PASS"); } catch (e) {