200 lines
4.2 KiB
C
200 lines
4.2 KiB
C
#include <common/fzl_opcodes.h>
|
|
#include <common/fzl_value.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <vm/fzl_vm.h>
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|