diff --git a/include/common/fzl_extern.h b/include/common/fzl_extern.h index 59971f6..9836114 100644 --- a/include/common/fzl_extern.h +++ b/include/common/fzl_extern.h @@ -2,68 +2,82 @@ #define FZL_EXTERN_H #include +#include #include -// External library entry types typedef enum { - FZL_EXTERN_KIND_PRIMITIVE, FZL_EXTERN_KIND_HANDLE, FZL_EXTERN_KIND_STRUCT, FZL_EXTERN_KIND_REF, FZL_EXTERN_KIND_ALIAS, } fzl_extern_kind_t; -// External library structure field descriptor +// Type reference descriptor +typedef struct +{ + bool is_primitive; + union + { + fzl_type_t primitive; + size_t type_slot; + }; +} fzl_extern_type_ref_t; + +// Structure field descriptor typedef struct { char *name; - fzl_type_t type; + fzl_extern_type_ref_t type; } fzl_extern_struct_field_t; -// Extern symbol type descriptor -typedef struct fzl_extern_type +// Type descriptor +typedef struct { size_t lib_slot; + char *name; fzl_extern_kind_t kind; - char *symbol_name; - char *used_name; union { - // Structure data + // Structure struct { - fzl_extern_struct_field_t **fields; + fzl_extern_struct_field_t *fields; size_t fields_count; } structure; - // Reference - struct fzl_extern_type *ref_of; + // Pointer (ref) + fzl_extern_type_ref_t ref_target; - // Aliasing type - fzl_type_t alias; - - // Primitive type - // NOTE: same type as `.alias` just for readable format - fzl_type_t primitive; + // Alias + fzl_extern_type_ref_t alias_target; }; } fzl_extern_type_t; -// Extern symbol function descriptor +// Function argument descriptor +typedef struct +{ + char *name; + fzl_extern_type_ref_t type; + bool is_out; +} fzl_extern_arg_t; + +// Function descriptor typedef struct { size_t lib_slot; char *symbol_name; char *used_name; - fzl_extern_type_t *ret_type; + bool has_return; + fzl_extern_type_ref_t ret_type; - fzl_extern_type_t **args; + fzl_extern_arg_t *args; size_t args_count; } fzl_extern_fn_t; -// External library descriptor +// Library descriptor typedef struct { char *name; diff --git a/include/compiler/fzl_walker.h b/include/compiler/fzl_walker.h index 8947136..e8aca6d 100644 --- a/include/compiler/fzl_walker.h +++ b/include/compiler/fzl_walker.h @@ -1,6 +1,7 @@ #ifndef FZL_WALKER_H #define FZL_WALKER_H +#include #include #include #include @@ -73,6 +74,15 @@ typedef struct fzl_ctable_t *classes[64]; size_t classes_count; + + fzl_extern_lib_t extern_libs[64]; + size_t extern_libs_count; + + fzl_extern_type_t extern_types[256]; + size_t extern_types_count; + + fzl_extern_fn_t extern_fns[256]; + size_t extern_fns_count; } fzl_walker_t; // Allocate new walker diff --git a/src/compiler/fzl_walker.c b/src/compiler/fzl_walker.c index 5ddd728..88b51fc 100644 --- a/src/compiler/fzl_walker.c +++ b/src/compiler/fzl_walker.c @@ -1,3 +1,4 @@ +#include "common/fzl_extern.h" #include #include #include @@ -61,6 +62,14 @@ fzl_walker_t *fzl_mkwalker(fzl_node_t *root) walker->classes_count = 0; memset(walker->classes, 0, sizeof(walker->classes)); + walker->extern_libs_count = 0; + walker->extern_types_count = 0; + walker->extern_fns_count = 0; + + memset(walker->extern_libs, 0, sizeof(walker->extern_libs)); + memset(walker->extern_types, 0, sizeof(walker->extern_types)); + memset(walker->extern_fns, 0, sizeof(walker->extern_fns)); + return walker; } @@ -203,7 +212,28 @@ fzl_walk_res_t walk(fzl_walker_t *walker, fzl_node_t *node) { switch (node->type) { - case FZL_NODETYPE_EXTERN: // TODO: create meta + case FZL_NODETYPE_EXTERN: + walker->extern_libs[walker->extern_libs_count++] = + (fzl_extern_lib_t){.name = node->ext.libname}; + + for (size_t i = 0; i < node->ext.typedefs_count; i++) + { + fzl_walk_res_t res = walk(walker, node->ext.typedefs[i]); + if (res.error) + return res; + } + + for (size_t i = 0; i < node->ext.fns_count; i++) + { + fzl_walk_res_t res = walk(walker, node->ext.fns[i]); + if (res.error) + return res; + } + + current_res = (fzl_walk_res_t){ + .error = false, .type = FZL_TYPE_NULL, .classname = NULL}; + break; + case FZL_NODETYPE_EXTERN_FN: // TODO: write to meta case FZL_NODETYPE_REFERENCE: // TODO: write to meta case FZL_NODETYPE_STRUCT: // TODO: write to meta