mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-07 16:18:49 +00:00
[examples] more robust array index checker in the type example
This commit is contained in:
@@ -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] = {
|
TypeInfoMember Circle_members[2] = {
|
||||||
{"r", 1, -1, &F32_type_info},
|
{"r", 1, -1, &F32_type_info},
|
||||||
{"pos", 3, -1, &V2F32_type_info},
|
{"pos", 3, -1, &V2F32_type_info},
|
||||||
@@ -14,14 +14,14 @@ TypeInfoMember RoundedPolygon_members[3] = {
|
|||||||
{"p", 1, 1, &V2F32_type_info},
|
{"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] = {
|
TypeInfoEnumerant Shape_members[3] = {
|
||||||
{"Circle", 6, 1},
|
{"Circle", 6, 1},
|
||||||
{"Segment", 7, 2},
|
{"Segment", 7, 2},
|
||||||
{"Polygon", 7, 3},
|
{"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 U32_type_info = {TypeKind_Basic, "U32", 3, 4, 0, 0};
|
||||||
TypeInfo F32_type_info = {TypeKind_Basic, "F32", 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 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 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};
|
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*
|
TypeInfo*
|
||||||
type_info_from_shape(Shape v)
|
type_info_from_shape(Shape v)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#if !defined(META_TYPES_H)
|
#if !defined(META_TYPES_H)
|
||||||
#define 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;
|
typedef struct Circle Circle;
|
||||||
struct Circle
|
struct Circle
|
||||||
{
|
{
|
||||||
@@ -29,11 +29,11 @@ Shape_Segment = 2,
|
|||||||
Shape_Polygon = 3,
|
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);
|
TypeInfo* type_info_from_shape(Shape v);
|
||||||
U32 max_slot_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 U32_type_info;
|
||||||
extern TypeInfo F32_type_info;
|
extern TypeInfo F32_type_info;
|
||||||
extern TypeInfo V2F32_type_info;
|
extern TypeInfo V2F32_type_info;
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ gen_equip_struct_members(void)
|
|||||||
// resolved type:
|
// resolved type:
|
||||||
if (got_list)
|
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);
|
MD_Node *array_tag = MD_TagFromString(type_name_node, MD_S8Lit("array"), 0);
|
||||||
if (!MD_NodeIsNil(array_tag))
|
if (!MD_NodeIsNil(array_tag))
|
||||||
{
|
{
|
||||||
@@ -362,14 +362,35 @@ gen_equip_struct_members(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
array_count = MD_ChildFromString(type_root_node, array_count_referencer->string, 0);
|
MD_Node *array_count_member_node =
|
||||||
if (MD_NodeIsNil(array_count))
|
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_CodeLoc loc = MD_CodeLocFromNode(array_count_referencer);
|
||||||
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
||||||
"'%.*s' is not a member of %.*s",
|
"'%.*s' is not a member of %.*s",
|
||||||
MD_S8VArg(array_count_referencer->string), MD_S8VArg(type_name));
|
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->node = member_node;
|
||||||
member->type = type_info;
|
member->type = type_info;
|
||||||
member->array_count = array_count;
|
member->array_count = array_count;
|
||||||
|
member->member_index = member_count;
|
||||||
MD_QueuePush(first_member, last_member, member);
|
MD_QueuePush(first_member, last_member, member);
|
||||||
member_count += 1;
|
member_count += 1;
|
||||||
}
|
}
|
||||||
@@ -824,8 +846,7 @@ gen_type_definitions_from_types(FILE *out)
|
|||||||
{
|
{
|
||||||
MD_String8 type_name = member->type->node->string;
|
MD_String8 type_name = member->type->node->string;
|
||||||
MD_String8 member_name = member->node->string;
|
MD_String8 member_name = member->node->string;
|
||||||
int is_array = (!MD_NodeIsNil(member->array_count));
|
if (member->array_count != 0)
|
||||||
if (is_array)
|
|
||||||
{
|
{
|
||||||
fprintf(out, "%.*s *%.*s;\n", MD_S8VArg(type_name), MD_S8VArg(member_name));
|
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_name = member->node->string;
|
||||||
MD_String8 member_type_name = member->type->node->string;
|
MD_String8 member_type_name = member->type->node->string;
|
||||||
int array_count_member_index = -1;
|
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",
|
fprintf(out, "{\"%.*s\", %d, %d, &%.*s_type_info},\n",
|
||||||
MD_S8VArg(member_name), (int)member_name.size,
|
MD_S8VArg(member_name), (int)member_name.size,
|
||||||
|
|||||||
@@ -47,7 +47,9 @@ struct GEN_TypeMember
|
|||||||
GEN_TypeMember *next;
|
GEN_TypeMember *next;
|
||||||
MD_Node *node;
|
MD_Node *node;
|
||||||
GEN_TypeInfo *type;
|
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;
|
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_duplicate_cases(void);
|
||||||
void gen_check_complete_map_cases(void);
|
void gen_check_complete_map_cases(void);
|
||||||
|
|
||||||
// TODO: check array member indexes point to members from before the array
|
|
||||||
|
|
||||||
//~ generators ////////////////////////////////////////////////////////////////
|
//~ generators ////////////////////////////////////////////////////////////////
|
||||||
void gen_type_definitions_from_types(FILE *out);
|
void gen_type_definitions_from_types(FILE *out);
|
||||||
void gen_function_declarations_from_maps(FILE *out);
|
void gen_function_declarations_from_maps(FILE *out);
|
||||||
|
|||||||
Reference in New Issue
Block a user