diff options
author | Linus Groh <mail@linusgroh.de> | 2020-05-23 15:02:14 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-05-23 16:39:17 +0200 |
commit | 00fe7f82c09343a5b38e7bedf98a70c85c6e38f7 (patch) | |
tree | acf672c7a07027a0117650ca38ce290f2ccfe2fd | |
parent | ecb03716d4d9ef6fc2728bd78a8ba64ab0362de4 (diff) | |
download | serenity-00fe7f82c09343a5b38e7bedf98a70c85c6e38f7.zip |
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"
-rw-r--r-- | Libraries/LibJS/Runtime/Value.cpp | 4 | ||||
-rw-r--r-- | Libraries/LibJS/Tests/String.prototype.charAt.js | 5 |
2 files changed, 9 insertions, 0 deletions
diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index 80917df5d5..9f248829a3 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -274,6 +274,10 @@ i32 Value::to_i32(Interpreter& interpreter) const auto number = to_number(interpreter); if (interpreter.exception()) 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(); } diff --git a/Libraries/LibJS/Tests/String.prototype.charAt.js b/Libraries/LibJS/Tests/String.prototype.charAt.js index 9e9fbd96b4..234d388003 100644 --- a/Libraries/LibJS/Tests/String.prototype.charAt.js +++ b/Libraries/LibJS/Tests/String.prototype.charAt.js @@ -13,6 +13,11 @@ try { assert(s.charAt(5) === 'r'); 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"); } catch (e) { console.log("FAIL: " + e); |