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