mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:47:36 +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 <LibJS/Runtime/NumberObject.h>
|
||||||
#include <math.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 {
|
namespace JS {
|
||||||
|
|
||||||
NumberConstructor::NumberConstructor()
|
NumberConstructor::NumberConstructor()
|
||||||
{
|
{
|
||||||
|
put_native_function("isSafeInteger", is_safe_integer, 1);
|
||||||
|
|
||||||
put("prototype", interpreter().number_prototype());
|
put("prototype", interpreter().number_prototype());
|
||||||
put("length", Value(1));
|
put("length", Value(1));
|
||||||
put("EPSILON", Value(pow(2, -52)));
|
put("EPSILON", Value(EPSILON));
|
||||||
put("MAX_SAFE_INTEGER", Value(pow(2, 53) - 1));
|
put("MAX_SAFE_INTEGER", Value(MAX_SAFE_INTEGER));
|
||||||
put("MIN_SAFE_INTEGER", Value(-(pow(2, 53) - 1)));
|
put("MIN_SAFE_INTEGER", Value(MIN_SAFE_INTEGER));
|
||||||
put("NEGATIVE_INFINITY", Value(-js_infinity().as_double()));
|
put("NEGATIVE_INFINITY", Value(-js_infinity().as_double()));
|
||||||
put("POSITIVE_INFINITY", js_infinity());
|
put("POSITIVE_INFINITY", js_infinity());
|
||||||
put("NaN", js_nan());
|
put("NaN", js_nan());
|
||||||
|
@ -65,4 +71,12 @@ Value NumberConstructor::construct(Interpreter& interpreter)
|
||||||
return Value(interpreter.heap().allocate<NumberObject>(number));
|
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:
|
private:
|
||||||
virtual bool has_constructor() const override { return true; }
|
virtual bool has_constructor() const override { return true; }
|
||||||
virtual const char* class_name() const override { return "NumberConstructor"; }
|
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