From 5a6ad0a770c58e50c30a28162291ae57ea3af50e Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 9 Oct 2021 11:59:06 -0700 Subject: [PATCH] [examples] more robust array index checker in the type example --- examples/type_metadata/generated/meta_types.c | 8 ++--- examples/type_metadata/generated/meta_types.h | 6 ++-- examples/type_metadata/type_metadata.c | 35 +++++++++++++++---- examples/type_metadata/type_metadata.h | 6 ++-- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index a5eb56c..6b477b7 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:914 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:949 TypeInfoMember Circle_members[2] = { {"r", 1, -1, &F32_type_info}, {"pos", 3, -1, &V2F32_type_info}, @@ -14,14 +14,14 @@ TypeInfoMember RoundedPolygon_members[3] = { {"p", 1, 1, &V2F32_type_info}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:953 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:988 TypeInfoEnumerant Shape_members[3] = { {"Circle", 6, 1}, {"Segment", 7, 2}, {"Polygon", 7, 3}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:989 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1024 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}; @@ -30,7 +30,7 @@ TypeInfo RoundedSegment_type_info = {TypeKind_Struct, "RoundedSegment", 14, 3, R TypeInfo RoundedPolygon_type_info = {TypeKind_Struct, "RoundedPolygon", 14, 3, RoundedPolygon_members, 0}; TypeInfo Shape_type_info = {TypeKind_Enum, "Shape", 5, 3, Shape_members, &U32_type_info}; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1049 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1084 TypeInfo* type_info_from_shape(Shape v) { diff --git a/examples/type_metadata/generated/meta_types.h b/examples/type_metadata/generated/meta_types.h index b969a2c..d032e68 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:791 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:826 typedef struct Circle Circle; struct Circle { @@ -29,11 +29,11 @@ Shape_Segment = 2, Shape_Polygon = 3, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:875 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:910 TypeInfo* type_info_from_shape(Shape v); U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:898 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:933 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 4cc32bf..4ce43df 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -349,7 +349,7 @@ gen_equip_struct_members(void) // resolved type: if (got_list) { - MD_Node *array_count = MD_NilNode(); + GEN_TypeMember *array_count = 0; MD_Node *array_tag = MD_TagFromString(type_name_node, MD_S8Lit("array"), 0); if (!MD_NodeIsNil(array_tag)) { @@ -362,14 +362,35 @@ gen_equip_struct_members(void) } else { - array_count = MD_ChildFromString(type_root_node, array_count_referencer->string, 0); - if (MD_NodeIsNil(array_count)) + MD_Node *array_count_member_node = + MD_ChildFromString(type_root_node, array_count_referencer->string, 0); + if (MD_NodeIsNil(array_count_member_node)) { MD_CodeLoc loc = MD_CodeLocFromNode(array_count_referencer); MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error, "'%.*s' is not a member of %.*s", MD_S8VArg(array_count_referencer->string), MD_S8VArg(type_name)); } + else + { + for (GEN_TypeMember *member_it = first_member; + member_it != 0; + member_it = member_it->next) + { + if (member_it->node == array_count_member_node) + { + array_count = member_it; + break; + } + } + if (array_count == 0) + { + MD_CodeLoc loc = MD_CodeLocFromNode(array_count_referencer); + MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error, + "'%.*s' comes after this array", + MD_S8VArg(array_count_referencer->string), MD_S8VArg(type_name)); + } + } } } @@ -377,6 +398,7 @@ gen_equip_struct_members(void) member->node = member_node; member->type = type_info; member->array_count = array_count; + member->member_index = member_count; MD_QueuePush(first_member, last_member, member); member_count += 1; } @@ -824,8 +846,7 @@ gen_type_definitions_from_types(FILE *out) { MD_String8 type_name = member->type->node->string; MD_String8 member_name = member->node->string; - int is_array = (!MD_NodeIsNil(member->array_count)); - if (is_array) + if (member->array_count != 0) { fprintf(out, "%.*s *%.*s;\n", MD_S8VArg(type_name), MD_S8VArg(member_name)); } @@ -945,9 +966,9 @@ gen_struct_member_tables_from_types(FILE *out) MD_String8 member_name = member->node->string; MD_String8 member_type_name = member->type->node->string; int array_count_member_index = -1; - if (!MD_NodeIsNil(member->array_count)) + if (member->array_count != 0) { - array_count_member_index = MD_IndexFromNode(member->array_count); + array_count_member_index = member->array_count->member_index; } fprintf(out, "{\"%.*s\", %d, %d, &%.*s_type_info},\n", MD_S8VArg(member_name), (int)member_name.size, diff --git a/examples/type_metadata/type_metadata.h b/examples/type_metadata/type_metadata.h index 353526b..5cfbc9c 100644 --- a/examples/type_metadata/type_metadata.h +++ b/examples/type_metadata/type_metadata.h @@ -47,7 +47,9 @@ struct GEN_TypeMember GEN_TypeMember *next; MD_Node *node; GEN_TypeInfo *type; - MD_Node *array_count; + struct GEN_TypeMember *array_count; + //MD_Node *array_count; + int member_index; }; typedef struct GEN_TypeEnumerant GEN_TypeEnumerant; @@ -120,8 +122,6 @@ void gen_equip_map_cases(void); void gen_check_duplicate_cases(void); void gen_check_complete_map_cases(void); -// TODO: check array member indexes point to members from before the array - //~ generators //////////////////////////////////////////////////////////////// void gen_type_definitions_from_types(FILE *out); void gen_function_declarations_from_maps(FILE *out);