mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:07:35 +00:00
LibJS: Basic NaN support
This patch adds js_nan() for constructing a NaN value. You can check if a Value is NaN with Value::is_nan().
This commit is contained in:
parent
23c5323a70
commit
9a78b4af2c
3 changed files with 23 additions and 7 deletions
|
@ -49,9 +49,13 @@ String Value::to_string() const
|
|||
if (is_undefined())
|
||||
return "undefined";
|
||||
|
||||
if (is_number())
|
||||
if (is_number()) {
|
||||
if (is_nan())
|
||||
return "NaN";
|
||||
|
||||
// FIXME: This needs improvement.
|
||||
return String::number((i32)as_double());
|
||||
}
|
||||
|
||||
if (is_object())
|
||||
return as_object()->to_primitive(Object::PreferredType::String).to_string();
|
||||
|
@ -108,14 +112,10 @@ Value Value::to_number() const
|
|||
if (ok)
|
||||
return Value(parsed_int);
|
||||
|
||||
//FIXME: Implement 'NaN'
|
||||
ASSERT_NOT_REACHED();
|
||||
|
||||
break;
|
||||
return js_nan();
|
||||
}
|
||||
case Type::Undefined:
|
||||
//FIXME: Implement 'NaN'
|
||||
ASSERT_NOT_REACHED();
|
||||
return js_nan();
|
||||
case Type::Object:
|
||||
return m_value.as_object->to_primitive(Object::PreferredType::Number).to_number();
|
||||
}
|
||||
|
|
|
@ -53,6 +53,8 @@ public:
|
|||
bool is_cell() const { return is_string() || is_object(); }
|
||||
bool is_array() const;
|
||||
|
||||
bool is_nan() const { return is_number() && __builtin_isnan( as_double()); }
|
||||
|
||||
Value()
|
||||
: m_type(Type::Undefined)
|
||||
{
|
||||
|
@ -166,6 +168,11 @@ inline Value js_null()
|
|||
return Value(Value::Type::Null);
|
||||
}
|
||||
|
||||
inline Value js_nan()
|
||||
{
|
||||
return Value(__builtin_nan(""));
|
||||
}
|
||||
|
||||
Value greater_than(Value lhs, Value rhs);
|
||||
Value greater_than_equals(Value lhs, Value rhs);
|
||||
Value less_than(Value lhs, Value rhs);
|
||||
|
|
9
Libraries/LibJS/Tests/NaN-basic.js
Normal file
9
Libraries/LibJS/Tests/NaN-basic.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
function assert(x) { if (!x) throw 1; }
|
||||
|
||||
try {
|
||||
var nan = undefined + 1;
|
||||
assert(nan + "" == "NaN");
|
||||
console.log("PASS");
|
||||
} catch (e) {
|
||||
console.log("FAIL: " + e);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue