#include #include #include #include #include #include #include void fzl_vm_print_ops(fzl_vm_t *vm) { if (!vm) return; if (vm->reader->ops_count < 1) { printf("no opcodes\n"); return; } for (size_t i = 0; i < vm->reader->ops_count; i++) { printf("%04ld: ", i); switch (vm->reader->ops[i]) { case FZL_OPCODE_CALL_EXTERN: { size_t fn_n = vm->reader->ops[++i]; printf("CALL_EXTERN FN=#%zu (%s)\n", fn_n, vm->reader->extern_fns[fn_n].used_name); break; } case FZL_OPCODE_STORE_LOCAL: { size_t depth = vm->reader->ops[++i]; size_t slot = vm->reader->ops[++i]; printf("STORE_LOCAL D=%zu S=%zu\n", depth, slot); break; } case FZL_OPCODE_LOAD_LOCAL: { size_t depth = vm->reader->ops[++i]; size_t slot = vm->reader->ops[++i]; printf("LOAD_LOCAL D=%zu S=%zu\n", depth, slot); break; } case FZL_OPCODE_BUILD_STR: printf("BUILD_STR %zu\n", vm->reader->ops[++i]); break; 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->reader->ops[++i]); break; case FZL_OPCODE_GET_FIELD: printf("GET_FIELD #%lu\n", vm->reader->ops[++i]); break; case FZL_OPCODE_SET_FIELD: printf("SET_FIELD #%lu\n", vm->reader->ops[++i]); break; case FZL_OPCODE_CALL: { size_t ip = vm->reader->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->reader->ops[++i]; fzl_value_t c = vm->reader->consts[const_n]; printf("LOADCONST #%lu ('%s')\n", const_n, c.as.s.value); break; } case FZL_OPCODE_CALL_BUILTIN: printf("CALL_BUILTIN #%lu\n", vm->reader->ops[++i]); break; case FZL_OPCODE_PUSHNUM: printf("PUSHNUM %lu\n", vm->reader->ops[++i]); break; case FZL_OPCODE_PUSHBOOL: printf("PUSHBOOL %s\n", vm->reader->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->reader->ops[++i]); break; case FZL_OPCODE_JMP: printf("JMP IP: %ld\n", vm->reader->ops[++i]); break; } } }