From 26d935e22a21f7de8cfe2b373f666f053c0d0dc8 Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Mon, 17 Aug 2026 10:46:27 +0200 Subject: [PATCH] feat(furdb): add function for printing instruction --- furdb/include/context.hpp | 2 + furdb/src/command.cpp | 2 + furdb/src/context.cpp | 107 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/furdb/include/context.hpp b/furdb/include/context.hpp index eb856b8..9da9f96 100644 --- a/furdb/include/context.hpp +++ b/furdb/include/context.hpp @@ -16,6 +16,8 @@ struct context { bool halt = false; void run(); + + void print_instruction() const; }; #endif // CONTEXT_HPP diff --git a/furdb/src/command.cpp b/furdb/src/command.cpp index fbba535..8512abb 100644 --- a/furdb/src/command.cpp +++ b/furdb/src/command.cpp @@ -62,6 +62,8 @@ static void breakpoint_hit(furvm::executor& executor, void* data) { std::cout << "Breakpoint hit\n"; context* ctx = reinterpret_cast(data); ctx->halt = true; + + ctx->print_instruction(); } void break_command::execute(context& ctx, const command_info& info) { diff --git a/furdb/src/context.cpp b/furdb/src/context.cpp index c717610..f93068d 100644 --- a/furdb/src/context.cpp +++ b/furdb/src/context.cpp @@ -1,7 +1,9 @@ #include "context.hpp" #include +#include #include +#include void context::run() { if ((executor->flags() & furvm::executor_flags::Done) != furvm::executor_flags::Done) @@ -13,3 +15,108 @@ void context::run() { std::cout << "Execution finished\n"; } } + +void context::print_instruction() const { + static const char* s_instrNames[furvm::instruction::Count] = { + // NoOperation + "nop", + // PushS8 + "push $s8", + // PushU8 + "push $u8", + // PushS16 + "push $s16", + // PushU16 + "push $U16", + // PushS32 + "push $S32", + // PushU32 + "push $U32", + // PushConstant + "push", + // Array + "array", + // Get + "get", + // Set + "set", + // Drop + "drop", + // Duplicate + "dup", + // Swap + "swap", + // Clone + "clone", + // Reference + "ref", + // Add + "add", + // Sub + "sub", + // Mul + "mul", + // Div + "div", + // Mod + "mod", + // Equals + "eq", + // NotEquals + "ne", + // LessThan + "lt", + // GreaterThan + "gt", + // LessEqual + "le", + // GreaterEqual + "ge", + // Pointerof + "pointerof", + // Sizeof + "sizeof", + // Lengthof + "lenof", + // Load + "load", + // Store + "store", + // LoadGlobal + "loadg", + // StoreGlobal + "storeg", + // Call + "call", + // Jump + "jmp", + // JumpNotZero + "jnz", + // Return + "ret", + }; + + furvm::instruction instr{}; + instr.read(mod->bytecode_view().subview(executor->top_frame().position)); + std::cout << s_instrNames[instr.type]; + if (instr.arg.type != furvm::instruction_argument_t::None) { + std::cout << ' '; + switch (instr.arg.type) { + case furvm::instruction_argument::S8: + case furvm::instruction_argument::U8: + case furvm::instruction_argument::S16: + case furvm::instruction_argument::U16: + case furvm::instruction_argument::S32: + case furvm::instruction_argument::U32: + case furvm::instruction_argument::None: + case furvm::instruction_argument::Count: break; + case furvm::instruction_argument::Constant: throw std::runtime_error("unimplemented"); + case furvm::instruction_argument::Type: std::cout << "$__t" << instr.arg.u32; break; + case furvm::instruction_argument::Variable: std::cout << "%" << instr.arg.u16; break; + case furvm::instruction_argument::GlobalVariable: std::cout << "%__g" << instr.arg.u16; break; + case furvm::instruction_argument::Function: std::cout << ""; break; + case furvm::instruction_argument::Offset: std::cout << instr.arg.s8; break; + } + } + std::cout << '\n'; +}