mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:47:45 +00:00
LibJS: Add Number.isSafeInteger()
This commit is contained in:
parent
b7032b4972
commit
5ecc7e6a1c
3 changed files with 45 additions and 3 deletions
|
@ -30,15 +30,21 @@
|
|||
#include <LibJS/Runtime/NumberObject.h>
|
||||
#include <math.h>
|
||||
|
||||
#define EPSILON pow(2, -52)
|
||||
#define MAX_SAFE_INTEGER pow(2, 53) - 1
|
||||
#define MIN_SAFE_INTEGER -(pow(2, 53) - 1)
|
||||
|
||||
namespace JS {
|
||||
|
||||
NumberConstructor::NumberConstructor()
|
||||
{
|
||||
put_native_function("isSafeInteger", is_safe_integer, 1);
|
||||
|
||||
put("prototype", interpreter().number_prototype());
|
||||
put("length", Value(1));
|
||||
put("EPSILON", Value(pow(2, -52)));
|
||||
put("MAX_SAFE_INTEGER", Value(pow(2, 53) - 1));
|
||||
put("MIN_SAFE_INTEGER", Value(-(pow(2, 53) - 1)));
|
||||
put("EPSILON", Value(EPSILON));
|
||||
put("MAX_SAFE_INTEGER", Value(MAX_SAFE_INTEGER));
|
||||
put("MIN_SAFE_INTEGER", Value(MIN_SAFE_INTEGER));
|
||||
put("NEGATIVE_INFINITY", Value(-js_infinity().as_double()));
|
||||
put("POSITIVE_INFINITY", js_infinity());
|
||||
put("NaN", js_nan());
|
||||
|
@ -65,4 +71,12 @@ Value NumberConstructor::construct(Interpreter& interpreter)
|
|||
return Value(interpreter.heap().allocate<NumberObject>(number));
|
||||
}
|
||||
|
||||
Value NumberConstructor::is_safe_integer(Interpreter& interpreter)
|
||||
{
|
||||
if (!interpreter.argument(0).is_number())
|
||||
return Value(false);
|
||||
auto value = interpreter.argument(0).to_number().as_double();
|
||||
return Value((int64_t)value == value && value >= MIN_SAFE_INTEGER && value <= MAX_SAFE_INTEGER);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -41,6 +41,8 @@ public:
|
|||
private:
|
||||
virtual bool has_constructor() const override { return true; }
|
||||
virtual const char* class_name() const override { return "NumberConstructor"; }
|
||||
|
||||
static Value is_safe_integer(Interpreter&);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
26
Libraries/LibJS/Tests/Number.isSafeInteger.js
Normal file
26
Libraries/LibJS/Tests/Number.isSafeInteger.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
try {
|
||||
assert(Number.isSafeInteger.length === 1);
|
||||
assert(Number.isSafeInteger(0) === true);
|
||||
assert(Number.isSafeInteger(1) === true);
|
||||
assert(Number.isSafeInteger(2.0) === true);
|
||||
assert(Number.isSafeInteger(42) === true);
|
||||
assert(Number.isSafeInteger(Number.MAX_SAFE_INTEGER) === true);
|
||||
assert(Number.isSafeInteger(Number.MIN_SAFE_INTEGER) === true);
|
||||
assert(Number.isSafeInteger() === false);
|
||||
assert(Number.isSafeInteger("1") === false);
|
||||
assert(Number.isSafeInteger(2.1) === false);
|
||||
assert(Number.isSafeInteger(42.42) === false);
|
||||
assert(Number.isSafeInteger("") === false);
|
||||
assert(Number.isSafeInteger([]) === false);
|
||||
assert(Number.isSafeInteger(null) === false);
|
||||
assert(Number.isSafeInteger(undefined) === false);
|
||||
assert(Number.isSafeInteger(NaN) === false);
|
||||
assert(Number.isSafeInteger(Infinity) === false);
|
||||
assert(Number.isSafeInteger(-Infinity) === false);
|
||||
assert(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) === false);
|
||||
assert(Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) === false);
|
||||
|
||||
console.log("PASS");
|
||||
} catch (e) {
|
||||
console.log("FAIL: " + e.message);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue