/* * Copyright (c) 2021, Ali Mohammad Pur * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include namespace Wasm { struct Interpreter { void interpret(Configuration&); bool did_trap() const { return m_do_trap; } void clear_trap() { m_do_trap = false; } Function* pre_interpret_hook { nullptr }; Function* post_interpret_hook { nullptr }; private: void interpret(Configuration&, InstructionPointer&, const Instruction&); void branch_to_label(Configuration&, LabelIndex); ReadonlyBytes load_from_memory(Configuration&, const Instruction&, size_t); void store_to_memory(Configuration&, const Instruction&, ReadonlyBytes data); void call_address(Configuration&, FunctionAddress); 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); bool trap_if_not(bool value) { if (!value) m_do_trap = true; return m_do_trap; } bool m_do_trap { false }; }; }