diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index cd34b86b1d..fbcb89d8fd 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -119,23 +119,39 @@ NonnullOwnPtr CallFrame::create(size_t register_count) return call_frame; } -static ThrowCompletionOr loosely_inequals(VM& vm, Value src1, Value src2) +ALWAYS_INLINE static ThrowCompletionOr loosely_inequals(VM& vm, Value src1, Value src2) { + if (src1.tag() == src2.tag()) { + if (src1.is_int32() || src1.is_object() || src1.is_boolean() || src1.is_nullish()) + return Value(src1.encoded() != src2.encoded()); + } return Value(!TRY(is_loosely_equal(vm, src1, src2))); } -static ThrowCompletionOr loosely_equals(VM& vm, Value src1, Value src2) +ALWAYS_INLINE static ThrowCompletionOr loosely_equals(VM& vm, Value src1, Value src2) { + if (src1.tag() == src2.tag()) { + if (src1.is_int32() || src1.is_object() || src1.is_boolean() || src1.is_nullish()) + return Value(src1.encoded() == src2.encoded()); + } return Value(TRY(is_loosely_equal(vm, src1, src2))); } -static ThrowCompletionOr strict_inequals(VM&, Value src1, Value src2) +ALWAYS_INLINE static ThrowCompletionOr strict_inequals(VM&, Value src1, Value src2) { + if (src1.tag() == src2.tag()) { + if (src1.is_int32() || src1.is_object() || src1.is_boolean() || src1.is_nullish()) + return Value(src1.encoded() != src2.encoded()); + } return Value(!is_strictly_equal(src1, src2)); } -static ThrowCompletionOr strict_equals(VM&, Value src1, Value src2) +ALWAYS_INLINE static ThrowCompletionOr strict_equals(VM&, Value src1, Value src2) { + if (src1.tag() == src2.tag()) { + if (src1.is_int32() || src1.is_object() || src1.is_boolean() || src1.is_nullish()) + return Value(src1.encoded() == src2.encoded()); + } return Value(is_strictly_equal(src1, src2)); } diff --git a/Userland/Libraries/LibJS/Runtime/Value.h b/Userland/Libraries/LibJS/Runtime/Value.h index 68b38978e4..f22e161de6 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.h +++ b/Userland/Libraries/LibJS/Runtime/Value.h @@ -131,6 +131,8 @@ public: Number, }; + [[nodiscard]] u16 tag() const { return m_value.tag; } + bool is_empty() const { return m_value.tag == EMPTY_TAG; } bool is_undefined() const { return m_value.tag == UNDEFINED_TAG; } bool is_null() const { return m_value.tag == NULL_TAG; }