diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index d7f53b6..3f1f2e0 100644 --- a/examples/type_metadata/generated/meta_types.c +++ b/examples/type_metadata/generated/meta_types.c @@ -1,4 +1,4 @@ -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:193 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:197 TypeInfoMember Circle_members[2] = { {"r", 1, -1, &F32_type_info}, {"pos", 3, -1, &V2F32_type_info}, @@ -14,10 +14,19 @@ TypeInfoMember RoundedPolygon_members[3] = { {"p", 1, 1, &V2F32_type_info}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:232 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:236 TypeInfoEnumerant Shape_members[3] = { {"Circle", 6, 1}, {"Segment", 7, 2}, {"Polygon", 7, 3}, }; +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:272 +TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 0, 0, 0}; +TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 0, 0, 0}; +TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 0, 0, 0}; +TypeInfo Circle_type_info = {TypeKind_Struct, "Circle", 6, 2, &Circle_members, 0}; +TypeInfo RoundedSegment_type_info = {TypeKind_Struct, "RoundedSegment", 14, 3, &RoundedSegment_members, 0}; +TypeInfo RoundedPolygon_type_info = {TypeKind_Struct, "RoundedPolygon", 14, 3, &RoundedPolygon_members, 0}; +TypeInfo Shape_type_info = {TypeKind_Enum, "Shape", 5, 3, &Shape_members, 0}; + diff --git a/examples/type_metadata/generated/meta_types.h b/examples/type_metadata/generated/meta_types.h index 185c06a..3499db4 100644 --- a/examples/type_metadata/generated/meta_types.h +++ b/examples/type_metadata/generated/meta_types.h @@ -1,6 +1,6 @@ #if !defined(META_TYPES_H) #define META_TYPES_H -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:93 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:97 typedef struct Circle Circle; struct Circle { @@ -28,11 +28,11 @@ Shape_Segment = 2, Shape_Polygon = 3, } Shape; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:152 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:156 TypeInfo* type_info_from_shape(Shape v); U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:177 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:181 extern TypeInfo U32_type_info; extern TypeInfo F32_type_info; extern TypeInfo V2F32_type_info; diff --git a/examples/type_metadata/type_info.h b/examples/type_metadata/type_info.h index 1e60216..251b9b0 100644 --- a/examples/type_metadata/type_info.h +++ b/examples/type_metadata/type_info.h @@ -36,6 +36,8 @@ struct TypeInfo // struct: TypeInfoMember* // enum: TypeInfoMember* void *children; + // enum + TypeInfo *underlying_type; }; typedef struct TypeInfoMember TypeInfoMember; diff --git a/examples/type_metadata/type_metadata.c b/examples/type_metadata/type_metadata.c index 94bb3dd..5eb2aff 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -31,15 +31,19 @@ struct TypeInfo TypeKind kind; MD_Node *node; - // member list + // basic + int size; + + // structs struct TypeMember *first_member; struct TypeMember *last_member; int member_count; - // enumerant list + // enums struct TypeEnumerant *first_enumerant; struct TypeEnumerant *last_enumerant; int enumerant_count; + TypeInfo *underlying_type; }; typedef struct TypeMember TypeMember; @@ -260,6 +264,66 @@ generate_enum_member_tables_from_types(FILE *out, TypeInfo *first_type) fprintf(out, "\n"); } +void +generate_type_info_definitions_from_types(FILE *out, TypeInfo *first_type) +{ + MD_ArenaTemp scratch = MD_GetScratch(0, 0); + + MD_PrintGenNoteCComment(out); + + for (TypeInfo *type = first_type; + type != 0; + type = type->next) + { + MD_String8 type_name = type->node->string; + + switch (type->kind) + { + default:break; + + case TypeKind_Basic: + { + int size = type->size; + fprintf(out, "TypeInfo %.*s_type_info = " + "{TypeKind_Basic, \"%.*s\", %d, %d, 0, 0};\n", + MD_S8VArg(type_name), + MD_S8VArg(type_name), (int)type_name.size, size); + }break; + + case TypeKind_Struct: + { + int child_count = type->member_count; + fprintf(out, "TypeInfo %.*s_type_info = " + "{TypeKind_Struct, \"%.*s\", %d, %d, %.*s_members, 0};\n", + MD_S8VArg(type_name), + MD_S8VArg(type_name), (int)type_name.size, child_count, MD_S8VArg(type_name)); + }break; + + case TypeKind_Enum: + { + MD_String8 underlying_type_ptr_expression = MD_S8Lit("0"); + if (type->underlying_type != 0) + { + MD_String8 underlying_type_name = type->underlying_type->node->string; + underlying_type_ptr_expression = MD_S8Fmt(scratch.arena, "&%.*s_type_info", + MD_S8VArg(underlying_type_name)); + } + + int child_count = type->enumerant_count; + fprintf(out, "TypeInfo %.*s_type_info = " + "{TypeKind_Enum, \"%.*s\", %d, %d, %.*s_members, %.*s};\n", + MD_S8VArg(type_name), + MD_S8VArg(type_name), (int)type_name.size, child_count, MD_S8VArg(type_name), + MD_S8VArg(underlying_type_ptr_expression)); + }break; + } + } + + fprintf(out, "\n"); + + MD_ReleaseScratch(scratch); +} + //~ main ////////////////////////////////////////////////////////////////////// @@ -411,6 +475,8 @@ main(int argc, char **argv) // TODO no duplicate member names check + // TODO basic type sizes + // build member lists for (TypeInfo *type = first_type; type != 0; @@ -503,6 +569,8 @@ main(int argc, char **argv) } } + // TODO check enum base types + // build enumerant lists for (TypeInfo *type = first_type; type != 0; @@ -510,6 +578,7 @@ main(int argc, char **argv) { if (type->kind == TypeKind_Enum) { + // build the list MD_b32 got_list = 1; TypeEnumerant *first_enumerant = 0; @@ -598,6 +667,7 @@ main(int argc, char **argv) // generate metadata tables generate_struct_member_tables_from_types(c, first_type); generate_enum_member_tables_from_types(c, first_type); + generate_type_info_definitions_from_types(c, first_type); // TODO generate function definitions