/* * Copyright (c) 2021, Ali Mohammad Pur * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Wasm { struct BytecodeInterpreter : public Interpreter { virtual void interpret(Configuration&) override; virtual ~BytecodeInterpreter() override = default; virtual bool did_trap() const override { return m_trap.has_value(); } virtual String trap_reason() const override { return m_trap.value().reason; } virtual void clear_trap() override { m_trap.clear(); } struct CallFrameHandle { explicit CallFrameHandle(BytecodeInterpreter& interpreter, Configuration& configuration) : m_configuration_handle(configuration) , m_interpreter(interpreter) { } ~CallFrameHandle() = default; Configuration::CallFrameHandle m_configuration_handle; BytecodeInterpreter& m_interpreter; }; protected: virtual void interpret(Configuration&, InstructionPointer&, Instruction const&); void branch_to_label(Configuration&, LabelIndex); template void load_and_push(Configuration&, Instruction const&); template void pop_and_store(Configuration&, Instruction const&); void store_to_memory(Configuration&, Instruction const&, ReadonlyBytes data); void call_address(Configuration&, FunctionAddress); template void binary_numeric_operation(Configuration&); template void unary_operation(Configuration&); template MakeUnsigned checked_unsigned_truncate(V); template MakeSigned checked_signed_truncate(V); template T read_value(ReadonlyBytes data); Vector pop_values(Configuration& configuration, size_t count); ALWAYS_INLINE bool trap_if_not(bool value, StringView reason) { if (!value) m_trap = Trap { reason }; return m_trap.has_value(); } Optional m_trap; StackInfo m_stack_info; }; struct DebuggerBytecodeInterpreter : public BytecodeInterpreter { virtual ~DebuggerBytecodeInterpreter() override = default; Function pre_interpret_hook; Function post_interpret_hook; private: virtual void interpret(Configuration&, InstructionPointer&, Instruction const&) override; }; }