[examples] more robust array index checker in the type example

This commit is contained in:
Allen Webster
2021-10-09 11:59:06 -07:00
parent 2a6bf65f13
commit 5a6ad0a770
4 changed files with 38 additions and 17 deletions
@@ -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)
{
@@ -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;
+28 -7
View File
@@ -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,
+3 -3
View File
@@ -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);