Quellcode durchsuchen

LibJS: Handle Infinity in Value::to_number()

Linus Groh vor 5 Jahren
Ursprung
Commit
f226746394

+ 5 - 0
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);

+ 6 - 0
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({})));

+ 6 - 0
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));