eliminate ad-hoc meta eval info type tables; switch to base layer meta type info; do first pass of shifting serialization of meta evals to meta type info driven system

This commit is contained in:
Ryan Fleury
2024-09-18 15:57:01 -07:00
parent 7e5759ed03
commit 546e6e695f
16 changed files with 290 additions and 465 deletions
-66
View File
@@ -1,72 +1,6 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: Meta Evaluation Type Information
@table(name info_type eval_type dynamic_kind)
CTRL_MetaEvalMemberTable:
{
{enabled S32 S32 }
{frozen S32 S32 }
{hit_count U64 U64 }
{id U64 U64 }
{color U32 U32 }
{label String8 U64 String8 }
{location String8 U64 String8 }
{condition String8 U64 String8 }
{callstack CTRL_MetaEvalFrameArray U64 FrameArray }
}
@struct CTRL_MetaEvalFrameArray:
{
`U64 *frames`;
`U64 count`;
}
@enum CTRL_MetaEvalDynamicKind:
{
Null,
String8,
FrameArray,
COUNT
}
@struct CTRL_MetaEvalInfo:
{
@expand(CTRL_MetaEvalMemberTable a) `$(a.info_type) $(a.name)`
}
@struct CTRL_MetaEval:
{
@expand(CTRL_MetaEvalMemberTable a) `$(a.eval_type) $(a.name)`
}
@data(String8) ctrl_meta_eval_member_name_table:
{
@expand(CTRL_MetaEvalMemberTable a) `str8_lit_comp("$(a.name)")`
}
@data(Rng1U64) ctrl_meta_eval_info_member_range_table:
{
@expand(CTRL_MetaEvalMemberTable a) `{OffsetOf(CTRL_MetaEvalInfo, $(a.name)), OffsetOf(CTRL_MetaEvalInfo, $(a.name)) + sizeof($(a.info_type))}`
}
@data(Rng1U64) ctrl_meta_eval_member_range_table:
{
@expand(CTRL_MetaEvalMemberTable a) `{OffsetOf(CTRL_MetaEval, $(a.name)), OffsetOf(CTRL_MetaEval, $(a.name)) + sizeof($(a.eval_type))}`
}
@data(E_TypeKind) ctrl_meta_eval_member_type_kind_table:
{
@expand(CTRL_MetaEvalMemberTable a) `E_TypeKind_$(a.eval_type)`
}
@data(CTRL_MetaEvalDynamicKind) ctrl_meta_eval_member_dynamic_kind_table:
{
@expand(CTRL_MetaEvalMemberTable a) `$(a.dynamic_kind != '' -> 'CTRL_MetaEvalDynamicKind_'..a.dynamic_kind)$(a.dynamic_kind == '' -> 'CTRL_MetaEvalDynamicKind_Null')`
}
////////////////////////////////
//~ rjf: Entity Kinds
+9 -96
View File
@@ -185,68 +185,6 @@ ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src)
return dst;
}
////////////////////////////////
//~ rjf: Meta Evaluation Type Functions
internal CTRL_MetaEval *
ctrl_meta_eval_from_info(Arena *arena, CTRL_MetaEvalInfo *info)
{
CTRL_MetaEval *eval = push_array(arena, CTRL_MetaEval, 1);
{
for(U64 idx = 0; idx < ArrayCount(ctrl_meta_eval_info_member_range_table); idx += 1)
{
switch(ctrl_meta_eval_member_dynamic_kind_table[idx])
{
default:
case CTRL_MetaEvalDynamicKind_Null:
{
MemoryCopy((U8 *)eval + ctrl_meta_eval_member_range_table[idx].min,
(U8 *)info + ctrl_meta_eval_info_member_range_table[idx].min,
dim_1u64(ctrl_meta_eval_member_range_table[idx]));
}break;
case CTRL_MetaEvalDynamicKind_String8:
{
String8 string = *(String8 *)((U8 *)info + ctrl_meta_eval_info_member_range_table[idx].min);
String8 string_copy = push_str8_copy(arena, string);
U64 off = (string_copy.str - (U8 *)eval);
MemoryCopy((U8 *)eval + ctrl_meta_eval_member_range_table[idx].min, &off, sizeof(U64));
}break;
case CTRL_MetaEvalDynamicKind_FrameArray:
{
}break;
}
}
}
return eval;
}
internal CTRL_MetaEvalInfoArray
ctrl_meta_eval_info_array_copy(Arena *arena, CTRL_MetaEvalInfoArray *src)
{
CTRL_MetaEvalInfoArray dst = {0};
dst.count = src->count;
dst.v = push_array(arena, CTRL_MetaEvalInfo, dst.count);
MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count);
for(U64 idx = 0; idx < dst.count; idx += 1)
{
for(U64 member_idx = 0; member_idx < ArrayCount(ctrl_meta_eval_info_member_range_table); member_idx += 1)
{
switch(ctrl_meta_eval_member_dynamic_kind_table[member_idx])
{
default:{}break;
case CTRL_MetaEvalDynamicKind_String8:
{
String8 string = *(String8 *)((U8 *)(&dst.v[idx]) + ctrl_meta_eval_info_member_range_table[member_idx].min);
String8 string_copy = push_str8_copy(arena, string);
MemoryCopy((U8 *)(&dst.v[idx]) + ctrl_meta_eval_info_member_range_table[member_idx].min, &string_copy, sizeof(String8));
}break;
}
}
}
return dst;
}
////////////////////////////////
//~ rjf: Message Type Functions
@@ -262,7 +200,7 @@ ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src)
dst->env_string_list = str8_list_copy(arena, &src->env_string_list);
dst->traps = ctrl_trap_list_copy(arena, &src->traps);
dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps);
dst->meta_eval_infos = ctrl_meta_eval_info_array_copy(arena, &src->meta_eval_infos);
dst->meta_evals = *deep_copy_from_struct(arena, CTRL_MetaEvalArray, &src->meta_evals);
}
//- rjf: list building
@@ -386,6 +324,9 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs)
}
// rjf: write meta-eval-info array
String8 meta_evals_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEvalArray, &msg->meta_evals);
str8_serial_push_string(scratch.arena, &msgs_srlzed, meta_evals_srlzed);
#if 0
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->meta_eval_infos.count);
for(U64 idx = 0; idx < msg->meta_eval_infos.count; idx += 1)
{
@@ -408,6 +349,7 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs)
}
}
}
#endif
}
}
String8 string = str8_serial_end(arena, &msgs_srlzed);
@@ -521,6 +463,9 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string)
}
// rjf: read meta-eval-info array
String8 meta_evals_srlzed = str8_skip(string, read_off);
msg->meta_evals = *struct_from_serialized(arena, CTRL_MetaEvalArray, meta_evals_srlzed);
#if 0
read_off += str8_deserial_read_struct(string, read_off, &msg->meta_eval_infos.count);
msg->meta_eval_infos.v = push_array(arena, CTRL_MetaEvalInfo, msg->meta_eval_infos.count);
for(U64 idx = 0; idx < msg->meta_eval_infos.count; idx += 1)
@@ -547,6 +492,7 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string)
}
}
}
#endif
}
}
return msgs;
@@ -1259,39 +1205,6 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list)
}
}
////////////////////////////////
//~ rjf: Meta-Eval Functions
internal E_TypeKey
ctrl_meta_eval_type_key(void)
{
Temp scratch = scratch_begin(0, 0);
E_MemberList members = {0};
{
for(U64 idx = 0; idx < ArrayCount(ctrl_meta_eval_member_range_table); idx += 1)
{
E_TypeKey member_type_key = e_type_key_basic(ctrl_meta_eval_member_type_kind_table[idx]);
switch(ctrl_meta_eval_member_dynamic_kind_table[idx])
{
default:{}break;
case CTRL_MetaEvalDynamicKind_String8:
{
member_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8));
}break;
}
e_member_list_push_new(scratch.arena, &members, .name = ctrl_meta_eval_member_name_table[idx], .off = ctrl_meta_eval_member_range_table[idx].min, .type_key = member_type_key);
}
}
E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members);
E_TypeKey meta_eval_type_key = e_type_key_cons(.arch = arch_from_context(),
.kind = E_TypeKind_Struct,
.name = str8_lit("Meta"),
.members = members_array.v,
.count = members_array.count);
scratch_end(scratch);
return meta_eval_type_key;
}
////////////////////////////////
//~ rjf: Main Layer Initialization
+44 -29
View File
@@ -12,6 +12,49 @@ typedef U64 CTRL_MachineID;
#define CTRL_MachineID_Local (1)
////////////////////////////////
//~ rjf: Meta Evaluation Types
//- rjf: meta evaluation instance
typedef struct CTRL_MetaEval CTRL_MetaEval;
struct CTRL_MetaEval
{
#define CTRL_MetaEval_MemberXList \
X(B32, enabled)\
X(B32, frozen)\
X(U64, hit_count)\
X(U64, id)\
X(U32, color)\
X(String8, label)\
X(String8, location)\
X(String8, condition)
#define X(type, name) type name;
CTRL_MetaEval_MemberXList
#undef X
};
struct_members(CTRL_MetaEval)
{
#define X(type, name) member_lit_comp(CTRL_MetaEval, type, name),
CTRL_MetaEval_MemberXList
#undef X
};
struct_type(CTRL_MetaEval);
//- rjf: meta evaluation array
typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray;
struct CTRL_MetaEvalArray
{
CTRL_MetaEval *v;
U64 count;
};
ptr_type(CTRL_MetaEvalArray__v_ptr_type, type(CTRL_MetaEval), .count_delimiter_name = str8_lit_comp("count"));
struct_members(CTRL_MetaEvalArray)
{
{str8_lit_comp("v"), &CTRL_MetaEvalArray__v_ptr_type, OffsetOf(CTRL_MetaEvalArray, v)},
member_lit_comp(CTRL_MetaEvalArray, U64, count),
};
struct_type(CTRL_MetaEvalArray);
////////////////////////////////
//~ rjf: Entity Handle Types
@@ -253,23 +296,6 @@ struct CTRL_UserBreakpointList
U64 count;
};
////////////////////////////////
//~ rjf: Meta Evaluation Types
typedef struct CTRL_MetaEvalInfoArray CTRL_MetaEvalInfoArray;
struct CTRL_MetaEvalInfoArray
{
CTRL_MetaEvalInfo *v;
U64 count;
};
typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray;
struct CTRL_MetaEvalArray
{
CTRL_MetaEval *v;
U64 count;
};
////////////////////////////////
//~ rjf: Evaluation Spaces
@@ -324,7 +350,7 @@ struct CTRL_Msg
String8List env_string_list;
CTRL_TrapList traps;
CTRL_UserBreakpointList user_bps;
CTRL_MetaEvalInfoArray meta_eval_infos;
CTRL_MetaEvalArray meta_evals;
};
typedef struct CTRL_MsgNode CTRL_MsgNode;
@@ -709,12 +735,6 @@ internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src);
internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp);
internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src);
////////////////////////////////
//~ rjf: Meta Evaluation Type Functions
internal CTRL_MetaEval *ctrl_meta_eval_from_info(Arena *arena, CTRL_MetaEvalInfo *info);
internal CTRL_MetaEvalInfoArray ctrl_meta_eval_info_array_copy(Arena *arena, CTRL_MetaEvalInfoArray *src);
////////////////////////////////
//~ rjf: Message Type Functions
@@ -788,11 +808,6 @@ internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_En
//- rjf: applying events to entity caches
internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list);
////////////////////////////////
//~ rjf: Meta-Eval Functions
internal E_TypeKey ctrl_meta_eval_type_key(void);
////////////////////////////////
//~ rjf: Main Layer Initialization
-65
View File
@@ -4,71 +4,6 @@
//- GENERATED CODE
C_LINKAGE_BEGIN
String8 ctrl_meta_eval_member_name_table[9] =
{
str8_lit_comp("enabled"),
str8_lit_comp("frozen"),
str8_lit_comp("hit_count"),
str8_lit_comp("id"),
str8_lit_comp("color"),
str8_lit_comp("label"),
str8_lit_comp("location"),
str8_lit_comp("condition"),
str8_lit_comp("callstack"),
};
Rng1U64 ctrl_meta_eval_info_member_range_table[9] =
{
{OffsetOf(CTRL_MetaEvalInfo, enabled), OffsetOf(CTRL_MetaEvalInfo, enabled) + sizeof(S32)},
{OffsetOf(CTRL_MetaEvalInfo, frozen), OffsetOf(CTRL_MetaEvalInfo, frozen) + sizeof(S32)},
{OffsetOf(CTRL_MetaEvalInfo, hit_count), OffsetOf(CTRL_MetaEvalInfo, hit_count) + sizeof(U64)},
{OffsetOf(CTRL_MetaEvalInfo, id), OffsetOf(CTRL_MetaEvalInfo, id) + sizeof(U64)},
{OffsetOf(CTRL_MetaEvalInfo, color), OffsetOf(CTRL_MetaEvalInfo, color) + sizeof(U32)},
{OffsetOf(CTRL_MetaEvalInfo, label), OffsetOf(CTRL_MetaEvalInfo, label) + sizeof(String8)},
{OffsetOf(CTRL_MetaEvalInfo, location), OffsetOf(CTRL_MetaEvalInfo, location) + sizeof(String8)},
{OffsetOf(CTRL_MetaEvalInfo, condition), OffsetOf(CTRL_MetaEvalInfo, condition) + sizeof(String8)},
{OffsetOf(CTRL_MetaEvalInfo, callstack), OffsetOf(CTRL_MetaEvalInfo, callstack) + sizeof(CTRL_MetaEvalFrameArray)},
};
Rng1U64 ctrl_meta_eval_member_range_table[9] =
{
{OffsetOf(CTRL_MetaEval, enabled), OffsetOf(CTRL_MetaEval, enabled) + sizeof(S32)},
{OffsetOf(CTRL_MetaEval, frozen), OffsetOf(CTRL_MetaEval, frozen) + sizeof(S32)},
{OffsetOf(CTRL_MetaEval, hit_count), OffsetOf(CTRL_MetaEval, hit_count) + sizeof(U64)},
{OffsetOf(CTRL_MetaEval, id), OffsetOf(CTRL_MetaEval, id) + sizeof(U64)},
{OffsetOf(CTRL_MetaEval, color), OffsetOf(CTRL_MetaEval, color) + sizeof(U32)},
{OffsetOf(CTRL_MetaEval, label), OffsetOf(CTRL_MetaEval, label) + sizeof(U64)},
{OffsetOf(CTRL_MetaEval, location), OffsetOf(CTRL_MetaEval, location) + sizeof(U64)},
{OffsetOf(CTRL_MetaEval, condition), OffsetOf(CTRL_MetaEval, condition) + sizeof(U64)},
{OffsetOf(CTRL_MetaEval, callstack), OffsetOf(CTRL_MetaEval, callstack) + sizeof(U64)},
};
E_TypeKind ctrl_meta_eval_member_type_kind_table[9] =
{
E_TypeKind_S32,
E_TypeKind_S32,
E_TypeKind_U64,
E_TypeKind_U64,
E_TypeKind_U32,
E_TypeKind_U64,
E_TypeKind_U64,
E_TypeKind_U64,
E_TypeKind_U64,
};
CTRL_MetaEvalDynamicKind ctrl_meta_eval_member_dynamic_kind_table[9] =
{
CTRL_MetaEvalDynamicKind_Null,
CTRL_MetaEvalDynamicKind_Null,
CTRL_MetaEvalDynamicKind_Null,
CTRL_MetaEvalDynamicKind_Null,
CTRL_MetaEvalDynamicKind_Null,
CTRL_MetaEvalDynamicKind_String8,
CTRL_MetaEvalDynamicKind_String8,
CTRL_MetaEvalDynamicKind_String8,
CTRL_MetaEvalDynamicKind_FrameArray,
};
String8 ctrl_entity_kind_display_string_table[8] =
{
{0},
-48
View File
@@ -6,14 +6,6 @@
#ifndef CTRL_META_H
#define CTRL_META_H
typedef enum CTRL_MetaEvalDynamicKind
{
CTRL_MetaEvalDynamicKind_Null,
CTRL_MetaEvalDynamicKind_String8,
CTRL_MetaEvalDynamicKind_FrameArray,
CTRL_MetaEvalDynamicKind_COUNT,
} CTRL_MetaEvalDynamicKind;
typedef enum CTRL_EntityKind
{
CTRL_EntityKind_Null,
@@ -70,47 +62,7 @@ CTRL_ExceptionCodeKind_Win32DirectXDebugLayer,
CTRL_ExceptionCodeKind_COUNT,
} CTRL_ExceptionCodeKind;
typedef struct CTRL_MetaEvalFrameArray CTRL_MetaEvalFrameArray;
struct CTRL_MetaEvalFrameArray
{
U64 *frames;
U64 count;
};
typedef struct CTRL_MetaEvalInfo CTRL_MetaEvalInfo;
struct CTRL_MetaEvalInfo
{
S32 enabled;
S32 frozen;
U64 hit_count;
U64 id;
U32 color;
String8 label;
String8 location;
String8 condition;
CTRL_MetaEvalFrameArray callstack;
};
typedef struct CTRL_MetaEval CTRL_MetaEval;
struct CTRL_MetaEval
{
S32 enabled;
S32 frozen;
U64 hit_count;
U64 id;
U32 color;
U64 label;
U64 location;
U64 condition;
U64 callstack;
};
C_LINKAGE_BEGIN
extern String8 ctrl_meta_eval_member_name_table[9];
extern Rng1U64 ctrl_meta_eval_info_member_range_table[9];
extern Rng1U64 ctrl_meta_eval_member_range_table[9];
extern E_TypeKind ctrl_meta_eval_member_type_kind_table[9];
extern CTRL_MetaEvalDynamicKind ctrl_meta_eval_member_dynamic_kind_table[9];
extern String8 ctrl_entity_kind_display_string_table[8];
extern U32 ctrl_exception_code_kind_code_table[38];
extern String8 ctrl_exception_code_kind_display_string_table[38];