feat(furdb): add function for printing instruction
This commit is contained in:
@@ -16,6 +16,8 @@ struct context {
|
|||||||
bool halt = false;
|
bool halt = false;
|
||||||
|
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
|
void print_instruction() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONTEXT_HPP
|
#endif // CONTEXT_HPP
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ static void breakpoint_hit(furvm::executor& executor, void* data) {
|
|||||||
std::cout << "Breakpoint hit\n";
|
std::cout << "Breakpoint hit\n";
|
||||||
context* ctx = reinterpret_cast<context*>(data);
|
context* ctx = reinterpret_cast<context*>(data);
|
||||||
ctx->halt = true;
|
ctx->halt = true;
|
||||||
|
|
||||||
|
ctx->print_instruction();
|
||||||
}
|
}
|
||||||
|
|
||||||
void break_command::execute(context& ctx, const command_info& info) {
|
void break_command::execute(context& ctx, const command_info& info) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#include "context.hpp"
|
#include "context.hpp"
|
||||||
|
|
||||||
#include <furvm/executor.hpp>
|
#include <furvm/executor.hpp>
|
||||||
|
#include <furvm/instruction.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
void context::run() {
|
void context::run() {
|
||||||
if ((executor->flags() & furvm::executor_flags::Done) != furvm::executor_flags::Done)
|
if ((executor->flags() & furvm::executor_flags::Done) != furvm::executor_flags::Done)
|
||||||
@@ -13,3 +15,108 @@ void context::run() {
|
|||||||
std::cout << "Execution finished\n";
|
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 << "<a function>"; break;
|
||||||
|
case furvm::instruction_argument::Offset: std::cout << instr.arg.s8; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << '\n';
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user