Generating comprehensive type infos

This commit is contained in:
Krzosa Karol
2022-06-18 16:24:54 +02:00
parent e63dc0322a
commit 649f37cb1b
5 changed files with 45 additions and 14 deletions

View File

@@ -825,19 +825,39 @@ typedef struct String{
} }
#if 1 #if 1
gen("Type_Info type_infos[] = {"); gen("Type_Info *type_infos = (Type_Info[]){");
global_indent++; global_indent++;
For(pctx->all_types){ 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); (S32)it->kind, (S32)it->size, (S32)it->align, it->is_unsigned ? "true" : "false", it->type_id);
switch(it->kind){ switch(it->kind){
case TYPE_POINTER: { case TYPE_POINTER:
gen(".base = %d", it->base->type_id); case TYPE_SLICE: {
gen(".base_type = %d", it->base->type_id);
} break; } break;
case TYPE_ARRAY: { 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); gen(".array_size = %d", it->arr.size);
}break; }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; // invalid_default_case;
} }
gen("},"); gen("},");

View File

@@ -196,6 +196,7 @@ struct Parse_Ctx:Lexer{
S64 indent; S64 indent;
String_Builder gen; String_Builder gen;
String_Builder helper_builder;
}; };
global B32 emit_line_directives; 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->type_map = {ctx->heap};
ctx->modules = {ctx->heap}; ctx->modules = {ctx->heap};
ctx->all_types = {ctx->heap}; ctx->all_types = {ctx->heap};
ctx->helper_builder= {ctx->heap};
bigint_allocator = ctx->perm; bigint_allocator = ctx->perm;
arena_init(&ctx->stage_arena, "Compiler stage arena"_s); arena_init(&ctx->stage_arena, "Compiler stage arena"_s);

View File

@@ -47,9 +47,9 @@ Any :: struct
data: *void data: *void
type: Type_ID type: Type_ID
Type_Info_Struct_Field :: struct Type_Info_Struct_Member :: struct
name: String name: String
type: Type_ID type_id: Type_ID
offset: S32 offset: S32
Type_Info :: struct Type_Info :: struct
@@ -62,7 +62,10 @@ Type_Info :: struct
base_type: Type_ID base_type: Type_ID
array_size: S32 array_size: S32
struct_member_count: 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_len: U32 #foreign
type_infos : *Type_Info #foreign type_infos : *Type_Info #foreign

View File

@@ -17,7 +17,11 @@ typename_base(String_Builder *sb, Ast_Type *type){
break; break;
case TYPE_LAMBDA: case TYPE_LAMBDA:
sb->addf("("); 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("):"); sb->addf("):");
typename_base(sb, type->func.ret); typename_base(sb, type->func.ret);
break; break;
@@ -49,11 +53,11 @@ typename_base(String_Builder *sb, Ast_Type *type){
function String function String
get_typename(Allocator *a, Ast_Type *type){ get_typename(Allocator *a, Ast_Type *type){
pctx->gen.addf("["); pctx->helper_builder.addf("[");
typename_base(&pctx->gen, type); typename_base(&pctx->helper_builder, type);
pctx->gen.addf("]"); pctx->helper_builder.addf("]");
String result = string_flatten(a, &pctx->gen); String result = string_flatten(a, &pctx->helper_builder);
pctx->gen.reset(); pctx->helper_builder.reset();
return result; return result;
} }

View File

@@ -122,6 +122,8 @@ name(Ast_Type *type){
case TYPE_U16: return "U16"; case TYPE_U16: return "U16";
case TYPE_U32: return "U32"; case TYPE_U32: return "U32";
case TYPE_U64: return "U64"; case TYPE_U64: return "U64";
case TYPE_ANY: return "Any";
case TYPE_TUPLE: return "Tuple";
invalid_default_case; invalid_default_case;
} }
return "<unknown_type>"; return "<unknown_type>";