From 7bd6b58b291d016d4d79ea7b589b1828483a3c6d Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 26 Apr 2020 18:31:56 +0100 Subject: [PATCH] LibJS: Implement Number.isNaN() Like the global isNaN() without the number coercion. --- Libraries/LibJS/Runtime/GlobalObject.cpp | 3 +- Libraries/LibJS/Runtime/NumberConstructor.cpp | 6 ++++ Libraries/LibJS/Runtime/NumberConstructor.h | 1 + Libraries/LibJS/Tests/Number.isNaN.js | 30 +++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 Libraries/LibJS/Tests/Number.isNaN.js diff --git a/Libraries/LibJS/Runtime/GlobalObject.cpp b/Libraries/LibJS/Runtime/GlobalObject.cpp index 0612da4669..6e289b7f56 100644 --- a/Libraries/LibJS/Runtime/GlobalObject.cpp +++ b/Libraries/LibJS/Runtime/GlobalObject.cpp @@ -138,8 +138,7 @@ Value GlobalObject::gc(Interpreter& interpreter) Value GlobalObject::is_nan(Interpreter& interpreter) { - auto value = interpreter.argument(0).to_number(); - return Value(value.is_nan()); + return Value(interpreter.argument(0).to_number().is_nan()); } Value GlobalObject::is_finite(Interpreter& interpreter) diff --git a/Libraries/LibJS/Runtime/NumberConstructor.cpp b/Libraries/LibJS/Runtime/NumberConstructor.cpp index d1e2d8b245..1c1f4cebc8 100644 --- a/Libraries/LibJS/Runtime/NumberConstructor.cpp +++ b/Libraries/LibJS/Runtime/NumberConstructor.cpp @@ -41,6 +41,7 @@ NumberConstructor::NumberConstructor() : NativeFunction("Number", *interpreter().global_object().function_prototype()) { put_native_function("isFinite", is_finite, 1); + put_native_function("isNaN", is_nan, 1); put_native_function("isSafeInteger", is_safe_integer, 1); put("prototype", interpreter().global_object().number_prototype()); @@ -79,6 +80,11 @@ Value NumberConstructor::is_finite(Interpreter& interpreter) return Value(interpreter.argument(0).is_finite_number()); } +Value NumberConstructor::is_nan(Interpreter& interpreter) +{ + return Value(interpreter.argument(0).is_nan()); +} + Value NumberConstructor::is_safe_integer(Interpreter& interpreter) { if (!interpreter.argument(0).is_number()) diff --git a/Libraries/LibJS/Runtime/NumberConstructor.h b/Libraries/LibJS/Runtime/NumberConstructor.h index 23557009b0..ba22130530 100644 --- a/Libraries/LibJS/Runtime/NumberConstructor.h +++ b/Libraries/LibJS/Runtime/NumberConstructor.h @@ -43,6 +43,7 @@ private: virtual const char* class_name() const override { return "NumberConstructor"; } static Value is_finite(Interpreter&); + static Value is_nan(Interpreter&); static Value is_safe_integer(Interpreter&); }; diff --git a/Libraries/LibJS/Tests/Number.isNaN.js b/Libraries/LibJS/Tests/Number.isNaN.js new file mode 100644 index 0000000000..0de64012b4 --- /dev/null +++ b/Libraries/LibJS/Tests/Number.isNaN.js @@ -0,0 +1,30 @@ +load("test-common.js"); + +try { + assert(Number.isNaN.length === 1); + + assert(Number.isNaN(0) === false); + assert(Number.isNaN(42) === false); + assert(Number.isNaN("") === false); + assert(Number.isNaN("0") === false); + assert(Number.isNaN("42") === false); + assert(Number.isNaN(true) === false); + assert(Number.isNaN(false) === false); + assert(Number.isNaN(null) === false); + assert(Number.isNaN([]) === false); + assert(Number.isNaN(Infinity) === false); + assert(Number.isNaN(-Infinity) === false); + assert(Number.isNaN() === false); + assert(Number.isNaN(undefined) === false); + assert(Number.isNaN("foo") === false); + assert(Number.isNaN({}) === false); + assert(Number.isNaN([1, 2, 3]) === false); + + assert(Number.isNaN(NaN) === true); + assert(Number.isNaN(Number.NaN) === true); + assert(Number.isNaN(0 / 0) === true); + + console.log("PASS"); +} catch (e) { + console.log("FAIL: " + e.message); +}