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:
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())
|
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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
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