// opcode.h
// feltételezve, hogy a getvar, result, stb. definiálva van. nyilván lehet komplexebb módon is, de ez egy példa
DEFINE_OPCODE(add, Result() = GetVar(0) + GetVar(1))
DEFINE_OPCODE(sub, Result() = GetVar(0) - GetVar(1))
DEFINE_OPCODE(jmp, InstructionPointer() = GetVar(0))
// akármi.cpp
// opcode function definitions
#define DEFINE_OPCODE(name, ...) \
void opcode_##name() { \
__VA_ARGS__ ; \
}
#include "opcode.h"
#undef DEFINE_OPCODE
// ez csak kis extra
// enum class c++11 feature de mindegy
enum class Opcodes {
#define DEFINE_OPCODE(name, ...) \
name ,
#include "opcode.h"
#undef DEFINE_OPCODE
Count };
// nem tudom a függvény pointer pontos szintaxisát de ez az lesz
std::vector<(void)*()> opcodes;
void InitializeOpcodes() {
#define DEFINE_OPCODE(name, ...) \
opcodes.push_back(name); \
assert(opcodes.count() == Opcodes::name + 1);
#include "opcode.h"
#undef DEFINE_OPCODE
assert(opcodes.count() == Opcodes::Count);
}
// ezután pl opcodes[Opcodes::add] egy pointer lesz az opcode_add() függvényre
// nyilván a függvényeknek át kell adni valamilyen paramétert (asm stream), azt nem vettem ebbe bele