From be2daf570a2e057a955d6bb3702a86353f15fa6c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Aug 2024 11:26:28 -0700 Subject: [PATCH] checkpoint on eval / eval-viz simplification pass --- src/df/core/df_core.c | 75 +++++++++++++-- src/df/core/df_core.h | 11 +-- src/df/gfx/df_gfx.c | 184 +++++++++---------------------------- src/df/gfx/df_gfx.h | 7 +- src/df/gfx/df_view_rules.c | 12 +-- src/df/gfx/df_views.c | 141 ++++++++++++++++------------ src/df/gfx/df_views.h | 7 +- src/eval/eval_bundles.c | 40 ++++++++ src/eval/eval_bundles.h | 1 + src/eval/eval_types.c | 2 +- src/eval/eval_types.h | 2 +- 11 files changed, 255 insertions(+), 227 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 148fa77d..e10ca6ca 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4596,7 +4596,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex { DF_EvalVizBlock *block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, parent_key, key, depth); block->eval = eval; - block->cfg_table = *cfg_table; + block->cfg_table = cfg_table; block->string = eval_string; block->visual_idx_range = r1u64(key.child_num-1, key.child_num+0); block->semantic_idx_range = r1u64(key.child_num-1, key.child_num+0); @@ -4744,7 +4744,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex { last_vb->eval = udt_eval; last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; + last_vb->cfg_table = cfg_table; last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, filtered_data_members.count); } for(DF_ExpandNode *child = node->first; child != 0; child = child->next) @@ -4801,7 +4801,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex { last_vb->eval = udt_eval; last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; + last_vb->cfg_table = cfg_table; last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, type->count); } df_eval_viz_block_end(list_out, last_vb); @@ -4858,7 +4858,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex { last_vb->eval = udt_eval; last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; + last_vb->cfg_table = cfg_table; last_vb->link_member_type_key = link_member->type_key; last_vb->link_member_off = link_member->off; last_vb->visual_idx_range = r1u64(0, link_bases.count); @@ -4923,7 +4923,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex { last_vb->eval = arr_eval; last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; + last_vb->cfg_table = cfg_table; last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, array_count); } for(DF_ExpandNode *child = node->first; child != 0; child = child->next) @@ -5149,7 +5149,7 @@ df_parent_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_n //- rjf: viz row list building internal DF_EvalVizRow * -df_eval_viz_row_list_push_new(Arena *arena, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, E_Eval eval) +df_eval_viz_row_list_push_new(Arena *arena, DF_EvalView *eval_view, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, E_Eval eval) { // rjf: push DF_EvalVizRow *row = push_array(arena, DF_EvalVizRow, 1); @@ -5203,6 +5203,69 @@ df_eval_viz_row_list_push_new(Arena *arena, DF_EvalVizWindowedRowList *rows, DF_ } } + // rjf: fill view-rule-derived info + { + // rjf: pick cfg table + DF_CfgTable *cfg_table = block->cfg_table; + { + String8 row_view_rules = df_eval_view_rule_from_key(eval_view, row->key); + if(row_view_rules.size != 0) + { + cfg_table = push_array(arena, DF_CfgTable, 1); + *cfg_table = df_cfg_table_from_inheritance(arena, cfg_table); + df_cfg_table_push_unparsed_string(arena, cfg_table, row_view_rules, DF_CfgSrc_User); + } + } + + // rjf: determine if view rules force expandability + B32 expandability_required = 0; + for(DF_CfgVal *val = cfg_table->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) + { + DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string); + if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_Expandable) + { + expandability_required = 1; + break; + } + } + + // rjf: determine row ui hook to use for this row + DF_GfxViewRuleSpec *value_ui_rule_spec = &df_g_nil_gfx_view_rule_spec; + DF_CfgNode *value_ui_rule_node= &df_g_nil_cfg_node; + for(DF_CfgVal *val = cfg_table->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) + { + DF_GfxViewRuleSpec *spec = df_gfx_view_rule_spec_from_string(val->string); + if(spec->info.flags & DF_GfxViewRuleSpecInfoFlag_RowUI) + { + value_ui_rule_spec = spec; + value_ui_rule_node = val->last; + break; + } + } + + // rjf: determine block ui hook to use for this row + DF_GfxViewRuleSpec *expand_ui_rule_spec = &df_g_nil_gfx_view_rule_spec; + DF_CfgNode *expand_ui_rule_node = &df_g_nil_cfg_node; + for(DF_CfgVal *val = cfg_table->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) + { + DF_GfxViewRuleSpec *spec = df_gfx_view_rule_spec_from_string(val->string); + if(spec->info.flags & DF_GfxViewRuleSpecInfoFlag_BlockUI) + { + expand_ui_rule_spec = spec; + expand_ui_rule_node = val->last; + break; + } + } + + // rjf: fill + if(expandability_required) { row->flags |= DF_EvalVizRowFlag_CanExpand; } + row->cfg_table = cfg_table; + row->value_ui_rule_node = value_ui_rule_node; + row->value_ui_rule_spec = value_ui_rule_spec; + row->expand_ui_rule_node = expand_ui_rule_node; + row->expand_ui_rule_spec = expand_ui_rule_spec; + } + return row; } diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index f33ae7b6..d3bdce76 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -711,7 +711,7 @@ struct DF_EvalVizBlock FZY_ItemArray fzy_backing_items; // rjf: visualization config extensions - DF_CfgTable cfg_table; + DF_CfgTable *cfg_table; E_TypeKey link_member_type_key; U64 link_member_off; }; @@ -748,8 +748,6 @@ enum DF_EvalVizStringFlag_ReadOnlyDisplayRules = (1<<0), }; -// TODO(rjf): move viz-row stuff to gfx layer - typedef U32 DF_EvalVizRowFlags; enum { @@ -772,13 +770,12 @@ struct DF_EvalVizRow // rjf: evaluation artifacts E_Eval eval; + E_Member *member; // rjf: basic visualization contents + DF_CfgTable *cfg_table; String8 display_expr; String8 edit_expr; - String8 display_value; - String8 edit_value; - E_TypeKeyList inherited_type_key_chain; // rjf: variable-size & hook info U64 size_in_rows; @@ -1614,7 +1611,7 @@ internal DF_ExpandKey df_key_from_viz_block_list_row_num(DF_EvalVizBlockList *bl internal DF_ExpandKey df_parent_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_num); //- rjf: viz row list building -internal DF_EvalVizRow *df_eval_viz_row_list_push_new(Arena *arena, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, E_Eval eval); +internal DF_EvalVizRow *df_eval_viz_row_list_push_new(Arena *arena, DF_EvalView *eval_view, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, E_Eval eval); //////////////////////////////// //~ rjf: Main State Accessors/Mutators diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index abce9557..92fc00a7 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6134,7 +6134,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, expr, parent_key, key); U32 default_radix = (eval.space == E_Space_Regs ? 16 : 10); - DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); + DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); //- rjf: animate { @@ -6209,6 +6209,10 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //- rjf: build rows for(DF_EvalVizRow *row = viz_rows.first; row != 0; row = row->next) { + //- rjf: unpack row + String8 row_edit_value = df_value_string_from_eval(scratch.arena, 0, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row->eval, row->member, row->cfg_table); + String8 row_display_value = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row->eval, row->member, row->cfg_table); + //- rjf: calculate width of exp row if(row == viz_rows.first) { @@ -6274,7 +6278,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_LineEditFlag_DisplayStringIsCode| DF_LineEditFlag_PreferDisplayString| DF_LineEditFlag_Border, - 0, 0, &ws->hover_eval_txt_cursor, &ws->hover_eval_txt_mark, ws->hover_eval_txt_buffer, sizeof(ws->hover_eval_txt_buffer), &ws->hover_eval_txt_size, 0, row->edit_value, "%S###val_%I64x", row->display_value, row_hash); + 0, 0, &ws->hover_eval_txt_cursor, &ws->hover_eval_txt_mark, ws->hover_eval_txt_buffer, sizeof(ws->hover_eval_txt_buffer), &ws->hover_eval_txt_size, 0, row_edit_value, "%S###val_%I64x", row_display_value, row_hash); if(ui_pressed(sig)) { ws->hover_eval_focused = 1; @@ -6301,7 +6305,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); ui_set_next_flags(UI_BoxFlag_DrawBackground); } - df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->display_value); + df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row_display_value); } } if(row == viz_rows.first) @@ -8280,7 +8284,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //~ rjf: Eval Viz internal String8 -df_eval_escaped_from_raw_string(Arena *arena, String8 raw) +df_escaped_from_raw_string(Arena *arena, String8 raw) { Temp scratch = scratch_begin(&arena, 1); String8List parts = {0}; @@ -8323,7 +8327,7 @@ df_eval_escaped_from_raw_string(Arena *arena, String8 raw) } internal String8List -df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table) +df_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table) { ProfBeginFunction(); String8List list = {0}; @@ -8432,7 +8436,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; } - String8 text = df_eval_escaped_from_raw_string(arena, raw_text); + String8 text = df_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); @@ -8460,7 +8464,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags pted_eval.mode = E_Mode_Offset; pted_eval.space = value_eval.space; pted_eval.value = value_eval.value; - String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); + String8List pted_strs = df_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); if(pted_strs.total_size == 0) { String8 unknown = str8_lit("???"); @@ -8535,7 +8539,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_data.str, text_data.size/sizeof(U16)));}break; case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_data.str, text_data.size/sizeof(U32)));}break; } - String8 text = df_eval_escaped_from_raw_string(arena, raw_text); + String8 text = df_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); @@ -8560,7 +8564,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) { E_Eval element_eval = e_element_eval_from_array_eval_index(eval, idx); - String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); + String8List element_strs = df_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, element_strs).x; str8_list_concat_in_place(&list, &element_strs); if(idx+1 < array_count) @@ -8619,7 +8623,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags member_eval.space = eval.space; member_eval.value = eval.value; member_eval.value.u64 += mem->off; - String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); + String8List member_strs = df_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, member_strs).x; str8_list_concat_in_place(&list, &member_strs); if(member_idx+1 < filtered_data_members.count) @@ -8652,8 +8656,18 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags return list; } +internal String8 +df_value_string_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List parts = df_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, opt_member, cfg_table); + String8 result = str8_list_join(arena, &parts, 0); + scratch_end(scratch); + return result; +} + internal DF_EvalVizWindowedRowList -df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks) +df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -8677,52 +8691,6 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, Rng1S64 block_semantic_range = r1s64(semantic_idx_off, semantic_idx_off + block_num_semantic_rows); E_TypeKind block_type_kind = e_type_kind_from_key(block->eval.type_key); - ////////////////////////////// - //- rjf: determine if view rules force expandability - // - B32 expandability_required = 0; - for(DF_CfgVal *val = block->cfg_table.first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_Expandable) - { - expandability_required = 1; - break; - } - } - - ////////////////////////////// - //- rjf: grab default row ui view rule to use for this block - // - DF_GfxViewRuleSpec *value_ui_rule_spec = &df_g_nil_gfx_view_rule_spec; - DF_CfgNode *value_ui_rule_node= &df_g_nil_cfg_node; - for(DF_CfgVal *val = block->cfg_table.first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_GfxViewRuleSpec *spec = df_gfx_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_GfxViewRuleSpecInfoFlag_RowUI) - { - value_ui_rule_spec = spec; - value_ui_rule_node = val->last; - break; - } - } - - ////////////////////////////// - //- rjf: grab expand ui view rule to use for this block's rows - // - DF_GfxViewRuleSpec *expand_ui_rule_spec = &df_g_nil_gfx_view_rule_spec; - DF_CfgNode *expand_ui_rule_node = &df_g_nil_cfg_node; - for(DF_CfgVal *val = block->cfg_table.first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_GfxViewRuleSpec *spec = df_gfx_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_GfxViewRuleSpecInfoFlag_BlockUI) - { - expand_ui_rule_spec = spec; - expand_ui_rule_node = val->last; - break; - } - } - ////////////////////////////// //- rjf: get skip/chop of block's index range // @@ -8764,7 +8732,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, ////////////////////////////// //- rjf: produce rows, depending on block's kind // - switch(block->kind) + if(visible_idx_range.max > visible_idx_range.min) switch(block->kind) { default:{}break; @@ -8772,37 +8740,23 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, //- rjf: null -> empty row // case DF_EvalVizBlockKind_Null: - if(visible_idx_range.max > visible_idx_range.min) { E_Eval eval = zero_struct; - df_eval_viz_row_list_push_new(arena, &list, block, block->key, eval); + df_eval_viz_row_list_push_new(arena, eval_view, &list, block, block->key, eval); }break; ////////////////////////////// //- rjf: root -> just a single row. possibly expandable. // case DF_EvalVizBlockKind_Root: - if(visible_idx_range.max > visible_idx_range.min) { - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, block->key, block->eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, block->key, block->eval); row->display_expr = block->string; row->edit_expr = block->string; - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; if(block->member && block->member->kind == E_MemberKind_Padding) { row->flags |= DF_EvalVizRowFlag_ExprIsSpecial; } - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } }break; ////////////////////////////// @@ -8812,7 +8766,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, if(block_type_kind != E_TypeKind_Null) { E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, block->eval.type_key); - E_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table); + E_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, block->cfg_table); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1) { E_Member *member = &filtered_data_members.v[idx]; @@ -8832,7 +8786,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); + DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, block->cfg_table); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); // rjf: apply view rules to eval @@ -8842,26 +8796,14 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, } // rjf: build & push row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, member_eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, member_eval); + row->member = e_type_member_copy(arena, member); if(member->kind == E_MemberKind_Padding) { row->flags |= DF_EvalVizRowFlag_ExprIsSpecial; } row->display_expr = push_str8_copy(arena, member->name); row->edit_expr = push_str8f(arena, "%S.%S", block->string, member->name); - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - row->inherited_type_key_chain = e_type_key_list_copy(arena, &member->inheritance_key_chain); - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } } }break; @@ -8888,7 +8830,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); + DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, block->cfg_table); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); // rjf: apply view rules to eval @@ -8898,17 +8840,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, } // rjf: build & push row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, eval); row->display_expr = push_str8_copy(arena, enum_val->name); row->edit_expr = row->display_expr; - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; } }break; @@ -8930,7 +8864,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); + DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, block->cfg_table); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); // rjf: apply view rules to eval @@ -8940,21 +8874,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, } // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, elem_eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, elem_eval); row->display_expr = push_str8f(arena, "[%I64u]", idx); row->edit_expr = push_str8f(arena, "%S[%I64u]", block->string, idx); - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } } }break; @@ -8985,7 +8907,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); + DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, block->cfg_table); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); // rjf: apply view rules to eval @@ -8994,21 +8916,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, E_TypeKind link_type_kind = e_type_kind_from_key(link_eval.type_key); // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, link_eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, link_eval); row->display_expr = push_str8f(arena, "[%I64u]", idx); row->edit_expr = push_str8f(arena, "(%S *)0xI64x", node_type_string, link_eval.value.u64); - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } } }break; @@ -9019,14 +8929,12 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, if(num_skipped_visual < block_num_visual_rows) { DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), 1); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, block->eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, block->eval); row->flags = DF_EvalVizRowFlag_Canvas; row->edit_expr = block->string; row->size_in_rows = dim_1u64(intersect_1u64(visible_idx_range, r1u64(0, dim_1u64(block->visual_idx_range)))); row->skipped_size_in_rows= (visible_idx_range.min > block->visual_idx_range.min) ? visible_idx_range.min - block->visual_idx_range.min : 0; row->chopped_size_in_rows= (visible_idx_range.max < block->visual_idx_range.max) ? block->visual_idx_range.max - visible_idx_range.max : 0; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; }break; ////////////////////////////// @@ -9067,7 +8975,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); + DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, block->cfg_table); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); // rjf: apply view rules to eval @@ -9077,17 +8985,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, } // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, eval); row->display_expr = name; row->edit_expr = name; - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; }break; } } @@ -11688,7 +11588,7 @@ df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *m if(!e_type_key_match(e_type_key_zero(), eval.type_key)) { DF_CfgTable cfg_table = {0}; - String8List eval_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table); + String8List eval_strings = df_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table); eval_string = str8_list_join(scratch.arena, &eval_strings, 0); } ui_spacer(ui_em(1.5f, 1.f)); diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 34878721..b0f603d9 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -965,9 +965,10 @@ internal void df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdLis //////////////////////////////// //~ rjf: Eval Viz -internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw); -internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table); -internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); +internal String8 df_escaped_from_raw_string(Arena *arena, String8 raw); +internal String8List df_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table); +internal String8 df_value_string_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table); +internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); //////////////////////////////// //~ rjf: Hover Eval diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c index c3c80910..c1930ea2 100644 --- a/src/df/gfx/df_view_rules.c +++ b/src/df/gfx/df_view_rules.c @@ -324,7 +324,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(rgba) DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->eval = eval; vb->string = string; - vb->cfg_table = *cfg_table; + vb->cfg_table = cfg_table; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); df_eval_viz_block_end(out, vb); @@ -507,7 +507,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(text) DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->eval = eval; vb->string = string; - vb->cfg_table = *cfg_table; + vb->cfg_table = cfg_table; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); df_eval_viz_block_end(out, vb); @@ -654,7 +654,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm) DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->eval = eval; vb->string = string; - vb->cfg_table = *cfg_table; + vb->cfg_table = cfg_table; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); df_eval_viz_block_end(out, vb); @@ -776,7 +776,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(graph) DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->eval = eval; vb->string = string; - vb->cfg_table = *cfg_table; + vb->cfg_table = cfg_table; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); df_eval_viz_block_end(out, vb); @@ -918,7 +918,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap) DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->eval = eval; vb->string = string; - vb->cfg_table = *cfg_table; + vb->cfg_table = cfg_table; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); df_eval_viz_block_end(out, vb); @@ -1328,7 +1328,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo) DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->eval = eval; vb->string = string; - vb->cfg_table = *cfg_table; + vb->cfg_table = cfg_table; vb->visual_idx_range = r1u64(0, 16); vb->semantic_idx_range = r1u64(0, 1); df_eval_viz_block_end(out, vb); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 9edda564..8f6ff812 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1224,7 +1224,7 @@ df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt) //- rjf: table coordinates -> strings internal String8 -df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumn *col, B32 editable) +df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumn *col, B32 editable, U32 default_radix, F_Tag font, F32 font_size, F32 max_size_px) { String8 result = {0}; switch(col->kind) @@ -1233,11 +1233,11 @@ df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow case DF_WatchViewColumnKind_Expr: { result = editable ? row->edit_expr : row->display_expr; - if(row->inherited_type_key_chain.first != 0) + if(row->member != 0 && row->member->inheritance_key_chain.first != 0) { Temp scratch = scratch_begin(&arena, 1); String8List inheritance_chain_type_names = {0}; - for(E_TypeKeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next) + for(E_TypeKeyNode *n = row->member->inheritance_key_chain.first; n != 0; n = n->next) { String8 inherited_type_name = e_type_string_from_key(scratch.arena, n->v); inherited_type_name = str8_skip_chop_whitespace(inherited_type_name); @@ -1255,7 +1255,7 @@ df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow }break; case DF_WatchViewColumnKind_Value: { - result = editable ? row->edit_value : row->display_value; + result = df_value_string_from_eval(arena, !editable * DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, max_size_px, row->eval, row->member, row->cfg_table); }break; case DF_WatchViewColumnKind_Type: { @@ -1272,6 +1272,11 @@ df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow DF_Entity *module = df_module_from_process_vaddr(process, row->eval.value.u64); result = df_display_string_from_entity(arena, module); }break; + case DF_WatchViewColumnKind_Member: + { + E_Eval member_eval = e_member_eval_from_eval_member_name(row->eval, str8(col->string_buffer, col->string_size)); + result = df_value_string_from_eval(arena, !editable * DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, max_size_px, member_eval, row->member, row->cfg_table); + }break; } return result; } @@ -1301,7 +1306,7 @@ df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint p //- rjf: watch view column state mutation internal DF_WatchViewColumn * -df_watch_view_column_alloc(DF_WatchViewState *wv, DF_WatchViewColumnKind kind, F32 pct) +df_watch_view_column_alloc(DF_WatchViewState *wv, DF_WatchViewColumnKind kind, F32 pct, String8 string) { if(!wv->free_column) { @@ -1314,6 +1319,8 @@ df_watch_view_column_alloc(DF_WatchViewState *wv, DF_WatchViewColumnKind kind, F wv->column_count += 1; col->kind = kind; col->pct = pct; + col->string_size = Min(sizeof(col->string_buffer), string.size); + MemoryCopy(col->string_buffer, string.str, col->string_size); return col; } @@ -1400,6 +1407,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); DF_EntityKind mutable_entity_kind = DF_EntityKind_Nil; + F32 row_string_max_size_px = dim_2f32(rect).x; ////////////////////////////// //- rjf: determine autocompletion string @@ -2022,7 +2030,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1); ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64); ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, DF_WatchViewTextEditState*, ewv->text_edit_state_slots_count); - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -2031,7 +2039,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { DF_WatchViewColumn *col = df_watch_view_column_from_x(ewv, x); - String8 string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 1); + String8 string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 1, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); string.size = Min(string.size, sizeof(ewv->dummy_text_edit_state.input_buffer)); DF_WatchViewPoint pt = {x, row->parent_key, row->key}; U64 hash = df_hash_from_expand_key(pt.key); @@ -2055,7 +2063,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept && selection_tbl.min.x <= 0) { taken = 1; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -2097,7 +2105,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS selection_tbl.min.x == 1) { taken = 1; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -2223,7 +2231,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS case DF_WatchViewColumnKind_Value: if(editing_complete && evt->slot != UI_EventActionSlot_Cancel) { - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, y-1), ui_scroll_list_row_from_item(&row_blocks, y-1)+1), &blocks); B32 success = 0; @@ -2263,6 +2271,10 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS state_dirty = 1; snap_to_cursor = 1; }break; + case DF_WatchViewColumnKind_Member: + { + + }break; } } } @@ -2280,7 +2292,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { taken = 1; String8List strs = {0}; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -2289,7 +2301,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { DF_WatchViewColumn *col = df_watch_view_column_from_x(ewv, x); - String8 cell_string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 0); + String8 cell_string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 0, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); cell_string = str8_skip_chop_whitespace(cell_string); U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(","), 0); if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y) @@ -2581,6 +2593,10 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS case DF_WatchViewColumnKind_Type: {name = str8_lit("Type");}break; case DF_WatchViewColumnKind_ViewRule:{name = str8_lit("View Rule");}break; case DF_WatchViewColumnKind_Module: {name = str8_lit("Module");}break; + case DF_WatchViewColumnKind_Member: + { + name = str8(col->string_buffer, col->string_size); + }break; } switch(col->kind) { @@ -2633,7 +2649,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // DF_EvalVizWindowedRowList rows = {0}; { - rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); + rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); } //////////////////////////// @@ -2648,7 +2664,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //- rjf: unpack row info // U64 row_hash = df_hash_from_expand_key(row->key); - B32 row_is_inherited = (row->inherited_type_key_chain.count != 0); B32 row_selected = (selection_tbl.min.y <= (semantic_idx+1) && (semantic_idx+1) <= selection_tbl.max.y); B32 row_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); B32 next_row_expanded = row_expanded; @@ -2814,9 +2829,10 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS DF_WatchViewPoint cell_pt = {x, row->parent_key, row->key}; DF_WatchViewTextEditState *cell_edit_state = df_watch_view_text_edit_state_from_pt(ewv, cell_pt); B32 cell_selected = (row_selected && selection_tbl.min.x <= cell_pt.x && cell_pt.x <= selection_tbl.max.x); - String8 cell_pre_edit_string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 0); + String8 cell_pre_edit_string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 0, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); //- rjf: unpack column-kind-specific info + E_Eval cell_eval = row->eval; B32 cell_can_edit = 0; FuzzyMatchRangeList cell_matches = {0}; String8 cell_error_string = {0}; @@ -2839,10 +2855,17 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS }break; case DF_WatchViewColumnKind_Value: { - if(row->eval.msgs.max_kind > E_MsgKind_Null) + }goto value_cell; + case DF_WatchViewColumnKind_Member: + { + cell_eval = e_member_eval_from_eval_member_name(cell_eval, str8(col->string_buffer, col->string_size)); + }goto value_cell; + value_cell:; + { + if(cell_eval.msgs.max_kind > E_MsgKind_Null) { String8List strings = {0}; - for(E_Msg *msg = row->eval.msgs.first; msg != 0; msg = msg->next) + for(E_Msg *msg = cell_eval.msgs.first; msg != 0; msg = msg->next) { str8_list_push(scratch.arena, &strings, msg->text); } @@ -2858,7 +2881,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { cell_ui_hook = row->value_ui_rule_spec->info.row_ui; } - if(row->eval.space >= E_Space_FIXED_COUNT) + if(cell_eval.space >= E_Space_FIXED_COUNT) { cell_base_color = df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol); } @@ -2866,7 +2889,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS case DF_WatchViewColumnKind_Type: { cell_can_edit = 0; - E_TypeKey key = row->eval.type_key; + E_TypeKey key = cell_eval.type_key; cell_base_color = df_rgba_from_theme_color(DF_ThemeColor_CodeType); }break; case DF_WatchViewColumnKind_ViewRule: @@ -2924,7 +2947,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); UI_Parent(box) { - cell_ui_hook(ws, row->key, row->eval, row->value_ui_rule_node); + cell_ui_hook(ws, row->key, cell_eval, row->value_ui_rule_node); } sig = ui_signal_from_box(box); } @@ -2944,12 +2967,12 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS else { sig = df_line_editf(ws, - (DF_LineEditFlag_CodeContents*(!(row->flags & DF_EvalVizRowFlag_ExprIsSpecial))| + (DF_LineEditFlag_CodeContents*(!(row->flags & DF_EvalVizRowFlag_ExprIsSpecial) || col->kind != DF_WatchViewColumnKind_Expr)| DF_LineEditFlag_NoBackground| DF_LineEditFlag_DisableEdit*(!cell_can_edit)| - DF_LineEditFlag_Expander*!!(x == 0 && row->flags & DF_EvalVizRowFlag_CanExpand)| + DF_LineEditFlag_Expander*!!(x == 0 && row->flags & DF_EvalVizRowFlag_CanExpand && col->kind == DF_WatchViewColumnKind_Expr)| DF_LineEditFlag_ExpanderPlaceholder*(x == 0 && row->depth==0 && col->kind == DF_WatchViewColumnKind_Expr)| - DF_LineEditFlag_ExpanderSpace*(x == 0 && row->depth!=0)), + DF_LineEditFlag_ExpanderSpace*(x == 0 && row->depth!=0 && col->kind == DF_WatchViewColumnKind_Expr)), x == 0 ? row->depth : 0, &cell_matches, &cell_edit_state->cursor, &cell_edit_state->mark, cell_edit_state->input_buffer, sizeof(cell_edit_state->input_buffer), &cell_edit_state->input_size, &next_row_expanded, @@ -2994,7 +3017,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // rjf: double-click, not editable -> go-to-location if(ui_double_clicked(sig) && !cell_can_edit) { - U64 vaddr = row->eval.value.u64; + U64 vaddr = cell_eval.value.u64; DF_Entity *module = df_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = df_dbgi_key_from_module(module); U64 voff = df_voff_from_vaddr(module, vaddr); @@ -6341,9 +6364,9 @@ DF_VIEW_SETUP_FUNCTION_DEF(CallStack) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_CallStack); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_FrameSelection, 0.05f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.7f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Module, 0.25f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_FrameSelection, 0.05f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.7f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Module, 0.25f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(CallStack) {return str8_zero();} DF_VIEW_CMD_FUNCTION_DEF(CallStack){} @@ -7601,10 +7624,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(Watch) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Watch); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) {return str8_zero();} DF_VIEW_CMD_FUNCTION_DEF(Watch) @@ -7627,10 +7650,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(Locals) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Locals); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Locals) { return str8_zero(); } DF_VIEW_CMD_FUNCTION_DEF(Locals) {} @@ -7649,10 +7672,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(Registers) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Registers); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Registers) { return str8_zero(); } DF_VIEW_CMD_FUNCTION_DEF(Registers) {} @@ -7671,10 +7694,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(Globals) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Globals); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Globals) { return str8_zero(); } DF_VIEW_CMD_FUNCTION_DEF(Globals) {} @@ -7693,10 +7716,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(ThreadLocals) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_ThreadLocals); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(ThreadLocals) { return str8_zero(); } DF_VIEW_CMD_FUNCTION_DEF(ThreadLocals) {} @@ -7715,10 +7738,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(Types) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Types); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Types) { return str8_zero(); } DF_VIEW_CMD_FUNCTION_DEF(Types) {} @@ -7737,9 +7760,9 @@ DF_VIEW_SETUP_FUNCTION_DEF(Procedures) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Procedures); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.2f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.6f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.2f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.2f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.6f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.2f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Procedures) { return str8_zero(); } DF_VIEW_CMD_FUNCTION_DEF(Procedures) {} @@ -8709,8 +8732,10 @@ DF_VIEW_SETUP_FUNCTION_DEF(Breakpoints) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Breakpoints); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.5f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.5f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.25f, str8_lit("Label")); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.45f, str8_lit("Location")); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.10f, str8_lit("Enabled")); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.20f, str8_lit("Hit Count")); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Breakpoints) {return str8_zero();} DF_VIEW_CMD_FUNCTION_DEF(Breakpoints) @@ -8908,8 +8933,8 @@ DF_VIEW_SETUP_FUNCTION_DEF(WatchPins) { DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_WatchPins); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.5f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.5f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.5f, str8_zero()); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.5f, str8_zero()); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(WatchPins) {return str8_zero();} DF_VIEW_CMD_FUNCTION_DEF(WatchPins) diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 79b3e602..6398e86a 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -278,6 +278,7 @@ typedef enum DF_WatchViewColumnKind DF_WatchViewColumnKind_ViewRule, DF_WatchViewColumnKind_Module, DF_WatchViewColumnKind_FrameSelection, + DF_WatchViewColumnKind_Member, DF_WatchViewColumnKind_COUNT } DF_WatchViewColumnKind; @@ -290,7 +291,7 @@ struct DF_WatchViewColumn DF_WatchViewColumnKind kind; F32 pct; U8 string_buffer[1024]; - U64 string_buffer_size; + U64 string_size; }; typedef enum DF_WatchViewFillKind @@ -548,13 +549,13 @@ internal DF_WatchViewPoint df_watch_view_point_from_tbl(DF_EvalVizBlockList *blo internal Vec2S64 df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt); //- rjf: table coordinates -> strings -internal String8 df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumn *col, B32 editable); +internal String8 df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumn *col, B32 editable, U32 default_radix, F_Tag font, F32 font_size, F32 max_size_px); //- rjf: table coordinates -> text edit state internal DF_WatchViewTextEditState *df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt); //- rjf: watch view column state mutation -internal DF_WatchViewColumn *df_watch_view_column_alloc(DF_WatchViewState *wv, DF_WatchViewColumnKind kind, F32 pct); +internal DF_WatchViewColumn *df_watch_view_column_alloc(DF_WatchViewState *wv, DF_WatchViewColumnKind kind, F32 pct, String8 string); internal void df_watch_view_column_release(DF_WatchViewState *wv, DF_WatchViewColumn *col); //- rjf: watch view main hooks diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index aef66b06..e3dc4172 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -282,3 +282,43 @@ e_element_eval_from_array_eval_index(E_Eval eval, U64 index) } return result; } + +internal E_Eval +e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name) +{ + E_Eval result = {0}; + { + Temp scratch = scratch_begin(0, 0); + E_MemberArray members = e_type_data_members_from_key(scratch.arena, eval.type_key); + for(U64 member_idx = 0; member_idx < members.count; member_idx += 1) + { + E_Member *member = &members.v[member_idx]; + if(str8_match(member->name, member_name, 0)) + { + result.mode = eval.mode; + result.space = eval.space; + result.type_key = member->type_key; + result.code = eval.code; + result.msgs = eval.msgs; + switch(eval.mode) + { + default:{}break; + case E_Mode_Value: + if(member->off < sizeof(eval.value)) + { + U64 member_size = e_type_byte_size_from_key(member->type_key); + MemoryCopy((U8 *)(&result.value.u512[0]), + (U8 *)(&eval.value.u512[0]) + member->off, + Min(member_size, sizeof(eval.value) - member->off)); + }break; + case E_Mode_Offset: + { + result.value.u64 = eval.value.u64 + member->off; + }break; + } + } + } + scratch_end(scratch); + } + return result; +} diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index 0d195c04..e41ab677 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -27,5 +27,6 @@ internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval); internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval); internal E_Eval e_value_eval_from_eval(E_Eval eval); internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index); +internal E_Eval e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name); #endif // EVAL_BUNDLES_H diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 85291e87..789ed72e 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -157,7 +157,7 @@ e_type_kind_is_basic_or_enum(E_TypeKind kind) } //////////////////////////////// -//~ rjf: Member List Building Functions +//~ rjf: Member Functions internal void e_member_list_push(Arena *arena, E_MemberList *list, E_Member *member) diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 75c31f11..99d8985d 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -212,7 +212,7 @@ internal B32 e_type_kind_is_signed(E_TypeKind kind); internal B32 e_type_kind_is_basic_or_enum(E_TypeKind kind); //////////////////////////////// -//~ rjf: Member List Building Functions +//~ rjf: Member Functions internal void e_member_list_push(Arena *arena, E_MemberList *list, E_Member *member); #define e_member_list_push_new(arena, list, ...) e_member_list_push((arena), (list), &(E_Member){.kind = E_MemberKind_DataField, __VA_ARGS__})