From 244dd333722f12997c05d80d246bc21351f45308 Mon Sep 17 00:00:00 2001 From: samsonium Date: Sat, 17 Oct 2026 21:55:52 +0300 Subject: [PATCH] feat: new debug print on exception! --- src/vm/fzl_vm.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/src/vm/fzl_vm.c b/src/vm/fzl_vm.c index 5f7539a..5c5efd5 100644 --- a/src/vm/fzl_vm.c +++ b/src/vm/fzl_vm.c @@ -147,6 +147,55 @@ void print_object(fzl_vm_object_t *obj) printf(">\n"); } +void print_err_data(fzl_vm_t *vm) +{ + printf("===== ERROR =====\n"); + printf("> Caused on IP: %zu\n", vm->ip); + + printf("\n> Data stack:\n"); + for (ssize_t i = vm->dtop - 1; i >= 0; i--) + { + printf("\t> [%d] ", vm->dstack[i].type); + switch (vm->dstack[i].type) + { + case FZL_TYPE_OBJECT: + printf("ref: %p\n", vm->dstack[i].as.obj); + break; + case FZL_TYPE_STRING: + printf("str: '%s'\n", vm->dstack[i].as.s.value); + break; + case FZL_TYPE_NULL: + printf("\n"); + break; + default: + printf("%lu\n", vm->dstack[i].as.u); + break; + } + } + + printf("\n> Environments:\n"); + for (ssize_t i = vm->etop - 1; i >= 0; i--) + { + fzl_vm_env_t *env = vm->estack[i]; + printf("\t> [%zd] %p:\n", i, env); + + printf("\t\t> Owned objects (%zu/%zu):\n", env->owned_objects_count, + env->owned_objects_remainder); + for (size_t j = 0; j < env->owned_objects_count; j++) + printf("\t\t\t> ref: %p (entries: %zu)\n", env->owned_objects[j], + env->owned_objects[j]->values_count); + + printf("\t\t> Local entries (%zu/%zu):\n", env->size, env->remainder); + for (size_t j = 0; j < env->size; j++) + printf("\t\t\t> [%d] %s = %lu\n", env->table[j].value.type, + env->table[j].name, env->table[j].value.as.u); + } + + printf("\n> Call stack:\n"); + for (ssize_t i = vm->ctop - 1; i >= 0; i--) + printf("\t> [%zd] %lu\n", i, vm->cstack[i]); +} + int fzl_vm_run(fzl_vm_t *vm) { if (!vm) @@ -168,6 +217,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } fzl_value_t left = vm->dstack[--vm->dtop]; @@ -185,6 +235,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } fzl_value_t left = vm->dstack[--vm->dtop]; @@ -202,6 +253,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } fzl_value_t left = vm->dstack[--vm->dtop]; @@ -218,6 +270,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } fzl_value_t left = vm->dstack[--vm->dtop]; @@ -234,6 +287,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - missing value in data stack"); + print_err_data(vm); return -1; } fzl_value_t obj = vm->dstack[--vm->dtop]; @@ -241,6 +295,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - cannot escape non-object type"); + print_err_data(vm); return -1; } @@ -250,6 +305,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - cannot escape object from global env"); + print_err_data(vm); return -1; } @@ -310,6 +366,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected value in data stack"); + print_err_data(vm); return -1; } @@ -321,6 +378,7 @@ int fzl_vm_run(fzl_vm_t *vm) last_err, sizeof(last_err), "runtime error - cannot access field #%lu of non-object type", field_slot); + print_err_data(vm); return -1; } @@ -329,6 +387,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - cannot access field #%lu", field_slot); + print_err_data(vm); return -1; } @@ -342,6 +401,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -354,6 +414,7 @@ int fzl_vm_run(fzl_vm_t *vm) last_err, sizeof(last_err), "runtime error - cannot access field #%lu of non-object type", field_slot); + print_err_data(vm); return -1; } @@ -362,6 +423,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - cannot access field #%lu", field_slot); + print_err_data(vm); return -1; } @@ -383,6 +445,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - no place to jump"); + print_err_data(vm); return -1; } @@ -395,6 +458,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -409,6 +473,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -423,6 +488,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -437,6 +503,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -451,6 +518,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -465,6 +533,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -479,6 +548,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected value in data stack"); + print_err_data(vm); return -1; } @@ -492,6 +562,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected value in data stack"); + print_err_data(vm); return -1; } @@ -510,6 +581,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -524,6 +596,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected two values in data stack"); + print_err_data(vm); return -1; } @@ -538,6 +611,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected var name in data stack"); + print_err_data(vm); return -1; } @@ -552,6 +626,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in data stack"); + print_err_data(vm); return -1; } @@ -567,21 +642,25 @@ int fzl_vm_run(fzl_vm_t *vm) case FZL_VM_ENV_WRESULT_ERR: snprintf(last_err, sizeof(last_err), "runtime error - failed to write variable"); + print_err_data(vm); return -1; case FZL_VM_ENV_WRESULT_ERR_EXISTS: snprintf(last_err, sizeof(last_err), "runtime error - redefenition of '%s'", writevar.as.s.value); + print_err_data(vm); return -1; case FZL_VM_ENV_WRESULT_ERR_NOT_FOUND: snprintf(last_err, sizeof(last_err), "runtime error - cannot find name '%s'", writevar.as.s.value); + print_err_data(vm); return -1; default: + print_err_data(vm); return -1; } } @@ -605,6 +684,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - LOOKUP_ENV: empty data stack"); + print_err_data(vm); return -1; } @@ -647,6 +727,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - undefined builtin %lu", fn_id); + print_err_data(vm); return -1; } } @@ -658,6 +739,7 @@ int fzl_vm_run(fzl_vm_t *vm) if (vm->consts_count <= cn) { snprintf(last_err, sizeof(last_err), "runtime error - unknown const"); + print_err_data(vm); return -1; } fzl_const_t c = vm->consts[cn]; @@ -673,6 +755,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in stack"); + print_err_data(vm); return -1; } fzl_value_t add1 = vm->dstack[--vm->dtop]; @@ -686,6 +769,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in stack"); + print_err_data(vm); return -1; } fzl_value_t sub2 = vm->dstack[--vm->dtop]; @@ -699,6 +783,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in stack"); + print_err_data(vm); return -1; } fzl_value_t mul1 = vm->dstack[--vm->dtop]; @@ -712,6 +797,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in stack"); + print_err_data(vm); return -1; } fzl_value_t div1 = vm->dstack[--vm->dtop]; @@ -725,6 +811,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in stack"); + print_err_data(vm); return -1; } fzl_value_t pow2 = vm->dstack[--vm->dtop]; @@ -745,6 +832,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected 2 values in stack"); + print_err_data(vm); return -1; } fzl_value_t mod1 = vm->dstack[--vm->dtop]; @@ -758,6 +846,7 @@ int fzl_vm_run(fzl_vm_t *vm) { snprintf(last_err, sizeof(last_err), "runtime error - expected value in stack"); + print_err_data(vm); return -1; } fzl_value_t neg_n = vm->dstack[--vm->dtop]; @@ -784,6 +873,7 @@ int fzl_vm_run(fzl_vm_t *vm) default: snprintf(last_err, sizeof(last_err), "runtime error - unknown opcode %u", opcode); + print_err_data(vm); return -1; }