diff --git a/ccodegen.cpp b/ccodegen.cpp index 1aee7f2..6082b67 100644 --- a/ccodegen.cpp +++ b/ccodegen.cpp @@ -825,19 +825,39 @@ typedef struct String{ } #if 1 - gen("Type_Info type_infos[] = {"); + gen("Type_Info *type_infos = (Type_Info[]){"); global_indent++; For(pctx->all_types){ - genln("{.kind = %d, .size = %d, .align = %d, .is_unsigned = %s, .type_id = %d, ", + genln("{/*%Q*/.kind = %d, .size = %d, .align = %d, .is_unsigned = %s, .type_id = %d, ", typestring(it), (S32)it->kind, (S32)it->size, (S32)it->align, it->is_unsigned ? "true" : "false", it->type_id); switch(it->kind){ - case TYPE_POINTER: { - gen(".base = %d", it->base->type_id); + case TYPE_POINTER: + case TYPE_SLICE: { + gen(".base_type = %d", it->base->type_id); } break; case TYPE_ARRAY: { - gen(".base = %d, ", it->base->type_id); + gen(".base_type = %d, ", it->base->type_id); gen(".array_size = %d", it->arr.size); }break; + case TYPE_LAMBDA: { + gen(".lambda_return = %d, ", it->func.ret->type_id); + gen(".lambda_argument_count = %d, ", it->func.args.len); + gen(".lambda_arguments = (Type_Info[%d]){", it->func.args.len); + For_Named(it->func.args, arg){ + gen("{.type_id = %d}, ", arg->type_id); + } + gen("}"); + } break; + case TYPE_STRUCT:{ + gen(".struct_member_count = %d, ", it->agg.members.len); + gen(".struct_members = (Type_Info_Struct_Member[]){"); + For_Named(it->agg.members, m){ + gen("{.name = LIT(\"%Q\"), .type_id = %d, .offset = %d}, ", m.name, m.type->type_id, m.offset); + + } + gen("}"); + }break; + default: {} // invalid_default_case; } gen("},"); diff --git a/compiler.h b/compiler.h index bf0d9b8..9a69571 100644 --- a/compiler.h +++ b/compiler.h @@ -196,6 +196,7 @@ struct Parse_Ctx:Lexer{ S64 indent; String_Builder gen; + String_Builder helper_builder; }; global B32 emit_line_directives; @@ -245,6 +246,7 @@ parse_init(Parse_Ctx *ctx, Allocator *perm_allocator, Allocator *heap_allocator) ctx->type_map = {ctx->heap}; ctx->modules = {ctx->heap}; ctx->all_types = {ctx->heap}; + ctx->helper_builder= {ctx->heap}; bigint_allocator = ctx->perm; arena_init(&ctx->stage_arena, "Compiler stage arena"_s); diff --git a/programs/main.kl b/programs/main.kl index 42cf705..720f04d 100644 --- a/programs/main.kl +++ b/programs/main.kl @@ -47,9 +47,9 @@ Any :: struct data: *void type: Type_ID -Type_Info_Struct_Field :: struct +Type_Info_Struct_Member :: struct name: String - type: Type_ID + type_id: Type_ID offset: S32 Type_Info :: struct @@ -62,7 +62,10 @@ Type_Info :: struct base_type: Type_ID array_size: S32 struct_member_count: S32 - fields: *Type_Info_Struct_Field + struct_members: *Type_Info_Struct_Member + lambda_argument_count: S32 + lambda_arguments: *Type_Info + lambda_return: Type_ID type_infos_len: U32 #foreign type_infos : *Type_Info #foreign diff --git a/typechecking.cpp b/typechecking.cpp index e7ef308..65abc81 100644 --- a/typechecking.cpp +++ b/typechecking.cpp @@ -17,7 +17,11 @@ typename_base(String_Builder *sb, Ast_Type *type){ break; case TYPE_LAMBDA: sb->addf("("); - For(type->func.args) typename_base(sb, it); + For(type->func.args) { + typename_base(sb, it); + if(!type->func.args.is_last(&it)) sb->addf(", "); + } + sb->addf("):"); typename_base(sb, type->func.ret); break; @@ -49,11 +53,11 @@ typename_base(String_Builder *sb, Ast_Type *type){ function String get_typename(Allocator *a, Ast_Type *type){ - pctx->gen.addf("["); - typename_base(&pctx->gen, type); - pctx->gen.addf("]"); - String result = string_flatten(a, &pctx->gen); - pctx->gen.reset(); + pctx->helper_builder.addf("["); + typename_base(&pctx->helper_builder, type); + pctx->helper_builder.addf("]"); + String result = string_flatten(a, &pctx->helper_builder); + pctx->helper_builder.reset(); return result; } diff --git a/types.h b/types.h index f146d1d..1a3595e 100644 --- a/types.h +++ b/types.h @@ -122,6 +122,8 @@ name(Ast_Type *type){ case TYPE_U16: return "U16"; case TYPE_U32: return "U32"; case TYPE_U64: return "U64"; + case TYPE_ANY: return "Any"; + case TYPE_TUPLE: return "Tuple"; invalid_default_case; } return "";