/* * Copyright (c) 2021-2025, Andreas Kling * Copyright (c) 2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace JS::Bytecode { bool g_dump_bytecode = false; 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 src1.encoded() != src2.encoded(); } return !TRY(is_loosely_equal(vm, src1, 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 src1.encoded() == src2.encoded(); } return TRY(is_loosely_equal(vm, src1, 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 src1.encoded() != src2.encoded(); } return !is_strictly_equal(src1, 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 src1.encoded() == src2.encoded(); } return is_strictly_equal(src1, src2); } Interpreter::Interpreter(VM& vm) : m_vm(vm) { } Interpreter::~Interpreter() { } ALWAYS_INLINE Value Interpreter::get(Operand op) const { return m_running_execution_context->registers_and_constants_and_locals_and_arguments()[op.index()]; } ALWAYS_INLINE void Interpreter::set(Operand op, Value value) { m_running_execution_context->registers_and_constants_and_locals_and_arguments()[op.index()] = value; } ALWAYS_INLINE Value Interpreter::do_yield(Value value, Optional