From de0e88f2e91414c6b06d44a92d93a027b057fa69 Mon Sep 17 00:00:00 2001 From: samsonium Date: Thu, 5 Nov 2026 04:01:23 +0300 Subject: [PATCH] wip: begin writer impl for externs --- src/compiler/fzl_writer.c | 5 +++++ src/compiler/generator/gen_externfn.c | 9 ++++----- src/compiler/generator/gen_struct.c | 11 +---------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/compiler/fzl_writer.c b/src/compiler/fzl_writer.c index 5c0a4af..527c90d 100644 --- a/src/compiler/fzl_writer.c +++ b/src/compiler/fzl_writer.c @@ -39,6 +39,9 @@ int fzl_write(fzl_writer_t *writer, fzl_gen_t *gen) const char hdr[5] = {'F', 'Z', 'L', 0x0, 0x1}; fwrite(hdr, sizeof(char), 5, fp); fwrite(&gen->consts->size, sizeof(size_t), 1, fp); + fwrite(&gen->extern_libs_count, sizeof(size_t), 1, fp); + fwrite(&gen->extern_types_count, sizeof(size_t), 1, fp); + fwrite(&gen->extern_fns_count, sizeof(size_t), 1, fp); fwrite(&gen->ops_count, sizeof(size_t), 1, fp); for (size_t i = 0; i < gen->consts->size; i++) @@ -54,6 +57,8 @@ int fzl_write(fzl_writer_t *writer, fzl_gen_t *gen) } } + // TODO: write libs, types and functions + if (gen->ops_count > 0) fwrite(gen->ops, sizeof(uint64_t), gen->ops_count, fp); diff --git a/src/compiler/generator/gen_externfn.c b/src/compiler/generator/gen_externfn.c index 97f1e8b..3890793 100644 --- a/src/compiler/generator/gen_externfn.c +++ b/src/compiler/generator/gen_externfn.c @@ -32,9 +32,6 @@ gen_res_t gen_externfn(fzl_gen_t *gen, fzl_node_t *node) for (size_t i = 0; i < node->ext_fn.args_count; i++) { fzl_node_t *argnode = node->ext_fn.args[i]; - if (gen_common(gen, argnode).error) - return gen_error; - if (args_count >= args_remainder) { args_remainder *= 2; @@ -105,7 +102,8 @@ gen_res_t gen_externfn(fzl_gen_t *gen, fzl_node_t *node) return gen_error; } - if (ret != FZL_TYPE_NULL) + if (ret == FZL_TYPE_OBJECT || ret == FZL_TYPE_STRUCT || + ret == FZL_TYPE_HANDLE) { res = fzl_symt_setobjclass(gen->syms[0], node->ext_fn.name, ex_retcn); if (res != FZL_SYMTABLE_RESULT_OK) @@ -130,7 +128,8 @@ gen_res_t gen_externfn(fzl_gen_t *gen, fzl_node_t *node) result->args_count = args_count; result->has_return = ret != FZL_TYPE_NULL; result->used_name = node->ext_fn.name; - result->symbol_name = node->ext_fn.original_name; + result->symbol_name = node->ext_fn.original_name ? node->ext_fn.original_name + : node->ext_fn.name; return gen_ok_null; } diff --git a/src/compiler/generator/gen_struct.c b/src/compiler/generator/gen_struct.c index d3c29a4..b2fd993 100644 --- a/src/compiler/generator/gen_struct.c +++ b/src/compiler/generator/gen_struct.c @@ -17,10 +17,7 @@ gen_res_t gen_struct(fzl_gen_t *gen, fzl_node_t *node) if (!gen || !node) return gen_error; - type_buf.kind = FZL_EXTERN_KIND_STRUCT; - fzl_gen_ctx_t *ctx = gen_ctx(gen, FZL_GEN_CTX_TYPE_UNECCESSARY, node); - if (!ctx) - return gen_error; + type_buf.kind = FZL_EXTERN_KIND_STRUCT; size_t remainder = 2; size_t count = 0; @@ -32,12 +29,6 @@ gen_res_t gen_struct(fzl_gen_t *gen, fzl_node_t *node) for (size_t i = 0; i < node->structure.entries_count; i++) { fzl_node_t *fnode = node->structure.entries[i]; - if (gen_common(gen, fnode).error) - { - free(fields); - return gen_error; - } - if (count >= remainder) { remainder *= 2;