diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 4109b8a6..6b3d7a6e 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4526,6 +4526,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, E_MemberArray memb { MemoryCopyStruct(&filtered_members.v[idx], n->member); filtered_members.v[idx].name = push_str8_copy(arena, filtered_members.v[idx].name); + filtered_members.v[idx].inheritance_key_chain = e_type_key_list_copy(arena, &filtered_members.v[idx].inheritance_key_chain); } } scratch_end(scratch); @@ -5235,7 +5236,7 @@ df_expr_string_from_viz_row(Arena *arena, DF_EvalVizRow *row) { result = push_str8f(arena, "[%S]", e_string_from_expr(arena, row->expr->last)); }break; - case E_ExprKind_LeafMember: + case E_ExprKind_MemberAccess: { result = push_str8f(arena, ".%S", e_string_from_expr(arena, row->expr->last)); }break; diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index b149c578..0fc134f6 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6125,7 +6125,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && (!query_is_open || !ws->query_view_selected)) ? UI_FocusKind_Null : UI_FocusKind_Off) { //- rjf: eval -> viz artifacts - F32 row_height = floor_f32(ui_top_font_size()*2.5f); + F32 row_height = floor_f32(ui_top_font_size()*2.8f); DF_CfgTable cfg_table = {0}; U64 expr_hash = df_hash_from_string(expr); DF_EvalViewKey eval_view_key = df_eval_view_key_from_stringf("eval_hover_%I64x", expr_hash); @@ -6169,12 +6169,28 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } } + //- rjf: calculate width + F32 width_px = 40.f*ui_top_font_size(); + F32 expr_column_width_px = 10.f*ui_top_font_size(); + F32 value_column_width_px = 30.f*ui_top_font_size(); + if(viz_rows.first != 0) + { + DF_EvalVizRow *row = viz_rows.first; + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + String8 row_expr_string = df_expr_string_from_viz_row(scratch.arena, row); + 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->cfg_table); + expr_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_expr_string).x + ui_top_font_size()*2.5f; + value_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_display_value).x + ui_top_font_size()*2.5f; + F32 total_dim_px = (expr_column_width_px + value_column_width_px); + width_px = Min(80.f*ui_top_font_size(), total_dim_px*1.5f); + } + //- rjf: build hover eval box F32 hover_eval_container_height = ws->hover_eval_num_visible_rows_t; F32 corner_radius = ui_top_font_size()*0.25f; ui_set_next_fixed_x(ws->hover_eval_spawn_pos.x); ui_set_next_fixed_y(ws->hover_eval_spawn_pos.y); - ui_set_next_pref_width(ui_em(80.f, 1.f)); + ui_set_next_pref_width(ui_px(width_px, 1.f)); ui_set_next_pref_height(ui_px(hover_eval_container_height, 1.f)); ui_set_next_corner_radius_00(0); ui_set_next_corner_radius_01(corner_radius); @@ -6204,8 +6220,6 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //- rjf: build contents UI_Parent(hover_eval_box) UI_PrefHeight(ui_px(row_height, 1.f)) { - F32 expr_column_width_px = 0; - //- rjf: build rows for(DF_EvalVizRow *row = viz_rows.first; row != 0; row = row->next) { @@ -6217,31 +6231,32 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) B32 row_is_editable = df_type_key_is_editable(row_eval.type_key); B32 row_is_expandable = df_type_key_is_expandable(row_eval.type_key); - //- rjf: calculate width of exp row - if(row == viz_rows.first) - { - expr_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), row_display_value).x + ui_top_font_size()*2.5f; - expr_column_width_px = Max(expr_column_width_px, ui_top_font_size()*10.f); - } - - //- rjf: determine if row's data is fresh + //- rjf: determine if row's data is fresh and/or bad B32 row_is_fresh = 0; + B32 row_is_bad = 0; switch(row_eval.mode) { default:{}break; case E_Mode_Offset: + if(row_eval.space >= E_Space_FIXED_COUNT) { - // TODO(rjf): @spaces pick the right process from the eval's space - U64 size = e_type_byte_size_from_key(row_eval.type_key); - size = Min(size, 64); - Rng1U64 vaddr_rng = r1u64(row_eval.value.u64, row_eval.value.u64+size); - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); - for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) + DF_Entity *space_entity = (DF_Entity *)row_eval.space; + if(space_entity->kind == DF_EntityKind_Process) { - if(slice.byte_changed_flags[idx] != 0) + U64 size = e_type_byte_size_from_key(row_eval.type_key); + size = Min(size, 64); + Rng1U64 vaddr_rng = r1u64(row_eval.value.u64, row_eval.value.u64+size); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->ctrl_machine_id, space_entity->ctrl_handle, vaddr_rng, 0); + for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) { - row_is_fresh = 1; - break; + if(slice.byte_changed_flags[idx] != 0) + { + row_is_fresh = 1; + } + if(slice.byte_bad_flags[idx] != 0) + { + row_is_bad = 1; + } } } }break; @@ -6251,11 +6266,18 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) UI_WidthFill UI_Row { ui_spacer(ui_em(0.75f, 1.f)); - ui_spacer(ui_em(1.5f*row->depth, 1.f)); + if(row->depth > 0) + { + for(S32 indent = 0; indent < row->depth; indent += 1) + { + ui_spacer(ui_em(0.75f, 1.f)); + UI_Flags(UI_BoxFlag_DrawSideLeft) ui_spacer(ui_em(1.5f, 1.f)); + } + } U64 row_hash = df_hash_from_expand_key(row->key); B32 row_is_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); if(row_is_expandable) - UI_PrefWidth(ui_em(1.5f, 1)) UI_Flags(UI_BoxFlag_DrawSideLeft*(row->depth>0)) + UI_PrefWidth(ui_em(1.5f, 1)) if(ui_pressed(ui_expanderf(row_is_expanded, "###%I64x_%I64x_is_expanded", row->key.parent_hash, row->key.child_num))) { df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, row->parent_key, row->key, !row_is_expanded); @@ -6263,7 +6285,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) if(!row_is_expandable) { UI_PrefWidth(ui_em(1.5f, 1)) - UI_Flags(UI_BoxFlag_DrawSideLeft*(row->depth>0) | UI_BoxFlag_DrawTextWeak) + UI_Flags(UI_BoxFlag_DrawTextWeak) DF_Font(ws, DF_FontSlot_Icons) ui_label(df_g_icon_kind_text_table[DF_IconKind_Dot]); } @@ -8410,7 +8432,7 @@ df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 if(!did_content && ptee_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) { did_content = 1; - if(depth<4) + if(depth < 4) { E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr); E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr); diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c index d6cd1711..5b5bbbb0 100644 --- a/src/df/gfx/df_view_rules.c +++ b/src/df/gfx/df_view_rules.c @@ -28,11 +28,11 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) direct_type_kind == E_TypeKind_Class))) { // rjf: type -> filtered data members - E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); + E_MemberArray data_members = e_type_data_members_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); E_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(arena, data_members, cfg_table); // rjf: build blocks for all members, split by sub-expansions - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Members, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); + DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Members, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth); { last_vb->expr = expr; last_vb->cfg_table = cfg_table; @@ -66,7 +66,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) } // rjf: recurse for child - df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, str8_zero(), child_expr, child_cfg_table, depth+1, out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, str8_zero(), child_expr, child_cfg_table, depth, out); } df_eval_viz_block_end(out, last_vb); } @@ -80,7 +80,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) (e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Enum)) { E_Type *type = e_type_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); + DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth); { last_vb->expr = expr; last_vb->cfg_table = cfg_table; @@ -102,7 +102,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) U64 array_count = array_type->count; // rjf: build blocks for all elements, split by sub-expansions - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); + DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth); { last_vb->expr = expr; last_vb->cfg_table = cfg_table; @@ -135,7 +135,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) } // rjf: recurse for child - df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, str8_zero(), child_expr, child_cfg_table, depth+1, out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, str8_zero(), child_expr, child_cfg_table, depth, out); } df_eval_viz_block_end(out, last_vb); } @@ -162,7 +162,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) // rjf: recurse for child E_Expr *child_expr = e_expr_ref_deref(arena, expr); - df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child_key, str8_zero(), child_expr, child_cfg_table, depth+1, out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child_key, str8_zero(), child_expr, child_cfg_table, depth, out); } scratch_end(scratch); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 0d5e1a92..d84c6b19 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -692,7 +692,7 @@ e_expr_ref_deref(Arena *arena, E_Expr *rhs) E_Expr *root = e_push_expr(arena, E_ExprKind_Deref, 0); E_Expr *rhs_ref = e_expr_ref(arena, rhs); e_expr_push_child(root, rhs_ref); - return rhs_ref; + return root; } //////////////////////////////// @@ -743,6 +743,9 @@ e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8List *out) str8_list_pushf(arena, out, "\"%S\"", expr->string); }break; case E_ExprKind_LeafU64: + { + str8_list_pushf(arena, out, "%I64u", expr->u64); + }break; case E_ExprKind_LeafID: { str8_list_pushf(arena, out, "0x%I64x", expr->u64); @@ -760,6 +763,10 @@ e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8List *out) String8 type_string = e_type_string_from_key(arena, expr->type_key); str8_list_push(arena, out, type_string); }break; + case E_ExprKind_Ref: + { + e_append_strings_from_expr(arena, expr->ref, out); + }break; } }