#include "common/fzl_opcodes.h" #include #include #include void fzl_vm_print_ops(fzl_vm_t *vm) { if (!vm) return; if (vm->ops_count < 1) { printf("no opcodes\n"); return; } for (size_t i = 0; i < vm->ops_count; i++) { printf("%04ld: ", i); switch (vm->ops[i]) { case FZL_OPCODE_DEREFERENCE: printf("DEREFERENCE\n"); break; case FZL_OPCODE_CMP_EQ_STR: printf("CMP_EQ_STR\n"); break; case FZL_OPCODE_CMP_NEQ_STR: printf("CMP_NEQ_STR\n"); break; case FZL_OPCODE_CMP_EQ_OBJ: printf("CMP_EQ_OBJ\n"); break; case FZL_OPCODE_CMP_NEQ_OBJ: printf("CMP_NEQ_OBJ\n"); break; case FZL_OPCODE_ESCAPE_OBJECT: printf("ESCAPE_OBJ\n"); break; case FZL_OPCODE_ALLOC_OBJECT: printf("ALLOC_OBJECT: %lu fields\n", vm->ops[++i]); break; case FZL_OPCODE_GET_FIELD: printf("GET_FIELD #%lu\n", vm->ops[++i]); break; case FZL_OPCODE_SET_FIELD: printf("SET_FIELD #%lu\n", vm->ops[++i]); break; case FZL_OPCODE_CALL: { size_t ip = vm->ops[++i]; printf("CALL IP: %lu\n", ip); break; } case FZL_OPCODE_RET: printf("RET\n"); break; case FZL_OPCODE_LOADCONST: { size_t const_n = vm->ops[++i]; fzl_const_t c = vm->consts[const_n]; printf("LOADCONST #%lu ('%s')\n", const_n, c.as.string.chars); break; } case FZL_OPCODE_CALL_BUILTIN: printf("CALL_BUILTIN #%lu\n", vm->ops[++i]); break; case FZL_OPCODE_PUSHNUM: printf("PUSHNUM %lu\n", vm->ops[++i]); break; case FZL_OPCODE_PUSHBOOL: printf("PUSHBOOL %s\n", vm->ops[++i] ? "true" : "false"); break; case FZL_OPCODE_MK_ENVTABLE: printf("MK_ENVTABLE\n"); break; case FZL_OPCODE_RM_ENVTABLE: printf("RM_ENVTABLE\n"); break; case FZL_OPCODE_STORE: printf("STORE\n"); break; case FZL_OPCODE_LOOKUP_ENV: printf("LOOKUP_ENV\n"); break; case FZL_OPCODE_WRITE: printf("WRITE\n"); break; case FZL_OPCODE_ADD: case FZL_OPCODE_SUB: case FZL_OPCODE_MUL: case FZL_OPCODE_DIV: case FZL_OPCODE_POW: case FZL_OPCODE_MOD: printf("MATH\n"); break; case FZL_OPCODE_AND: printf("AND\n"); break; case FZL_OPCODE_OR: printf("OR\n"); break; case FZL_OPCODE_CMP_EQ: printf("CMP_EQ\n"); break; case FZL_OPCODE_CMP_NEQ: printf("CMP_NEQ\n"); break; case FZL_OPCODE_CMP_LT: printf("CMP_LT\n"); break; case FZL_OPCODE_CMP_LTEQ: printf("CMP_LTEQ\n"); break; case FZL_OPCODE_CMP_GT: printf("CMP_GT\n"); break; case FZL_OPCODE_CMP_GTEQ: printf("CMP_GTEQ\n"); break; case FZL_OPCODE_NOT: printf("CMP_NOT\n"); break; case FZL_OPCODE_NEG: printf("NEG\n"); break; case FZL_OPCODE_JZ: printf("JZ IP: %ld\n", vm->ops[++i]); break; case FZL_OPCODE_JMP: printf("JMP IP: %ld\n", vm->ops[++i]); break; default: printf("\n"); } } }