mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:27:43 +00:00
LibJS: Take advantage of Value::Type::Int32 in a bunch of functions
If a JS::Value has type Int32, we know it's a finite, 32-bit integer. Use this information to avoid converting it to a double if possible.
This commit is contained in:
parent
5b1f697460
commit
e67155638c
2 changed files with 65 additions and 21 deletions
|
@ -67,15 +67,59 @@ public:
|
|||
bool is_constructor() const;
|
||||
ThrowCompletionOr<bool> is_regexp(GlobalObject&) const;
|
||||
|
||||
bool is_nan() const { return is_number() && __builtin_isnan(as_double()); }
|
||||
bool is_infinity() const { return is_number() && __builtin_isinf(as_double()); }
|
||||
bool is_positive_infinity() const { return is_number() && __builtin_isinf_sign(as_double()) > 0; }
|
||||
bool is_negative_infinity() const { return is_number() && __builtin_isinf_sign(as_double()) < 0; }
|
||||
bool is_positive_zero() const { return is_number() && bit_cast<u64>(as_double()) == 0; }
|
||||
bool is_negative_zero() const { return is_number() && bit_cast<u64>(as_double()) == NEGATIVE_ZERO_BITS; }
|
||||
bool is_integral_number() const { return is_finite_number() && trunc(as_double()) == as_double(); }
|
||||
bool is_nan() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return false;
|
||||
return is_number() && __builtin_isnan(as_double());
|
||||
}
|
||||
|
||||
bool is_infinity() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return false;
|
||||
return is_number() && __builtin_isinf(as_double());
|
||||
}
|
||||
|
||||
bool is_positive_infinity() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return false;
|
||||
return is_number() && __builtin_isinf_sign(as_double()) > 0;
|
||||
}
|
||||
|
||||
bool is_negative_infinity() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return false;
|
||||
return is_number() && __builtin_isinf_sign(as_double()) < 0;
|
||||
}
|
||||
|
||||
bool is_positive_zero() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return as_i32() == 0;
|
||||
return is_number() && bit_cast<u64>(as_double()) == 0;
|
||||
}
|
||||
|
||||
bool is_negative_zero() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return false;
|
||||
return is_number() && bit_cast<u64>(as_double()) == NEGATIVE_ZERO_BITS;
|
||||
}
|
||||
|
||||
bool is_integral_number() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return true;
|
||||
return is_finite_number() && trunc(as_double()) == as_double();
|
||||
}
|
||||
|
||||
bool is_finite_number() const
|
||||
{
|
||||
if (type() == Type::Int32)
|
||||
return true;
|
||||
if (!is_number())
|
||||
return false;
|
||||
auto number = as_double();
|
||||
|
@ -242,8 +286,20 @@ public:
|
|||
FunctionObject& as_function();
|
||||
FunctionObject const& as_function() const;
|
||||
|
||||
i32 as_i32() const;
|
||||
u32 as_u32() const;
|
||||
// FIXME: These two conversions are wrong for JS, and seem likely to be footguns
|
||||
i32 as_i32() const
|
||||
{
|
||||
if (m_type == Type::Int32)
|
||||
return m_value.as_i32;
|
||||
return static_cast<i32>(as_double());
|
||||
}
|
||||
u32 as_u32() const
|
||||
{
|
||||
if (m_type == Type::Int32 && m_value.as_i32 >= 0)
|
||||
return m_value.as_i32;
|
||||
VERIFY(as_double() >= 0);
|
||||
return (u32)min(as_double(), (double)NumericLimits<u32>::max());
|
||||
}
|
||||
|
||||
u64 encoded() const { return m_value.encoded; }
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue