diff --git a/src/base/base_meta.h b/src/base/base_meta.h index 1e72f676..8b5362ac 100644 --- a/src/base/base_meta.h +++ b/src/base/base_meta.h @@ -164,7 +164,8 @@ struct TypeSerializeParams #define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), {0}, (ti), OffsetOf(S, m), __VA_ARGS__} #define struct_members(S) read_only global Member S##__members[] = -#define struct_type(S) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members} +#define struct_type(S, ...) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members, __VA_ARGS__} +#define named_struct_type(name, S, ...) read_only global Type name##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#name), {0}, ArrayCount(name##__members), name##__members, __VA_ARGS__} #define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, 0, sizeof(void *), (ti), __VA_ARGS__} //////////////////////////////// diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index a9eb385e..99b320dc 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -15,6 +15,23 @@ typedef U64 CTRL_MachineID; //////////////////////////////// //~ rjf: Meta Evaluation Types +//- rjf: styled string types + +ptr_type(CTRL_CodeString8__str_ptr_type, type(U8), .flags = TypeFlag_IsCode, .count_delimiter_name = str8_lit_comp("size")); +ptr_type(CTRL_PlainString8__str_ptr_type, type(U8), .flags = 0, .count_delimiter_name = str8_lit_comp("size")); +Member CTRL_CodeString8__members[] = +{ + member_lit_comp(String8, &CTRL_CodeString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; +Member CTRL_PlainString8__members[] = +{ + member_lit_comp(String8, &CTRL_PlainString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; +named_struct_type(CTRL_CodeString8, String8, .name = str8_lit_comp("string")); +named_struct_type(CTRL_PlainString8, String8, .name = str8_lit_comp("string")); + //- rjf: meta evaluation callstack types typedef struct CTRL_MetaEvalFrame CTRL_MetaEvalFrame; @@ -29,7 +46,7 @@ struct_members(CTRL_MetaEvalFrame) member_lit_comp(CTRL_MetaEvalFrame, &CTRL_MetaEvalFrame__vaddr_type, vaddr), member_lit_comp(CTRL_MetaEvalFrame, type(U64), inline_depth), }; -struct_type(CTRL_MetaEvalFrame); +struct_type(CTRL_MetaEvalFrame, .name = str8_lit_comp("callstack_frame")); typedef struct CTRL_MetaEvalFrameArray CTRL_MetaEvalFrameArray; struct CTRL_MetaEvalFrameArray { @@ -42,7 +59,7 @@ struct_members(CTRL_MetaEvalFrameArray) member_lit_comp(CTRL_MetaEvalFrameArray, type(U64), count, .pretty_name = str8_lit_comp("Frame Count")), {str8_lit_comp("v"), str8_lit_comp("Frame Addresses"), &CTRL_MetaEvalFrameArray__v_ptr_type, OffsetOf(CTRL_MetaEvalFrameArray, v)}, }; -struct_type(CTRL_MetaEvalFrameArray); +struct_type(CTRL_MetaEvalFrameArray, .name = str8_lit_comp("callstack_frames")); //- rjf: meta evaluation instance types @@ -56,14 +73,14 @@ X(U64, hit_count, "Hit Count")\ X(U64, id, "ID")\ X(Rng1U64, vaddr_range, "Address Range")\ X(U32, color, "Color")\ -Y(String8, String8__code_type, label, "Label")\ -X(String8, exe, "Executable Path")\ -X(String8, dbg, "Debug Info Path")\ -X(String8, args, "Arguments")\ -X(String8, working_directory, "Working Directory")\ -Y(String8, String8__code_type, entry_point, "Custom Entry Point")\ -X(String8, location, "Location")\ -Y(String8, String8__code_type, condition, "Condition")\ +Y(String8, type(CTRL_CodeString8), label, "Label")\ +Y(String8, type(CTRL_PlainString8), exe, "Executable Path")\ +Y(String8, type(CTRL_PlainString8), dbg, "Debug Info Path")\ +Y(String8, type(CTRL_PlainString8), args, "Arguments")\ +Y(String8, type(CTRL_PlainString8), working_directory, "Working Directory")\ +Y(String8, type(CTRL_CodeString8), entry_point, "Custom Entry Point")\ +Y(String8, type(CTRL_PlainString8), location, "Location")\ +Y(String8, type(CTRL_CodeString8), condition, "Condition")\ X(CTRL_MetaEvalFrameArray, callstack, "Call Stack") #define X(T, name, pretty_name) T name; #define Y(T, ti, name, pretty_name) T name; @@ -74,13 +91,80 @@ X(CTRL_MetaEvalFrameArray, callstack, "Call Stack") struct_members(CTRL_MetaEval) { #define X(T, name, pretty_name_) member_lit_comp(CTRL_MetaEval, type(T), name, .pretty_name = str8_lit_comp(pretty_name_)), -#define Y(T, ti, name, pretty_name_) member_lit_comp(CTRL_MetaEval, &(ti), name, .pretty_name = str8_lit_comp(pretty_name_)), +#define Y(T, ti, name, pretty_name_) member_lit_comp(CTRL_MetaEval, (ti), name, .pretty_name = str8_lit_comp(pretty_name_)), CTRL_MetaEval_MemberXList #undef X #undef Y }; struct_type(CTRL_MetaEval); +//- rjf: filters on main meta evaluation bundle + +struct_members(CTRL_BreakpointMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), enabled, .pretty_name = str8_lit_comp("Enabled")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(U64), hit_count, .pretty_name = str8_lit_comp("Hit Count")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Label")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),location, .pretty_name = str8_lit_comp("Location")), +}; + +struct_members(CTRL_TargetMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Label")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),exe, .pretty_name = str8_lit_comp("Executable")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),args, .pretty_name = str8_lit_comp("Arguments")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),working_directory, .pretty_name = str8_lit_comp("Working Directory")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), entry_point, .pretty_name = str8_lit_comp("Custom Entry Point")), +}; + +struct_members(CTRL_PinMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Expression")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(String8), location, .pretty_name = str8_lit_comp("Location")), +}; + +struct_members(CTRL_MachineMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), +}; + +struct_members(CTRL_ProcessMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), + member_lit_comp(CTRL_MetaEval, type(U64), id, .pretty_name = str8_lit_comp("ID")), +}; + +struct_members(CTRL_ModuleMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Executable")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),dbg, .pretty_name = str8_lit_comp("Debug Info Path")), + member_lit_comp(CTRL_MetaEval, type(Rng1U64), vaddr_range, .pretty_name = str8_lit_comp("Address Range")), +}; + +struct_members(CTRL_ThreadMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), + member_lit_comp(CTRL_MetaEval, type(U64), id, .pretty_name = str8_lit_comp("ID")), + member_lit_comp(CTRL_MetaEval, type(CTRL_MetaEvalFrameArray), callstack, .pretty_name = str8_lit_comp("Call Stack")), +}; + +named_struct_type(CTRL_BreakpointMetaEval, CTRL_MetaEval, .name = str8_lit_comp("breakpoint")); +named_struct_type(CTRL_TargetMetaEval, CTRL_MetaEval, .name = str8_lit_comp("target")); +named_struct_type(CTRL_PinMetaEval, CTRL_MetaEval, .name = str8_lit_comp("pin")); +named_struct_type(CTRL_MachineMetaEval, CTRL_MetaEval, .name = str8_lit_comp("machine")); +named_struct_type(CTRL_ProcessMetaEval, CTRL_MetaEval, .name = str8_lit_comp("process")); +named_struct_type(CTRL_ModuleMetaEval, CTRL_MetaEval, .name = str8_lit_comp("module")); +named_struct_type(CTRL_ThreadMetaEval, CTRL_MetaEval, .name = str8_lit_comp("thread")); + //- rjf: meta evaluation array typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray; @@ -89,7 +173,7 @@ 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")); +ptr_type(CTRL_MetaEvalArray__v_ptr_type, type(CTRL_BreakpointMetaEval), .count_delimiter_name = str8_lit_comp("count")); struct_members(CTRL_MetaEvalArray) { {str8_lit_comp("v"), {0}, &CTRL_MetaEvalArray__v_ptr_type, OffsetOf(CTRL_MetaEvalArray, v)}, diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index cfb5a200..4ac44134 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1293,8 +1293,7 @@ d_query_cached_unwind_from_thread(CTRL_Entity *thread) node->arena = arena_alloc(); node->thread = handle; } - if(node->reggen != reg_gen || - node->memgen != mem_gen) + if(!d_state->ctrl_is_running && (node->reggen != reg_gen || node->memgen != mem_gen)) { CTRL_Unwind new_unwind = ctrl_unwind_from_thread(scratch.arena, d_state->ctrl_entity_store, thread->handle, os_now_microseconds()+100); if(!(new_unwind.flags & (CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale)) && new_unwind.frames.count != 0) @@ -1576,7 +1575,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P Temp scratch = scratch_begin(&arena, 1); D_EventList result = {0}; d_state->frame_index += 1; - d_state->frame_eval_memread_endt_us = os_now_microseconds() + 5000; + d_state->frame_eval_memread_endt_us = os_now_microseconds() + 1000; ////////////////////////////// //- rjf: sync with ctrl thread diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 55366da2..e0ac78e0 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -873,7 +873,7 @@ e_leaf_type_from_name(String8 name) { key = e_type_key_basic(E_TypeKind_UChar32); } - else if(Case("u64") || Case("uint64") || Case("uint64_t") || Case("U64")) + else if(Case("u64") || Case("uint64") || Case("uint64_t") || Case("U64") || Case("size_t")) { key = e_type_key_basic(E_TypeKind_U64); } @@ -901,7 +901,7 @@ e_leaf_type_from_name(String8 name) { key = e_type_key_basic(E_TypeKind_Char32); } - else if(Case("s64") || Case("b64") || Case("B64") || Case("i64") || Case("int64") || Case("int64_t") || Case("S64")) + else if(Case("s64") || Case("b64") || Case("B64") || Case("i64") || Case("int64") || Case("int64_t") || Case("S64") || Case("ssize_t")) { key = e_type_key_basic(E_TypeKind_S64); } diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index b9468608..1a94483b 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -393,7 +393,7 @@ ev_view_rule_info_from_string(String8 string) //~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups internal void -ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule) +ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required) { if(table->slots_count == 0) { @@ -417,6 +417,7 @@ ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_Ty node = push_array(arena, EV_AutoViewRuleNode, 1); node->key = type_key; node->view_rule = push_str8_copy(arena, view_rule); + node->is_required = is_required; SLLQueuePush(slot->first, slot->last, node); } } @@ -427,10 +428,10 @@ ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table) ev_auto_view_rule_table = table; } -internal String8 -ev_auto_view_rule_from_type_key(E_TypeKey type_key) +internal EV_ViewRuleList * +ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional) { - String8 string = {0}; + EV_ViewRuleList *result = &ev_nil_view_rule_list; if(ev_auto_view_rule_table != 0 && ev_auto_view_rule_table->slots_count != 0) { U64 hash = e_hash_from_type_key(type_key); @@ -439,18 +440,17 @@ ev_auto_view_rule_from_type_key(E_TypeKey type_key) EV_AutoViewRuleNode *node = 0; for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next) { - if(e_type_match(n->key, type_key)) + if(e_type_match(n->key, type_key) && ((n->is_required && gather_required) || (!n->is_required && gather_optional))) { - node = n; - break; + if(result == &ev_nil_view_rule_list) + { + result = push_array(arena, EV_ViewRuleList, 1); + } + ev_view_rule_list_push_string(arena, result, n->view_rule); } } - if(node != 0) - { - string = node->view_rule; - } } - return string; + return result; } //////////////////////////////// @@ -468,10 +468,13 @@ ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root) internal void ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string) { - MD_Node *root = md_tree_from_string(arena, string); - for MD_EachNode(tln, root->first) + if(string.size != 0) { - ev_view_rule_list_push_tree(arena, list, tln); + MD_Node *root = md_tree_from_string(arena, string); + for MD_EachNode(tln, root->first) + { + ev_view_rule_list_push_tree(arena, list, tln); + } } } @@ -509,6 +512,22 @@ ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src) return dst; } +internal void +ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src) +{ + if(dst->first && src[0] != &ev_nil_view_rule_list && src[0]->first) + { + dst->last->next = src[0]->first; + dst->last = src[0]->last; + dst->count += src[0]->count; + } + else if(!dst->first) + { + MemoryCopyStruct(dst, *src); + } + *src = &ev_nil_view_rule_list; +} + //////////////////////////////// //~ rjf: View Rule Expression Resolution @@ -543,8 +562,8 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_copy(arena, view_rules); { E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); - String8 auto_view_rule = ev_auto_view_rule_from_type_key(irtree.type_key); - ev_view_rule_list_push_string(arena, top_level_view_rules, auto_view_rule); + EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(arena, irtree.type_key, 1, 1); + ev_view_rule_list_concat_in_place(top_level_view_rules, &auto_view_rules); } //- rjf: generate root block @@ -684,19 +703,12 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str E_Expr *child_expr = child_expand.row_exprs[0]; EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, t->view_rules); String8 child_view_rule_string = ev_view_rule_from_key(view, child_key); - if(child_view_rule_string.size != 0) - { - ev_view_rule_list_push_string(arena, child_view_rules, child_view_rule_string); - } - else + ev_view_rule_list_push_string(arena, child_view_rules, child_view_rule_string); { Temp scratch = scratch_begin(&arena, 1); E_IRTreeAndType child_irtree = e_irtree_and_type_from_expr(scratch.arena, child_expr); - String8 child_auto_view_rule_string = ev_auto_view_rule_from_type_key(child_irtree.type_key); - if(child_auto_view_rule_string.size != 0) - { - ev_view_rule_list_push_string(arena, child_view_rules, child_auto_view_rule_string); - } + EV_ViewRuleList *child_auto_view_rules = ev_auto_view_rules_from_type_key(arena, child_irtree.type_key, 1, child_view_rule_string.size == 0); + ev_view_rule_list_concat_in_place(child_view_rules, &child_auto_view_rules); scratch_end(scratch); } E_Expr *child_expr__resolved = ev_expr_from_expr_view_rules(arena, child_expr, child_view_rules); @@ -1011,19 +1023,12 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 E_Expr *row_expr = expand_range_info.row_exprs[idx]; EV_ViewRuleList *row_view_rules = ev_view_rule_list_from_inheritance(arena, n->v.block->view_rules); String8 row_view_rule_string = ev_view_rule_from_key(view, row_key); - if(row_view_rule_string.size != 0) - { - ev_view_rule_list_push_string(arena, row_view_rules, row_view_rule_string); - } - else + ev_view_rule_list_push_string(arena, row_view_rules, row_view_rule_string); { Temp scratch = scratch_begin(&arena, 1); E_IRTreeAndType row_irtree = e_irtree_and_type_from_expr(scratch.arena, row_expr); - String8 row_auto_view_rule_string = ev_auto_view_rule_from_type_key(row_irtree.type_key); - if(row_auto_view_rule_string.size != 0) - { - ev_view_rule_list_push_string(arena, row_view_rules, row_auto_view_rule_string); - } + EV_ViewRuleList *row_auto_view_rules = ev_auto_view_rules_from_type_key(arena, row_irtree.type_key, 1, row_view_rule_string.size == 0); + ev_view_rule_list_concat_in_place(row_view_rules, &row_auto_view_rules); scratch_end(scratch); } E_Expr *row_expr__resolved = ev_expr_from_expr_view_rules(arena, row_expr, row_view_rules); diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 98232428..8742dd9e 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -291,6 +291,7 @@ struct EV_AutoViewRuleNode EV_AutoViewRuleNode *next; E_TypeKey key; String8 view_rule; + B32 is_required; }; typedef struct EV_AutoViewRuleSlot EV_AutoViewRuleSlot; @@ -392,9 +393,9 @@ internal EV_ViewRuleInfo *ev_view_rule_info_from_string(String8 string); //////////////////////////////// //~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups -internal void ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule); +internal void ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required); internal void ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table); -internal String8 ev_auto_view_rule_from_type_key(E_TypeKey type_key); +internal EV_ViewRuleList *ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional); //////////////////////////////// //~ rjf: View Rule Instance List Building @@ -404,6 +405,7 @@ internal void ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, internal EV_ViewRuleList *ev_view_rule_list_from_string(Arena *arena, String8 string); internal EV_ViewRuleList *ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src); internal EV_ViewRuleList *ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src); +internal void ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src); //////////////////////////////// //~ rjf: View Rule Expression Resolution diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cd68e2d1..e24faab8 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10891,6 +10891,12 @@ rd_frame(void) RD_EntityKind_WatchPin, RD_EntityKind_Target, }; + E_TypeKey evallable_kind_types[] = + { + e_type_key_cons_base(type(CTRL_BreakpointMetaEval)), + e_type_key_cons_base(type(CTRL_PinMetaEval)), + e_type_key_cons_base(type(CTRL_TargetMetaEval)), + }; for EachElement(idx, evallable_kinds) { RD_EntityList list = rd_query_cached_entity_list_with_kind(evallable_kinds[idx]); @@ -10901,7 +10907,7 @@ rd_frame(void) E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->space = space; expr->mode = E_Mode_Offset; - expr->type_key = meta_eval_type_key; + expr->type_key = evallable_kind_types[idx]; e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", entity->id), expr); if(entity->string.size != 0) { @@ -10920,6 +10926,13 @@ rd_frame(void) CTRL_EntityKind_Thread, CTRL_EntityKind_Module, }; + E_TypeKey evallable_kind_types[] = + { + e_type_key_cons_base(type(CTRL_MachineMetaEval)), + e_type_key_cons_base(type(CTRL_ProcessMetaEval)), + e_type_key_cons_base(type(CTRL_ThreadMetaEval)), + e_type_key_cons_base(type(CTRL_ModuleMetaEval)), + }; for EachElement(idx, evallable_kinds) { CTRL_EntityKind kind = evallable_kinds[idx]; @@ -10931,7 +10944,7 @@ rd_frame(void) E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->space = space; expr->mode = E_Mode_Offset; - expr->type_key = meta_eval_type_key; + expr->type_key = evallable_kind_types[idx]; e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]), expr); if(entity->string.size != 0) { @@ -11034,10 +11047,10 @@ rd_frame(void) // EV_AutoViewRuleTable *auto_view_rule_table = push_array(scratch.arena, EV_AutoViewRuleTable, 1); { - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MetaEvalFrameArray)), str8_lit("slice")); + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MetaEvalFrameArray)), str8_lit("slice"), 1); for EachElement(idx, rd_collection_name_table) { - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx]); + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx], 1); } } ev_select_auto_view_rule_table(auto_view_rule_table); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 9480e170..2d5233e2 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2662,7 +2662,13 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo cell_autocomp_flags = RD_AutoCompListerFlag_ViewRules; if(cell_pre_edit_string.size == 0) { - cell_ghost_text = ev_auto_view_rule_from_type_key(row_eval.type_key); + EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(scratch.arena, row_eval.type_key, 0, 1); + String8List strings = {0}; + for(EV_ViewRuleNode *n = auto_view_rules->first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &strings, n->v.root->string); + } + cell_ghost_text = str8_list_join(scratch.arena, &strings, &(StringJoin){.sep = str8_lit(", ")}); } }break; case RD_WatchViewColumnKind_CallStackFrameSelection: