Merge branch 'master' into docs

This commit is contained in:
samsonium
2026-10-19 20:11:53 +03:00
14 changed files with 298 additions and 153 deletions
+33 -4
View File
@@ -42,6 +42,7 @@ fzl_vm_t *fzl_mkvm(const char *filepath)
if (!fd)
{
snprintf(last_err, sizeof(last_err), "failed to open file '%s'", filepath);
free(vm);
return NULL;
}
@@ -50,6 +51,8 @@ fzl_vm_t *fzl_mkvm(const char *filepath)
if (memcmp(hdr, expect_hdr, 5) != 0)
{
snprintf(last_err, sizeof(last_err), "magic check error");
fclose(fd);
free(vm);
return NULL;
}
@@ -60,6 +63,8 @@ fzl_vm_t *fzl_mkvm(const char *filepath)
if (ops_count < 1)
{
snprintf(last_err, sizeof(last_err), "there is nothing to do (0 ops)");
fclose(fd);
free(vm);
return NULL;
}
@@ -89,6 +94,9 @@ fzl_vm_t *fzl_mkvm(const char *filepath)
}
else
{
fclose(fd);
free(vm->consts);
free(vm);
snprintf(last_err, sizeof(last_err), "unknown const type at index %ld",
i);
return NULL;
@@ -104,6 +112,7 @@ fzl_vm_t *fzl_mkvm(const char *filepath)
fread(&op, sizeof(uint64_t), 1, fd);
vm->ops[i] = op;
}
fclose(fd);
return vm;
}
@@ -184,7 +193,7 @@ void print_object(fzl_vm_object_t *obj)
else if (arg.type == FZL_TYPE_UINT)
printf("uint(%lu)", arg.as.u);
else if (arg.type == FZL_TYPE_BOOL)
printf("bool(%b)", arg.as.b);
printf("bool(%s)", arg.as.b ? "true" : "false");
else if (arg.type == FZL_TYPE_NULL)
printf("<null>");
else if (arg.type == FZL_TYPE_OBJECT)
@@ -650,8 +659,17 @@ int fzl_vm_run(fzl_vm_t *vm)
break;
case FZL_OPCODE_JMP:
vm->ip = vm->ops[++vm->ip] - 1;
{
if (vm->ops_count <= vm->ip)
{
snprintf(last_err, sizeof(last_err),
"runtime error - expected JMP addr");
return -1;
}
uint64_t jmp_ip = vm->ops[++vm->ip];
vm->ip = jmp_ip - 1;
break;
}
case FZL_OPCODE_AND:
if (vm->dtop < 2)
@@ -723,6 +741,14 @@ int fzl_vm_run(fzl_vm_t *vm)
}
}
if (wrlvl <= -1)
{
snprintf(last_err, sizeof(last_err),
"runtime error - name '%s' not found in this scope", wrname);
print_err_data(vm);
return -1;
}
fzl_vm_env_wresult_t wresult =
fzl_env_writevalue(vm->estack[wrlvl], (char *)wrname, value);
if (wresult != FZL_VM_ENV_WRESULT_OK)
@@ -807,7 +833,7 @@ int fzl_vm_run(fzl_vm_t *vm)
else if (arg.type == FZL_TYPE_UINT)
printf("%lu\n", arg.as.u);
else if (arg.type == FZL_TYPE_BOOL)
printf("%b\n", arg.as.b);
printf("%s\n", arg.as.b ? "true" : "false");
else if (arg.type == FZL_TYPE_NULL)
printf("<null>\n");
else if (arg.type == FZL_TYPE_OBJECT)
@@ -816,7 +842,7 @@ int fzl_vm_run(fzl_vm_t *vm)
else if (fn_id == FZL_BUILTIN_EXIT)
{
fzl_value_t arg = vm->dstack[--vm->dtop];
exit(arg.as.i);
return arg.as.i;
}
else
{
@@ -985,6 +1011,9 @@ void fzl_freevm(fzl_vm_t *vm)
if (!vm)
return;
while (vm->etop > 0)
fzl_freeenv(vm->estack[--vm->etop]);
for (size_t i = 0; i < vm->consts_count; i++)
{
if (vm->consts[i].type == FZL_CONSTTYPE_STRING)
-2
View File
@@ -7,8 +7,6 @@
#include <string.h>
#include <vm/fzl_vm_env.h>
static const fzl_value_t null = {.type = FZL_TYPE_NULL};
fzl_vm_env_t *fzl_mkenv()
{
fzl_vm_env_t *env = malloc(sizeof(fzl_vm_env_t));
+11 -2
View File
@@ -34,7 +34,7 @@ run_args_t *parse_args(int argc, char **argv)
args->help = false;
args->debug = false;
for (size_t i = 0; i < argc; i++)
for (int i = 0; i < argc; i++)
{
if (argv[i][0] != '-')
continue;
@@ -50,6 +50,7 @@ run_args_t *parse_args(int argc, char **argv)
{
printf("Error: unknown flag '%s'.\n", argv[i]);
printf("Use 'fz --help' to read the usage\n");
free(args);
return NULL;
}
}
@@ -58,6 +59,7 @@ run_args_t *parse_args(int argc, char **argv)
{
printf("Error: last argument MUST be a file path\n");
printf("Use 'fz --help' for help\n");
free(args);
return NULL;
}
@@ -74,6 +76,7 @@ int main(int argc, char **argv)
else if (args->help)
{
print_hint();
free(args);
return 0;
}
@@ -81,6 +84,7 @@ int main(int argc, char **argv)
if (!vm)
{
printf("Error: %s\n", fzl_vm_geterror());
free(args);
return -1;
}
@@ -91,7 +95,12 @@ int main(int argc, char **argv)
int result = fzl_vm_run(vm);
if (result != 0)
{
printf("Error: %s\n", fzl_vm_geterror());
char *err = fzl_vm_geterror();
if (err && err[0])
printf("Error: %s\n", err);
free(args);
fzl_freevm(vm);
return -1;
}
}