Generating comprehensive type infos
This commit is contained in:
30
ccodegen.cpp
30
ccodegen.cpp
@@ -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("},");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
types.h
2
types.h
@@ -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>";
|
||||||
|
|||||||
Reference in New Issue
Block a user