From 3f2f03f931512dc6533750da99120a00a31f5e95 Mon Sep 17 00:00:00 2001 From: samsonium Date: Mon, 19 Oct 2026 19:54:11 +0300 Subject: [PATCH] fix: sanitizer checks fix (iteration 2) --- src/compiler/fzl_parser.c | 34 ++++++++++++++++++++++++++-------- src/vm/fzl_vm.c | 5 ++++- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/compiler/fzl_parser.c b/src/compiler/fzl_parser.c index 9bf96c5..e2d93b9 100644 --- a/src/compiler/fzl_parser.c +++ b/src/compiler/fzl_parser.c @@ -14,11 +14,19 @@ fzl_token_t null_tok = { .filename = "", .ln = 0, .cn = 0, - .store_value = true, + .store_value = false, .value = "null", .value_sz = 4, }; +fzl_token_t this_tok = {.type = FZL_TOKTYPE_NAME, + .filename = "", + .ln = 0, + .cn = 0, + .store_value = false, + .value = "this", + .value_sz = 4}; + fzl_parser_t *fzl_mkparser(fzl_reader_ll_t *first) { if (!first) @@ -725,10 +733,7 @@ fzl_node_t *parse_class(fzl_parser_t *parser) memmove(&new_args[1], new_args, (node->fn.args_count - 1) * sizeof(fzl_node_t *)); - fzl_token_t *this_tok = - fzl_mktoken(FZL_TOKTYPE_NAME, node->fn.name->ln, node->fn.name->cn, - "this", 4, node->fn.name->filename); - fzl_node_t *this_id = fzl_mknode(FZL_NODETYPE_IDENTIFIER, this_tok); + fzl_node_t *this_id = fzl_mknode(FZL_NODETYPE_IDENTIFIER, &this_tok); fzl_node_t *this_dec = fzl_mknode(FZL_NODETYPE_DECLARATION, name); this_dec->var.type = name; this_dec->var.identifier = this_id; @@ -1090,14 +1095,28 @@ void fzl_freeast(fzl_node_t *root) break; case FZL_NODETYPE_CALL: + if (root->call.callee) + fzl_freeast(root->call.callee); + if (root->call.args_count) { for (size_t i = 0; i < root->call.args_count; i++) if (root->call.args[i]) fzl_freeast(root->call.args[i]); - - free(root->call.args); } + if (root->call.args) + free(root->call.args); + break; + + case FZL_NODETYPE_CONDITIONAL: + if (root->cond.condition) + fzl_freeast(root->cond.condition); + + if (root->cond.true_block) + fzl_freeast(root->cond.true_block); + + if (root->cond.else_block) + fzl_freeast(root->cond.else_block); break; case FZL_NODETYPE_ADD: @@ -1106,7 +1125,6 @@ void fzl_freeast(fzl_node_t *root) case FZL_NODETYPE_DIV: case FZL_NODETYPE_POW: case FZL_NODETYPE_MOD: - case FZL_NODETYPE_CONDITIONAL: case FZL_NODETYPE_OR: case FZL_NODETYPE_AND: case FZL_NODETYPE_EQUAL: diff --git a/src/vm/fzl_vm.c b/src/vm/fzl_vm.c index 9cc73c3..07827f8 100644 --- a/src/vm/fzl_vm.c +++ b/src/vm/fzl_vm.c @@ -660,7 +660,7 @@ int fzl_vm_run(fzl_vm_t *vm) case FZL_OPCODE_JMP: { - if (vm->ops_count >= vm->ip) + if (vm->ops_count <= vm->ip) { snprintf(last_err, sizeof(last_err), "runtime error - expected JMP addr"); @@ -1011,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)