diff --git a/Libraries/LibJS/Runtime/GlobalObject.cpp b/Libraries/LibJS/Runtime/GlobalObject.cpp index 2035791fb9..39db8c82b4 100644 --- a/Libraries/LibJS/Runtime/GlobalObject.cpp +++ b/Libraries/LibJS/Runtime/GlobalObject.cpp @@ -18,7 +18,10 @@ GlobalObject::GlobalObject() put_native_function("gc", gc); put_native_function("isNaN", is_nan); + // FIXME: These are read-only in ES5 put("NaN", js_nan()); + put("Infinity", js_infinity()); + put("console", heap().allocate()); put("Date", heap().allocate()); put("Error", heap().allocate()); diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index 6746aa621c..d93c463e5b 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -57,6 +57,9 @@ String Value::to_string() const if (is_nan()) return "NaN"; + if (is_infinity()) + return as_double() < 0 ? "-Infinity" : "Infinity"; + // FIXME: This needs improvement. if ((double)to_i32() == as_double()) return String::number(to_i32()); diff --git a/Libraries/LibJS/Runtime/Value.h b/Libraries/LibJS/Runtime/Value.h index a341490976..d83f2cf0bd 100644 --- a/Libraries/LibJS/Runtime/Value.h +++ b/Libraries/LibJS/Runtime/Value.h @@ -54,6 +54,7 @@ public: bool is_array() const; bool is_nan() const { return is_number() && __builtin_isnan(as_double()); } + bool is_infinity() const { return is_number() && __builtin_isinf(as_double()); } Value() : m_type(Type::Undefined) @@ -173,6 +174,11 @@ inline Value js_nan() return Value(__builtin_nan("")); } +inline Value js_infinity() +{ + return Value(__builtin_huge_val()); +} + Value greater_than(Value lhs, Value rhs); Value greater_than_equals(Value lhs, Value rhs); Value less_than(Value lhs, Value rhs); diff --git a/Libraries/LibJS/Tests/Infinity-basic.js b/Libraries/LibJS/Tests/Infinity-basic.js new file mode 100644 index 0000000000..c86ff0114d --- /dev/null +++ b/Libraries/LibJS/Tests/Infinity-basic.js @@ -0,0 +1,27 @@ +function assert(x) { if (!x) throw 1; } + +try { + assert(Infinity + "" === "Infinity"); + assert(-Infinity + "" === "-Infinity"); + assert(Infinity === Infinity); + assert(Infinity - 1 === Infinity); + assert(Infinity + 1 === Infinity); + assert(-Infinity === -Infinity); + assert(-Infinity - 1 === -Infinity); + assert(-Infinity + 1 === -Infinity); + assert(1 / Infinity === 0); + assert(1 / -Infinity === 0); + assert(1 / 0 === Infinity); + assert(-1 / 0 === -Infinity); + assert(-100 < Infinity); + assert(0 < Infinity); + assert(100 < Infinity); + assert(-Infinity < Infinity); + assert(-100 > -Infinity); + assert(0 > -Infinity); + assert(100 > -Infinity); + assert(Infinity > -Infinity); + console.log("PASS"); +} catch (e) { + console.log("FAIL: " + e); +} diff --git a/Libraries/LibJS/Tests/NaN-basic.js b/Libraries/LibJS/Tests/NaN-basic.js index a129564b42..b0f2956c72 100644 --- a/Libraries/LibJS/Tests/NaN-basic.js +++ b/Libraries/LibJS/Tests/NaN-basic.js @@ -11,6 +11,7 @@ try { assert(isNaN(0) === false); assert(isNaN(undefined) === true); assert(isNaN(null) === false); + assert(isNaN(Infinity) === false); console.log("PASS"); } catch (e) { console.log("FAIL: " + e);