summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2020-05-23 15:02:14 +0100
committerAndreas Kling <kling@serenityos.org>2020-05-23 16:39:17 +0200
commit00fe7f82c09343a5b38e7bedf98a70c85c6e38f7 (patch)
treeacf672c7a07027a0117650ca38ce290f2ccfe2fd
parentecb03716d4d9ef6fc2728bd78a8ba64ab0362de4 (diff)
downloadserenity-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.cpp4
-rw-r--r--Libraries/LibJS/Tests/String.prototype.charAt.js5
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);