feat: finished variables declaration / assign

This commit is contained in:
samsonium
2026-10-14 01:00:01 +03:00
parent 7e52c671aa
commit c0dc14a0c7
11 changed files with 419 additions and 32 deletions
+81 -2
View File
@@ -1,3 +1,4 @@
#include "vm/fzl_vm_env.h"
#include <common/fzl_builtins.h>
#include <common/fzl_opcodes.h>
#include <common/fzl_types.h>
@@ -122,11 +123,87 @@ int fzl_vm_run(fzl_vm_t *vm)
switch (opcode)
{
case FZL_OPCODE_MK_ENVTABLE:
case FZL_OPCODE_STORE:
case FZL_OPCODE_WRITE:
if (vm->dtop < 1)
{
snprintf(last_err, sizeof(last_err),
"runtime error - expected var name in data stack");
return -1;
}
fzl_value_t varname = vm->dstack[--vm->dtop];
fzl_env_storevalue(vm->estack[vm->etop - 1], (char *)varname.as.s.value,
(fzl_value_t){});
break;
case FZL_OPCODE_WRITE:
if (vm->dtop < 2)
{
snprintf(last_err, sizeof(last_err),
"runtime error - expected 2 values in data stack");
return -1;
}
fzl_value_t writevar = vm->dstack[--vm->dtop];
fzl_value_t value = vm->dstack[--vm->dtop];
fzl_vm_env_wresult_t wresult = fzl_env_writevalue(
vm->estack[vm->etop - 1], (char *)writevar.as.s.value, value);
if (wresult != FZL_VM_ENV_WRESULT_OK)
{
switch (wresult)
{
case FZL_VM_ENV_WRESULT_ERR:
snprintf(last_err, sizeof(last_err),
"runtime error - failed to write variable");
return -1;
case FZL_VM_ENV_WRESULT_ERR_EXISTS:
snprintf(last_err, sizeof(last_err),
"runtime error - redefenition of '%s'",
writevar.as.s.value);
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);
return -1;
default:
return -1;
}
}
vm->dstack[vm->dtop++] = value;
break;
case FZL_OPCODE_MK_ENVTABLE:
vm->estack[vm->etop++] = fzl_mkenv();
break;
case FZL_OPCODE_RM_ENVTABLE:
fzl_freeenv(vm->estack[--vm->etop]);
break;
case FZL_OPCODE_LOOKUP_ENV:
{
if (vm->dtop < 1)
{
snprintf(last_err, sizeof(last_err),
"runtime error - LOOKUP_ENV: empty data stack");
return -1;
}
fzl_value_t val = vm->dstack[--vm->dtop];
fzl_value_t env_val =
fzl_env_lookup(vm->estack[vm->etop - 1], (char *)val.as.s.value);
vm->dstack[vm->dtop++] = env_val;
break;
}
case FZL_OPCODE_CALL_BUILTIN:
{
uint64_t fn_id = vm->ops[++vm->ip];
@@ -143,6 +220,8 @@ int fzl_vm_run(fzl_vm_t *vm)
printf("%lu\n", arg.as.u);
else if (arg.type == FZL_TYPE_BOOL)
printf("%b\n", arg.as.b);
else if (arg.type == FZL_TYPE_NULL)
printf("<null>\n");
}
else
{