From 41bfff1abe995a4a590ea23fa741cf46381b0a94 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sun, 5 Apr 2020 00:11:47 -0700 Subject: [PATCH] LibJS: Correctness fixes for bitwise_or, address FIXME's in test. --- Libraries/LibJS/Runtime/Value.cpp | 12 ++++++++++++ .../Tests/binary-bitwise-operators-basic.js | 16 ++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) 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) {