Sfoglia il codice sorgente

LibJS: Correctness fixes for bitwise_or, address FIXME's in test.

Brian Gianforcaro 5 anni fa
parent
commit
41bfff1abe

+ 12 - 0
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());
 }
 

+ 8 - 8
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) {