diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index 4ca35b3f0f..fbfd214852 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -136,9 +136,14 @@ Value Value::to_number() const case Type::Null: return Value(0); case Type::String: { + // FIXME: Trim whitespace beforehand auto& string = as_string()->string(); if (string.is_empty()) return Value(0); + if (string == "Infinity" || string == "+Infinity") + return js_infinity(); + if (string == "-Infinity") + return Value(-js_infinity().as_double()); bool ok; //FIXME: Parse in a better way auto parsed_int = string.to_int(ok); diff --git a/Libraries/LibJS/Tests/Number.js b/Libraries/LibJS/Tests/Number.js index 9b24b613b9..10a110840f 100644 --- a/Libraries/LibJS/Tests/Number.js +++ b/Libraries/LibJS/Tests/Number.js @@ -10,6 +10,12 @@ try { assert(new Number(null).valueOf() === 0); assert(Number(true) === 1); assert(new Number(true).valueOf() === 1); + assert(Number("Infinity") === Infinity); + assert(new Number("Infinity").valueOf() === Infinity); + assert(Number("+Infinity") === Infinity); + assert(new Number("+Infinity").valueOf() === Infinity); + assert(Number("-Infinity") === -Infinity); + assert(new Number("-Infinity").valueOf() === -Infinity); assert(isNaN(Number(undefined))); assert(isNaN(new Number(undefined).valueOf())); assert(isNaN(Number({}))); diff --git a/Libraries/LibJS/Tests/to-number-basic.js b/Libraries/LibJS/Tests/to-number-basic.js index afde29785f..cf41bb8b3c 100644 --- a/Libraries/LibJS/Tests/to-number-basic.js +++ b/Libraries/LibJS/Tests/to-number-basic.js @@ -22,6 +22,12 @@ try { // FIXME: returns NaN // assert(+"1.23" === 1.23) // assert(-"1.23" === -1.23) + assert(+"Infinity" === Infinity); + assert(+"+Infinity" === Infinity); + assert(+"-Infinity" === -Infinity); + assert(-"Infinity" === -Infinity); + assert(-"+Infinity" === -Infinity); + assert(-"-Infinity" === Infinity); assert(isNaN(+undefined)); assert(isNaN(-undefined));