diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index daccd7f7..cacbdd1b 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1924,7 +1924,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to } }break; - // rjf: string => leaf string literal, or file path + //- rjf: string => leaf string literal, or file path case E_TokenKind_StringLiteral: { if(str8_match(resolution_qualifier, str8_lit("file"), 0)) @@ -1944,7 +1944,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to it += 1; } }break; - + } + + //- rjf: upgrade atom w/ qualifier + if(resolution_qualifier.size != 0) + { + atom->qualifier = resolution_qualifier; } } } diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 7e0fcaf6..2b57c552 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -64,6 +64,7 @@ struct E_Expr E_TypeKey type_key; E_Value value; String8 string; + String8 qualifier; String8 bytecode; }; diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 14548ec9..0eab57a5 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -318,6 +318,7 @@ internal void ev_key_set_view_rule(EV_View *view, EV_Key key, String8 view_rule_ //~ rjf: View Rule Info Table Building / Selection / Lookups internal void ev_expand_rule_table_push(Arena *arena, EV_ExpandRuleTable *table, EV_ExpandRule *info); +#define ev_expand_rule_table_push_new(arena, table, ...) ev_expand_rule_table_push((arena), (table), &(EV_ExpandRule){__VA_ARGS__}) internal void ev_select_expand_rule_table(EV_ExpandRuleTable *table); internal EV_ExpandRule *ev_expand_rule_from_string(String8 string); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index b20c50db..ab3d1b0a 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -28,7 +28,7 @@ RD_CmdKind_Null, RD_CmdKind_Null, }; -RD_VocabularyInfo rd_vocabulary_info_table[45] = +RD_VocabularyInfo rd_vocabulary_info_table[57] = { {str8_lit_comp("auto_view_rule"), str8_lit_comp("auto_view_rules"), str8_lit_comp("Auto View Rule"), str8_lit_comp("Auto View Rules"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -75,6 +75,18 @@ RD_VocabularyInfo rd_vocabulary_info_table[45] = {str8_lit_comp("process"), str8_lit_comp("processes"), str8_lit_comp("Process"), str8_lit_comp("Processes"), RD_IconKind_Threads}, {str8_lit_comp("machine"), str8_lit_comp("machines"), str8_lit_comp("Machine"), str8_lit_comp("Machines"), RD_IconKind_Machine}, {str8_lit_comp("module"), str8_lit_comp("modules"), str8_lit_comp("Module"), str8_lit_comp("Modules"), RD_IconKind_Module}, +{str8_lit_comp("getting_started"), str8_lit_comp(""), str8_lit_comp("Getting Started"), str8_lit_comp(""), RD_IconKind_QuestionMark}, +{str8_lit_comp("disasm"), str8_lit_comp(""), str8_lit_comp("Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, +{str8_lit_comp("text"), str8_lit_comp(""), str8_lit_comp("Text"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("type"), str8_lit_comp("types"), str8_lit_comp("Type"), str8_lit_comp("Types"), RD_IconKind_Null}, +{str8_lit_comp("procedure"), str8_lit_comp("procedures"), str8_lit_comp("Procedure"), str8_lit_comp("Procedures"), RD_IconKind_Null}, +{str8_lit_comp("global_variable"), str8_lit_comp("global_variables"), str8_lit_comp("Global Variable"), str8_lit_comp("Global Variables"), RD_IconKind_Null}, +{str8_lit_comp("global"), str8_lit_comp("globals"), str8_lit_comp("Global"), str8_lit_comp("Globals"), RD_IconKind_Null}, +{str8_lit_comp("thread_variable"), str8_lit_comp("thread_variables"), str8_lit_comp("Thread Variable"), str8_lit_comp("Thread Variables"), RD_IconKind_Null}, +{str8_lit_comp("thread_local"), str8_lit_comp("thread_locals"), str8_lit_comp("Thread Local"), str8_lit_comp("Thread Locals"), RD_IconKind_Null}, +{str8_lit_comp("call_stack"), str8_lit_comp("call_stacks"), str8_lit_comp("Call Stack"), str8_lit_comp("Call Stacks"), RD_IconKind_Thread}, +{str8_lit_comp("output"), str8_lit_comp("outputs"), str8_lit_comp("Output"), str8_lit_comp("Outputs"), RD_IconKind_List}, +{str8_lit_comp("scheduler"), str8_lit_comp("schedulers"), str8_lit_comp("Scheduler"), str8_lit_comp("Schedulers"), RD_IconKind_Scheduler}, }; RD_NameSchemaInfo rd_name_schema_info_table[10] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 7de4f395..3afe1eec 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -570,7 +570,7 @@ C_LINKAGE_BEGIN extern String8 rd_cfg_src_string_table[4]; extern RD_CmdKind rd_cfg_src_load_cmd_kind_table[4]; extern RD_CmdKind rd_cfg_src_write_cmd_kind_table[4]; -extern RD_VocabularyInfo rd_vocabulary_info_table[45]; +extern RD_VocabularyInfo rd_vocabulary_info_table[57]; extern RD_NameSchemaInfo rd_name_schema_info_table[10]; extern Rng1U64 rd_reg_slot_range_table[38]; extern RD_StringBindingPair rd_default_binding_table[111]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index ec0bf8a1..8c8e17a3 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -96,6 +96,18 @@ RD_VocabularyMap: {process processes "Process" "Processes" Threads } {machine _ "Machine" _ Machine } {module _ "Module" _ Module } + {getting_started "" "Getting Started" "" QuestionMark } + {disasm "" "Disassembly" "" Glasses } + {text "" "Text" "" FileOutline } + {type _ "Type" _ Null } + {procedure _ "Procedure" _ Null } + {global_variable _ "Global Variable" _ Null } + {global _ "Global" _ Null } + {thread_variable _ "Thread Variable" _ Null } + {thread_local _ "Thread Local" _ Null } + {call_stack _ "Call Stack" _ Thread } + {output _ "Output" _ List } + {scheduler _ "Scheduler" _ Scheduler } } @struct RD_VocabularyInfo: diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index f9c6a537..f9bd7907 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1137,6 +1137,14 @@ rd_location_from_cfg(RD_Cfg *cfg) return dst_loc; } +internal String8 +rd_label_from_cfg(RD_Cfg *cfg) +{ + RD_Cfg *label_root = rd_cfg_child_from_string(cfg, str8_lit("label")); + String8 result = label_root->first->string; + return result; +} + internal String8 rd_expr_from_cfg(RD_Cfg *cfg) { @@ -1176,6 +1184,10 @@ rd_title_fstrs_from_cfg(Arena *arena, RD_Cfg *cfg, Vec4F32 secondary_color, F32 B32 is_disabled = rd_disabled_from_cfg(cfg); RD_Location loc = rd_location_from_cfg(cfg); D_Target target = rd_target_from_cfg(scratch.arena, cfg); + String8 label_string = rd_label_from_cfg(cfg); + String8 expr_string = rd_expr_from_cfg(cfg); + String8 collection_name = {0}; + String8 file_path = {0}; Vec4F32 rgba = rd_rgba_from_cfg(cfg); if(rgba.w == 0) { @@ -1194,6 +1206,45 @@ rd_title_fstrs_from_cfg(Arena *arena, RD_Cfg *cfg, Vec4F32 secondary_color, F32 } } } + B32 is_within_window = 0; + { + for(RD_Cfg *p = cfg->parent; p != &rd_nil_cfg; p = p->parent) + { + if(str8_match(p->string, str8_lit("window"), 0)) + { + is_within_window = 1; + break; + } + } + } + if(expr_string.size != 0) + { + String8 query_name = rd_query_from_eval_string(arena, expr_string); + if(query_name.size != 0) + { + String8 query_code_name = query_name; + String8 query_display_name = rd_display_from_code_name(query_code_name); + collection_name = query_display_name; + if(query_display_name.size == 0) + { + query_code_name = rd_singular_from_code_name_plural(query_name); + collection_name = rd_display_plural_from_code_name(query_code_name); + } + RD_IconKind query_icon_kind = rd_icon_kind_from_code_name(query_code_name); + if(query_icon_kind != RD_IconKind_Null) + { + icon_kind = query_icon_kind; + } + } + else + { + file_path = rd_file_path_from_eval_string(arena, expr_string); + if(file_path.size != 0) + { + icon_kind = RD_IconKind_FileOutline; + } + } + } //- rjf: set up color/size for all parts of the title // @@ -1223,24 +1274,44 @@ rd_title_fstrs_from_cfg(Arena *arena, RD_Cfg *cfg, Vec4F32 secondary_color, F32 dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); } - //- rjf: push label + //- rjf: push view title, if from window, and no file path + if(is_within_window && file_path.size == 0 && collection_name.size == 0) { - String8 label = rd_cfg_child_from_string(cfg, str8_lit("label"))->first->string; - if(label.size != 0) + String8 view_display_name = rd_display_from_code_name(cfg->string); + if(view_display_name.size != 0) { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), running_size, running_rgba, label); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), running_size, running_rgba, view_display_name); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); start_secondary(); } } - //- rjf: push expression + //- rjf: push label + if(label_string.size != 0) { - String8 expr = rd_cfg_child_from_string(cfg, str8_lit("expression"))->first->string; - if(expr.size != 0) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), running_size, running_rgba, expr); - start_secondary(); - } + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), running_size, running_rgba, label_string); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + start_secondary(); + } + + //- rjf: push expression + if(collection_name.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), running_size, running_rgba, collection_name); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + start_secondary(); + } + else if(file_path.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), running_size, running_rgba, file_path); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + start_secondary(); + } + else if(expr_string.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), running_size, running_rgba, expr_string); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + start_secondary(); } //- rjf: push text location @@ -2578,10 +2649,10 @@ rd_file_path_from_eval_string(Arena *arena, String8 string) String8 result = {0}; { Temp scratch = scratch_begin(&arena, 1); - E_Eval eval = e_eval_from_string(scratch.arena, string); - if(eval.expr->kind == E_ExprKind_LeafFilePath) + E_Expr *expr = e_parse_expr_from_text(scratch.arena, string); + if(expr->kind == E_ExprKind_LeafFilePath) { - result = raw_from_escaped_str8(arena, eval.expr->string); + result = raw_from_escaped_str8(arena, expr->string); } scratch_end(scratch); } @@ -2598,6 +2669,25 @@ rd_eval_string_from_file_path(Arena *arena, String8 string) return result; } +//- rjf: eval -> query + +internal String8 +rd_query_from_eval_string(Arena *arena, String8 string) +{ + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, string); + if(expr->kind == E_ExprKind_LeafIdent && + str8_match(expr->qualifier, str8_lit("query"), 0)) + { + result = expr->string; + } + scratch_end(scratch); + } + return result; +} + //////////////////////////////// //~ rjf: View Functions @@ -12959,7 +13049,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("output_log"), expr); + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("output"), expr); hs_scope_close(hs_scope); } @@ -13025,21 +13115,26 @@ rd_frame(void) { String8 name; RD_ViewUIFunctionType *ui; + EV_ExpandRuleInfoHookFunctionType *expand; } table[] = { - {str8_lit("watch"), RD_VIEW_UI_FUNCTION_NAME(watch)}, - {str8_lit("text"), RD_VIEW_UI_FUNCTION_NAME(text)}, - {str8_lit("disasm"), RD_VIEW_UI_FUNCTION_NAME(disasm)}, - {str8_lit("memory"), RD_VIEW_UI_FUNCTION_NAME(memory)}, - {str8_lit("bitmap"), RD_VIEW_UI_FUNCTION_NAME(bitmap)}, - {str8_lit("checkbox"), RD_VIEW_UI_FUNCTION_NAME(checkbox)}, - {str8_lit("color_rgba"), RD_VIEW_UI_FUNCTION_NAME(color_rgba)}, - {str8_lit("geo3d"), RD_VIEW_UI_FUNCTION_NAME(geo3d)}, + {str8_lit("watch"), RD_VIEW_UI_FUNCTION_NAME(watch), EV_EXPAND_RULE_INFO_FUNCTION_NAME(watch)}, + {str8_lit("text"), RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)}, + {str8_lit("disasm"), RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)}, + {str8_lit("memory"), RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)}, + {str8_lit("bitmap"), RD_VIEW_UI_FUNCTION_NAME(bitmap), EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)}, + {str8_lit("checkbox"), RD_VIEW_UI_FUNCTION_NAME(checkbox), 0}, + {str8_lit("color_rgba"), RD_VIEW_UI_FUNCTION_NAME(color_rgba), EV_EXPAND_RULE_INFO_FUNCTION_NAME(color_rgba)}, + {str8_lit("geo3d"), RD_VIEW_UI_FUNCTION_NAME(geo3d), EV_EXPAND_RULE_INFO_FUNCTION_NAME(geo3d)}, }; for EachElement(idx, table) { rd_view_ui_rule_map_insert(scratch.arena, rd_state->view_ui_rule_map, table[idx].name, table[idx].ui); + if(table[idx].expand != 0) + { + ev_expand_rule_table_push_new(scratch.arena, expand_rule_table, table[idx].name, table[idx].expand); + } } } @@ -14321,7 +14416,7 @@ X(watch_pins)\ X(targets)\ X(scheduler)\ X(modules)\ -Y(output, text, "query:output_log")\ +Y(output, text, "query:output")\ Y(disasm, disasm, "")\ Y(memory, memory, "")\ Z(getting_started) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index ab55cf8e..2098ca47 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1019,6 +1019,7 @@ internal Vec4F32 rd_rgba_from_cfg(RD_Cfg *cfg); internal B32 rd_disabled_from_cfg(RD_Cfg *cfg); internal RD_Location rd_location_from_cfg(RD_Cfg *cfg); +internal String8 rd_label_from_cfg(RD_Cfg *cfg); internal String8 rd_expr_from_cfg(RD_Cfg *cfg); internal D_Target rd_target_from_cfg(Arena *arena, RD_Cfg *cfg); internal DR_FancyStringList rd_title_fstrs_from_cfg(Arena *arena, RD_Cfg *cfg, Vec4F32 secondary_color, F32 size); @@ -1094,6 +1095,9 @@ internal R_Tex2DFormat rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *par internal String8 rd_file_path_from_eval_string(Arena *arena, String8 string); internal String8 rd_eval_string_from_file_path(Arena *arena, String8 string); +//- rjf: eval -> query +internal String8 rd_query_from_eval_string(Arena *arena, String8 string); + //////////////////////////////// //~ rjf: View Functions diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index c25e69e3..015b18a2 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -909,6 +909,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) .group_cfg = &rd_nil_cfg, .group_entity = &ctrl_entity_nil, .callstack_thread = &ctrl_entity_nil, + .view_ui_rule = &rd_nil_view_ui_rule, }; { Temp scratch = scratch_begin(&arena, 1); @@ -964,12 +965,26 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) info.group_cfg = rd_cfg_from_id(id); } + // rjf: determine view ui rule + info.view_ui_rule = rd_view_ui_rule_from_string(row->block->expand_rule->string); + // rjf: fill row's cells - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 0.25f); - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .pct = 0.35f); - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("typeof($expr)"), .pct = 0.15f); - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Tag, .pct = 0.25f); - // rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("sizeof($expr)"), .pct = 0.15f); + { + // rjf: singular cell for view ui + if(info.view_ui_rule != &rd_nil_view_ui_rule) + { + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_ViewUI, .pct = 1.f); + } + + // rjf: default cells + else + { + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 0.25f); + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .pct = 0.35f); + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("typeof($expr)"), .pct = 0.15f); + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Tag, .pct = 0.25f); + } + } di_scope_close(di_scope); scratch_end(scratch); @@ -3993,6 +4008,14 @@ RD_VIEW_UI_FUNCTION_DEF(null) {} //////////////////////////////// //~ rjf: watch @view_hook_impl +EV_EXPAND_RULE_INFO_FUNCTION_DEF(watch) +{ + EV_ExpandInfo info = {0}; + info.row_count = 8; + info.single_item = 1; + return info; +} + RD_VIEW_UI_FUNCTION_DEF(watch) { ProfBeginFunction(); diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index c3f22abd..e466ea19 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -46,6 +46,7 @@ typedef enum RD_WatchCellKind RD_WatchCellKind_Expr, // strings to represent expression itself RD_WatchCellKind_Tag, // strings to represent attached tags at row-granularity RD_WatchCellKind_Eval, // an evaluation of the expression, with some optional modification - e.g. `$expr.some_member`, or `typeof($expr)` + RD_WatchCellKind_ViewUI, } RD_WatchCellKind; @@ -78,6 +79,7 @@ struct RD_WatchRowInfo U64 callstack_unwind_index; U64 callstack_inline_depth; RD_WatchCellList cells; + RD_ViewUIRule *view_ui_rule; }; typedef struct RD_WatchRowCellInfo RD_WatchRowCellInfo; @@ -241,6 +243,15 @@ internal void rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect); // TODO(rjf): @cfg eliminate once we are predeclaring these with metacode RD_VIEW_UI_FUNCTION_DEF(null); + +EV_EXPAND_RULE_INFO_FUNCTION_DEF(watch); +EV_EXPAND_RULE_INFO_FUNCTION_DEF(text); +EV_EXPAND_RULE_INFO_FUNCTION_DEF(disasm); +EV_EXPAND_RULE_INFO_FUNCTION_DEF(memory); +EV_EXPAND_RULE_INFO_FUNCTION_DEF(bitmap); +EV_EXPAND_RULE_INFO_FUNCTION_DEF(color_rgba); +EV_EXPAND_RULE_INFO_FUNCTION_DEF(geo3d); + RD_VIEW_UI_FUNCTION_DEF(watch); RD_VIEW_UI_FUNCTION_DEF(text); RD_VIEW_UI_FUNCTION_DEF(disasm);