From 9aad622357a8197611a1a96a1cbf65c595caf525 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 25 Sep 2021 20:21:08 -0700 Subject: [PATCH] [examples] type info: basic type sizes; also get rid of redundant parameters --- examples/type_metadata/generated/meta_types.c | 12 +-- examples/type_metadata/generated/meta_types.h | 6 +- examples/type_metadata/type_metadata.c | 92 ++++++++++++------- examples/type_metadata/type_metadata.h | 16 ++-- 4 files changed, 79 insertions(+), 47 deletions(-) diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index 594cfe5..aa99528 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:414 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:457 TypeInfoMember Circle_members[2] = { {"r", 1, -1, &F32_type_info}, {"pos", 3, -1, &V2F32_type_info}, @@ -14,17 +14,17 @@ TypeInfoMember RoundedPolygon_members[3] = { {"p", 1, 1, &V2F32_type_info}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:453 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:496 TypeInfoEnumerant Shape_members[3] = { {"Circle", 6, 1}, {"Segment", 7, 2}, {"Polygon", 7, 3}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:489 -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}; +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:532 +TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 4, 0, 0}; +TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 4, 0, 0}; +TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 8, 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}; diff --git a/examples/type_metadata/generated/meta_types.h b/examples/type_metadata/generated/meta_types.h index b8d0cae..2b8a9cd 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:314 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:357 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:373 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:416 TypeInfo* type_info_from_shape(Shape v); U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:398 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:441 extern TypeInfo U32_type_info; extern TypeInfo F32_type_info; extern TypeInfo V2F32_type_info; diff --git a/examples/type_metadata/type_metadata.c b/examples/type_metadata/type_metadata.c index 3b6b6a4..4e25256 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -142,7 +142,50 @@ gen_gather_types_and_maps(MD_Node *list) } void -gen_gather_struct_members(void) +gen_equip_basic_type_sizes(void) +{ + for (GEN_TypeInfo *type = first_type; + type != 0; + type = type->next) + { + if (type->kind == GEN_TypeKind_Basic) + { + // extract the size + int size = 0; + + MD_Node *size_node = type->node->first_child; + MD_Node *error_at = 0; + if (MD_NodeIsNil(size_node)) + { + error_at = type->node; + } + else + { + MD_String8 size_string = size_node->string; + if (!MD_StringIsCStyleInt(size_string)) + { + error_at = size_node; + } + else + { + size = (int)MD_CStyleIntFromString(size_string); + } + } + if (error_at != 0) + { + MD_CodeLoc loc = MD_CodeLocFromNode(error_at); + MD_PrintMessage(error_file, loc, MD_MessageKind_Error, + MD_S8Lit("a basic type requires a plain integer size specifier")); + } + + // save the size + type->size = size; + } + } +} + +void +gen_equip_struct_members(void) { for (GEN_TypeInfo *type = first_type; type != 0; @@ -237,7 +280,7 @@ gen_gather_struct_members(void) } void -gen_gather_enum_members(void) +gen_equip_enum_members(void) { for (GEN_TypeInfo *type = first_type; type != 0; @@ -309,7 +352,7 @@ gen_gather_enum_members(void) //~ generators //////////////////////////////////////////////////////////////// void -gen_type_definitions_from_types(FILE *out, GEN_TypeInfo *first_type) +gen_type_definitions_from_types(FILE *out) { MD_PrintGenNoteCComment(out); @@ -368,7 +411,7 @@ gen_type_definitions_from_types(FILE *out, GEN_TypeInfo *first_type) } void -gen_function_declarations_from_maps(FILE *out, GEN_MapInfo *first_map) +gen_function_declarations_from_maps(FILE *out) { MD_PrintGenNoteCComment(out); @@ -393,7 +436,7 @@ gen_function_declarations_from_maps(FILE *out, GEN_MapInfo *first_map) } void -gen_type_info_declarations_from_types(FILE *out, GEN_TypeInfo *first_type) +gen_type_info_declarations_from_types(FILE *out) { MD_PrintGenNoteCComment(out); @@ -409,7 +452,7 @@ gen_type_info_declarations_from_types(FILE *out, GEN_TypeInfo *first_type) } void -gen_struct_member_tables_from_types(FILE *out, GEN_TypeInfo *first_type) +gen_struct_member_tables_from_types(FILE *out) { MD_PrintGenNoteCComment(out); @@ -448,7 +491,7 @@ gen_struct_member_tables_from_types(FILE *out, GEN_TypeInfo *first_type) } void -gen_enum_member_tables_from_types(FILE *out, GEN_TypeInfo *first_type) +gen_enum_member_tables_from_types(FILE *out) { MD_PrintGenNoteCComment(out); @@ -482,7 +525,7 @@ gen_enum_member_tables_from_types(FILE *out, GEN_TypeInfo *first_type) } void -gen_type_info_definitions_from_types(FILE *out, GEN_TypeInfo *first_type) +gen_type_info_definitions_from_types(FILE *out) { MD_ArenaTemp scratch = MD_GetScratch(0, 0); @@ -585,21 +628,14 @@ main(int argc, char **argv) type_map = MD_MapMake(arena); map_map = MD_MapMake(arena); - // gather types & maps + // analysis phase gen_gather_types_and_maps(list); - // TODO no duplicate member names check - // TODO basic type sizes - - // build member lists - gen_gather_struct_members(); - + gen_equip_basic_type_sizes(); + gen_equip_struct_members(); // TODO check enum base types - - // build enumerant lists - gen_gather_enum_members(); - + gen_equip_enum_members(); // TODO check maps & build case lists // generate meta types header @@ -608,14 +644,9 @@ main(int argc, char **argv) fprintf(h, "#if !defined(META_TYPES_H)\n"); fprintf(h, "#define META_TYPES_H\n"); - // generate type definitions - gen_type_definitions_from_types(h, first_type); - - // generate function declarations - gen_function_declarations_from_maps(h, first_map); - - // generate metadata declarations - gen_type_info_declarations_from_types(h, first_type); + gen_type_definitions_from_types(h); + gen_function_declarations_from_maps(h); + gen_type_info_declarations_from_types(h); fprintf(h, "#endif // META_TYPES_H\n"); fclose(h); @@ -626,10 +657,9 @@ main(int argc, char **argv) // open output file FILE *c = fopen("meta_types.c", "wb"); - // generate metadata tables - gen_struct_member_tables_from_types(c, first_type); - gen_enum_member_tables_from_types(c, first_type); - gen_type_info_definitions_from_types(c, first_type); + gen_struct_member_tables_from_types(c); + gen_enum_member_tables_from_types(c); + gen_type_info_definitions_from_types(c); // TODO generate function definitions diff --git a/examples/type_metadata/type_metadata.h b/examples/type_metadata/type_metadata.h index 3e4456b..5bf5daf 100644 --- a/examples/type_metadata/type_metadata.h +++ b/examples/type_metadata/type_metadata.h @@ -72,15 +72,17 @@ MD_Node* gen_get_md_child_value(MD_Node *parent, MD_String8 child_name); //~ analyzers ///////////////////////////////////////////////////////////////// void gen_gather_types_and_maps(MD_Node *list); -void gen_gather_struct_members(void); +void gen_equip_basic_type_sizes(void); +void gen_equip_struct_members(void); +void gen_equip_enum_members(void); //~ generators //////////////////////////////////////////////////////////////// -void gen_type_definitions_from_types(FILE *out, GEN_TypeInfo *first_type); -void gen_function_declarations_from_maps(FILE *out, GEN_MapInfo *first_map); -void gen_type_info_declarations_from_types(FILE *out, GEN_TypeInfo *first_type); -void gen_struct_member_tables_from_types(FILE *out, GEN_TypeInfo *first_type); -void gen_enum_member_tables_from_types(FILE *out, GEN_TypeInfo *first_type); -void gen_type_info_definitions_from_types(FILE *out, GEN_TypeInfo *first_type); +void gen_type_definitions_from_types(FILE *out); +void gen_function_declarations_from_maps(FILE *out); +void gen_type_info_declarations_from_types(FILE *out); +void gen_struct_member_tables_from_types(FILE *out); +void gen_enum_member_tables_from_types(FILE *out); +void gen_type_info_definitions_from_types(FILE *out); #endif //TYPE_METADATA_H