Browse Source

LibJS: Treat NaN in Value::to_i32() as zero

Let's treat it as zero like the ECMAScript spec does in toInteger().

That way we can use to_i32() and don't have to care about weird input
input values where a number is expected, i.e.

"foo".charAt() === "f"
"foo".charAt("bar") === "f"
"foo".charAt(0) === "f"
Linus Groh 5 years ago
parent
commit
00fe7f82c0

+ 4 - 0
Libraries/LibJS/Runtime/Value.cpp

@@ -274,6 +274,10 @@ i32 Value::to_i32(Interpreter& interpreter) const
     auto number = to_number(interpreter);
     auto number = to_number(interpreter);
     if (interpreter.exception())
     if (interpreter.exception())
         return 0;
         return 0;
+    if (number.is_nan())
+        return 0;
+    // FIXME: What about infinity though - that's UB...
+    // Maybe NumericLimits<i32>::max() for +Infinity and NumericLimits<i32>::min() for -Infinity?
     return number.as_i32();
     return number.as_i32();
 }
 }
 
 

+ 5 - 0
Libraries/LibJS/Tests/String.prototype.charAt.js

@@ -13,6 +13,11 @@ try {
     assert(s.charAt(5) === 'r');
     assert(s.charAt(5) === 'r');
     assert(s.charAt(6) === '');
     assert(s.charAt(6) === '');
 
 
+    assert(s.charAt() === 'f');
+    assert(s.charAt(NaN) === 'f');
+    assert(s.charAt("foo") === 'f');
+    assert(s.charAt(undefined) === 'f');
+
     console.log("PASS");
     console.log("PASS");
 } catch (e) {
 } catch (e) {
     console.log("FAIL: " + e);
     console.log("FAIL: " + e);