1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 18:27: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:
Andreas Kling 2020-03-27 12:26:37 +01:00
parent 23c5323a70
commit 9a78b4af2c
3 changed files with 23 additions and 7 deletions

View file

@ -49,9 +49,13 @@ String Value::to_string() const
if (is_undefined()) if (is_undefined())
return "undefined"; return "undefined";
if (is_number()) if (is_number()) {
if (is_nan())
return "NaN";
// FIXME: This needs improvement. // FIXME: This needs improvement.
return String::number((i32)as_double()); return String::number((i32)as_double());
}
if (is_object()) if (is_object())
return as_object()->to_primitive(Object::PreferredType::String).to_string(); return as_object()->to_primitive(Object::PreferredType::String).to_string();
@ -108,14 +112,10 @@ Value Value::to_number() const
if (ok) if (ok)
return Value(parsed_int); return Value(parsed_int);
//FIXME: Implement 'NaN' return js_nan();
ASSERT_NOT_REACHED();
break;
} }
case Type::Undefined: case Type::Undefined:
//FIXME: Implement 'NaN' return js_nan();
ASSERT_NOT_REACHED();
case Type::Object: case Type::Object:
return m_value.as_object->to_primitive(Object::PreferredType::Number).to_number(); return m_value.as_object->to_primitive(Object::PreferredType::Number).to_number();
} }

View file

@ -53,6 +53,8 @@ public:
bool is_cell() const { return is_string() || is_object(); } bool is_cell() const { return is_string() || is_object(); }
bool is_array() const; bool is_array() const;
bool is_nan() const { return is_number() && __builtin_isnan( as_double()); }
Value() Value()
: m_type(Type::Undefined) : m_type(Type::Undefined)
{ {
@ -166,6 +168,11 @@ inline Value js_null()
return Value(Value::Type::Null); return Value(Value::Type::Null);
} }
inline Value js_nan()
{
return Value(__builtin_nan(""));
}
Value greater_than(Value lhs, Value rhs); Value greater_than(Value lhs, Value rhs);
Value greater_than_equals(Value lhs, Value rhs); Value greater_than_equals(Value lhs, Value rhs);
Value less_than(Value lhs, Value rhs); Value less_than(Value lhs, Value rhs);

View 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);
}