#ifndef VM_H #define VM_H #include "stack.h" #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(program[0])) #define STACK_CAPACITY 1024 #define HEAP_CAPACITY 1024 typedef enum inst_type { // stack INST_PUSH, INST_DUP, INST_COPY, INST_SWAP, INST_DROP, INST_SLIDE, // arithmetics INST_ADD, INST_SUB, INST_MUL, INST_DIV, INST_MOD, // heap access INST_STORE, INST_LOAD, // Flow control INST_CALL, INST_RET, INST_LABEL, INST_JMP, INST_JMPZ, INST_JMPN, // I/O INST_PRINTI, INST_PRINTC, INST_READI, INST_READC, INST_END, } inst_type_t; typedef struct instr { inst_type_t type; int operand; } inst_t; typedef struct label { int name; int index; } label_t; typedef struct vm { stack_t stack; stack_t call_stack; int *heap; label_t *labels; } vm_t; void vm_init(vm_t *vm); void vm_run(vm_t *vm, inst_t *insts); #endif /* VM_H */