feat: new debug print on exception!

This commit is contained in:
samsonium
2026-10-17 21:55:52 +03:00
parent c0c90f4f1a
commit 244dd33372
+90
View File
@@ -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("<null>\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;
}