From e705907ec076e1654c25fa7bb9ee258393eeafee Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 26 Sep 2024 08:09:22 -0700 Subject: [PATCH] checkpoint in moving existing watch views to new block-tree visualization structure --- .../eval_visualization.mdesk | 2 +- .../eval_visualization_builtin_view_rules.c | 10 +- .../eval_visualization_core.c | 105 ++++++---- .../eval_visualization_core.h | 40 ++-- .../generated/eval_visualization.meta.c | 22 +- src/raddbg/raddbg_core.c | 20 +- src/raddbg/raddbg_views.c | 198 ++++++++---------- src/raddbg/raddbg_views.h | 9 +- 8 files changed, 208 insertions(+), 198 deletions(-) diff --git a/src/eval_visualization/eval_visualization.mdesk b/src/eval_visualization/eval_visualization.mdesk index 7fcf0ec4..0a82af2f 100644 --- a/src/eval_visualization/eval_visualization.mdesk +++ b/src/eval_visualization/eval_visualization.mdesk @@ -121,5 +121,5 @@ EV_ViewRuleTable: @data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table: { @expand(EV_ViewRuleTable a) - ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), $(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; + ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), $(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; } diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index 914bb420..1f876e6a 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -179,7 +179,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default) EV_ExpandInfo result = {0}; { result.user_data = accel; - result.total_semantic_row_count = result.total_visual_row_count = total_row_count; + result.row_count = total_row_count; } scratch_end(scratch); @@ -201,13 +201,11 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) result.row_exprs_count = Min(needed_row_count, members->count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { E_Member *member = &members->v[idx_range.min + row_expr_idx]; result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name); result.row_members[row_expr_idx] = member; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } @@ -220,13 +218,11 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) result.row_exprs_count = Min(needed_row_count, enumvals->count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { E_EnumVal *enumval = &enumvals->v[idx_range.min + row_expr_idx]; result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } @@ -239,12 +235,10 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) result.row_exprs_count = Min(needed_row_count, accel->array_count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { result.row_exprs[row_expr_idx] = e_expr_ref_array_index(arena, array_expr, idx_range.min + row_expr_idx); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } @@ -256,10 +250,8 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) result.row_exprs_count = 1; result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); result.row_exprs[0] = e_expr_ref_deref(arena, expr); result.row_members[0] = &e_member_nil; - result.row_exprs_num_visual_rows[0] = 1; } return result; diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 723a3845..befa79a7 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -6,6 +6,36 @@ #include "generated/eval_visualization.meta.c" +//////////////////////////////// +//~ rjf: Nil/Identity View Rule Hooks + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity) +{ + return expr; +} + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil) +{ + EV_ExpandInfo info = {0}; + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil) +{ + EV_ExpandRangeInfo info = {0}; + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity) +{ + return num; +} + +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity) +{ + return id; +} + //////////////////////////////// //~ rjf: Key Functions @@ -27,6 +57,13 @@ ev_key_zero(void) return key; } +internal EV_Key +ev_key_root(void) +{ + EV_Key key = ev_key_make(5381, 1); + return key; +} + internal B32 ev_key_match(EV_Key a, EV_Key b) { @@ -472,19 +509,6 @@ ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src) return dst; } -//////////////////////////////// -//~ rjf: View Rule Expansion ID Spaces - -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity) -{ - return num; -} - -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity) -{ - return id; -} - //////////////////////////////// //~ rjf: View Rule Expression Resolution @@ -518,13 +542,13 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 st //- rjf: generate root block tree.root = push_array(arena, EV2_Block, 1); MemoryCopyStruct(tree.root, &ev2_nil_block); - tree.root->key = ev_key_make(5381, 1); + tree.root->key = ev_key_root(); tree.root->string = string; tree.root->expr = expr; tree.root->view_rules = view_rules; - tree.root->semantic_row_count = tree.root->visual_row_count = 1; - tree.total_semantic_row_count += 1; - tree.total_visual_row_count += 1; + tree.root->row_count = 1; + tree.total_row_count += 1; + tree.total_item_count += 1; //- rjf: iterate all expansions & generate blocks for each typedef struct Task Task; @@ -567,25 +591,29 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 st EV_ExpandInfo expand_info = expand_view_rule_info->expr_expand_info(arena, view, filter, t->expr, expand_params); // rjf: generate block for expansion - EV2_Block *expansion_block = push_array(arena, EV2_Block, 1); - MemoryCopyStruct(expansion_block, &ev2_nil_block); - DLLPushBack_NPZ(&ev2_nil_block, t->parent_block->first, t->parent_block->last, expansion_block, next, prev); - expansion_block->parent = t->parent_block; - expansion_block->key = t->key; - expansion_block->split_relative_idx = t->split_relative_idx; - expansion_block->expr = t->expr; - expansion_block->view_rules = t->view_rules; - expansion_block->expand_view_rule_info = expand_view_rule_info; - expansion_block->expand_view_rule_params = expand_params; - expansion_block->expand_view_rule_info_user_data = expand_info.user_data; - expansion_block->semantic_row_count = expand_info.total_semantic_row_count; - expansion_block->visual_row_count = expand_info.total_visual_row_count; - tree.total_semantic_row_count += expand_info.total_semantic_row_count; - tree.total_visual_row_count += expand_info.total_visual_row_count; + EV2_Block *expansion_block = &ev2_nil_block; + if(expand_info.row_count != 0) + { + expansion_block = push_array(arena, EV2_Block, 1); + MemoryCopyStruct(expansion_block, &ev2_nil_block); + DLLPushBack_NPZ(&ev2_nil_block, t->parent_block->first, t->parent_block->last, expansion_block, next, prev); + expansion_block->parent = t->parent_block; + expansion_block->key = t->key; + expansion_block->split_relative_idx = t->split_relative_idx; + expansion_block->expr = t->expr; + expansion_block->view_rules = t->view_rules; + expansion_block->expand_view_rule_info = expand_view_rule_info; + expansion_block->expand_view_rule_params = expand_params; + expansion_block->expand_view_rule_info_user_data = expand_info.user_data; + expansion_block->row_count = expand_info.row_count; + expansion_block->single_item = expand_info.single_item; + tree.total_row_count += expand_info.row_count; + tree.total_item_count += expand_info.single_item ? 1 : expand_info.row_count; + } // rjf: iterate children expansions, recurse // TODO(rjf): need to iterate these in index order, rather than "child_num" (which needs to be renamed to "child_id") order - if(expand_view_rule_info->expr_expand_range_info) + if(expand_info.row_count != 0 && expand_view_rule_info->expr_expand_range_info) { for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next) { @@ -701,7 +729,7 @@ ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree) Rng1U64 block_relative_range; }; U64 base_num = 1; - BlockTask start_task = {0, block_tree->root, block_tree->root->first, r1u64(0, block_tree->root->visual_row_count)}; + BlockTask start_task = {0, block_tree->root, block_tree->root->first, r1u64(0, block_tree->root->row_count)}; for(BlockTask *t = &start_task; t != 0; t = t->next) { // rjf: get block-relative range, truncated by split position of next child @@ -731,7 +759,7 @@ ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree) t->next = child_task; child_task->block = t->next_child; child_task->next_child = t->next_child->first; - child_task->block_relative_range = r1u64(0, t->next_child->visual_row_count); + child_task->block_relative_range = r1u64(0, t->next_child->row_count); // rjf: generate task for post-child rows, if any, after children Rng1U64 remainder_range = r1u64(t->next_child->split_relative_idx+1, t->block_relative_range.max); @@ -801,7 +829,7 @@ ev2_num_from_key(EV2_BlockRangeList *block_ranges, EV_Key key) U64 hash = ev_hash_from_key(n->v.block->key); if(hash == key.parent_hash) { - U64 relative_num = n->v.block->expand_view_rule_info->expr_expand_num_from_id(relative_num, n->v.block->expand_view_rule_info_user_data); + U64 relative_num = n->v.block->expand_view_rule_info->expr_expand_num_from_id(key.child_num, n->v.block->expand_view_rule_info_user_data); result = (base_num - 1) + relative_num; break; } @@ -861,7 +889,7 @@ ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 rows.count += 1; row->block = n->v.block; row->key = n->v.block->key; - row->visual_size = n->v.block->visual_row_count; + row->visual_size = n->v.block->single_item ? n->v.block->row_count : 1; row->visual_size_skipped = 0; // TODO(rjf) row->visual_size_chopped = 0; // TODO(rjf) row->string = n->v.block->string; @@ -876,7 +904,6 @@ ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 EV_ExpandRangeInfo expand_range_info = n->v.block->expand_view_rule_info->expr_expand_range_info(arena, view, filter, n->v.block->expr, n->v.block->expand_view_rule_params, block_relative_range__windowed, n->v.block->expand_view_rule_info_user_data); for EachIndex(idx, expand_range_info.row_exprs_count) { - U64 row_visual_size = expand_range_info.row_exprs_num_visual_rows[idx]; U64 child_num = block_relative_range.min + idx + 1; U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(child_num, n->v.block->expand_view_rule_info_user_data); EV2_Row *row = push_array(arena, EV2_Row, 1); @@ -884,7 +911,7 @@ ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 rows.count += 1; row->block = n->v.block; row->key = ev_key_make(ev_hash_from_key(row->block->key), child_id); - row->visual_size = row_visual_size; + row->visual_size = 1; row->visual_size_skipped = 0; // TODO(rjf) row->visual_size_chopped = 0; // TODO(rjf) row->string = n->v.block->string; diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index e8b94238..5588f3ae 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -164,8 +164,8 @@ typedef struct EV_ExpandInfo EV_ExpandInfo; struct EV_ExpandInfo { void *user_data; - U64 total_semantic_row_count; - U64 total_visual_row_count; + U64 row_count; + B32 single_item; // all rows form a single "item" - a singular, but large, row }; typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo; @@ -174,7 +174,6 @@ struct EV_ExpandRangeInfo U64 row_exprs_count; E_Expr **row_exprs; E_Member **row_members; - U64 *row_exprs_num_visual_rows; }; #define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(name) E_Expr *name(Arena *arena, E_Expr *expr, MD_Node *params) @@ -288,16 +287,16 @@ struct EV2_Block void *expand_view_rule_info_user_data; // rjf: expansion info - U64 semantic_row_count; - U64 visual_row_count; + U64 row_count; + B32 single_item; }; typedef struct EV2_BlockTree EV2_BlockTree; struct EV2_BlockTree { EV2_Block *root; - U64 total_semantic_row_count; - U64 total_visual_row_count; + U64 total_row_count; + U64 total_item_count; }; typedef struct EV2_BlockRange EV2_BlockRange; @@ -432,10 +431,28 @@ struct EV_WindowedRowList U64 count_before_semantic; }; +//////////////////////////////// +//~ rjf: Nil/Identity View Rule Hooks + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity); + //////////////////////////////// //~ rjf: Globals -global read_only EV_ViewRuleInfo ev_nil_view_rule_info = {0}; +global read_only EV_ViewRuleInfo ev_nil_view_rule_info = +{ + {0}, + 0, + EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), + EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), + EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), + EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), + EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), +}; thread_static EV_ViewRuleInfoTable *ev_view_rule_info_table = 0; global read_only EV_ViewRuleList ev_nil_view_rule_list = {0}; thread_static EV_AutoViewRuleTable *ev_auto_view_rule_table = 0; @@ -446,6 +463,7 @@ global read_only EV2_Block ev2_nil_block = {&ev2_nil_block, &ev2_nil_block, &ev2 internal EV_Key ev_key_make(U64 parent_hash, U64 child_num); internal EV_Key ev_key_zero(void); +internal EV_Key ev_key_root(void); internal B32 ev_key_match(EV_Key a, EV_Key b); internal U64 ev_hash_from_seed_string(U64 seed, String8 string); internal U64 ev_hash_from_key(EV_Key key); @@ -495,12 +513,6 @@ internal EV_ViewRuleList *ev_view_rule_list_from_string(Arena *arena, String8 st internal EV_ViewRuleList *ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src); internal EV_ViewRuleList *ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src); -//////////////////////////////// -//~ rjf: View Rule Expansion ID Spaces - -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity); - //////////////////////////////// //~ rjf: View Rule Expression Resolution diff --git a/src/eval_visualization/generated/eval_visualization.meta.c b/src/eval_visualization/generated/eval_visualization.meta.c index 8baa1ca3..312e61d3 100644 --- a/src/eval_visualization/generated/eval_visualization.meta.c +++ b/src/eval_visualization/generated/eval_visualization.meta.c @@ -6,17 +6,17 @@ C_LINKAGE_BEGIN EV_ViewRuleInfo ev_builtin_view_rule_info_table[11] = { -{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(default) , }, -{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, -{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(default) , }, +{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, +{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), 0, }, }; C_LINKAGE_END diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index f9edea3a..628c0874 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5838,7 +5838,7 @@ rd_window_frame(RD_Window *ws) // rjf: animate height { F32 fish_rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * rd_state->frame_dt)) : 1.f; - F32 hover_eval_container_height_target = row_height * Min(30, block_tree.total_visual_row_count); + F32 hover_eval_container_height_target = row_height * Min(30, block_tree.total_row_count); ws->hover_eval_num_visible_rows_t += (hover_eval_container_height_target - ws->hover_eval_num_visible_rows_t) * fish_rate; if(abs_f32(hover_eval_container_height_target - ws->hover_eval_num_visible_rows_t) > 0.5f) { @@ -7898,7 +7898,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches) accel->entities = rd_entity_array_from_list(arena, &entities_filtered); } scratch_end(scratch); - EV_ExpandInfo info = {accel, accel->entities.count, accel->entities.count}; + EV_ExpandInfo info = {accel, accel->entities.count}; return info; } @@ -7915,7 +7915,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches) { result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->entities.v[idx_range.min + row_expr_idx]->string); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } return result; @@ -7956,7 +7955,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(locals) } String8Array *accel = push_array(arena, String8Array, 1); *accel = str8_array_from_list(arena, &exprs_filtered); - EV_ExpandInfo info = {accel, accel->count, accel->count}; + EV_ExpandInfo info = {accel, accel->count}; scratch_end(scratch); return info; } @@ -7974,7 +7973,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(locals) { result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->v[idx_range.min + row_expr_idx]); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } return result; @@ -7995,7 +7993,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(registers) accel->v = push_array(arena, String8, accel->count); MemoryCopy(accel->v + 0, reg_strings, reg_count); MemoryCopy(accel->v + reg_count, alias_strings, alias_count); - EV_ExpandInfo info = {accel, accel->count, accel->count}; + EV_ExpandInfo info = {accel, accel->count}; return info; } @@ -8013,7 +8011,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(registers) String8 string = push_str8f(arena, "reg:%S", accel->v[idx_range.min + row_expr_idx]); result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, string); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } return result; @@ -8241,7 +8238,7 @@ rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, Str accel->entities = rd_entity_array_from_list(arena, &entities_filtered); } scratch_end(scratch); - EV_ExpandInfo info = {accel, accel->entities.count, accel->entities.count}; + EV_ExpandInfo info = {accel, accel->entities.count}; return info; } @@ -8260,7 +8257,6 @@ rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *vie String8 entity_expr_string = push_str8f(arena, "$%I64u", accel->entities.v[idx_range.min + row_expr_idx]->id); result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } return result; @@ -8286,7 +8282,7 @@ rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view accel->entities = ctrl_entity_array_from_list(arena, &entities_filtered); } scratch_end(scratch); - EV_ExpandInfo info = {accel, accel->entities.count, accel->entities.count}; + EV_ExpandInfo info = {accel, accel->entities.count}; return info; } @@ -8306,7 +8302,6 @@ rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View String8 entity_expr_string = push_str8f(arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]); result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } return result; @@ -8349,7 +8344,7 @@ rd_ev_view_rule_expr_expand_info__debug_info_tables(Arena *arena, EV_View *view, scratch_end(scratch); } - EV_ExpandInfo info = {accel, accel->items.count, accel->items.count}; + EV_ExpandInfo info = {accel, accel->items.count}; return info; } @@ -8457,7 +8452,6 @@ rd_ev_view_rule_expr_expand_range_info__debug_info_tables(Arena *arena, EV_View // rjf: fill result.row_exprs[row_expr_idx] = item_expr; result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; } } return result; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index a11266c9..245ba90a 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -793,28 +793,28 @@ rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b) } internal RD_WatchViewPoint -rd_watch_view_point_from_tbl(EV_BlockList *blocks, Vec2S64 tbl) +rd_watch_view_point_from_tbl(EV2_BlockRangeList *block_ranges, Vec2S64 tbl) { RD_WatchViewPoint pt = zero_struct; pt.x = tbl.x; - pt.key = ev_key_from_block_list_row_num(blocks, tbl.y); - pt.parent_key = ev_parent_key_from_block_list_row_num(blocks, tbl.y); + pt.key = ev2_key_from_num(block_ranges, tbl.y); + pt.parent_key = ev2_block_range_from_num(block_ranges, tbl.y).block->key; return pt; } internal Vec2S64 -rd_tbl_from_watch_view_point(EV_BlockList *blocks, RD_WatchViewPoint pt) +rd_tbl_from_watch_view_point(EV2_BlockRangeList *block_ranges, RD_WatchViewPoint pt) { Vec2S64 tbl = {0}; tbl.x = pt.x; - tbl.y = ev_row_num_from_block_list_key(blocks, pt.key); + tbl.y = ev2_num_from_key(block_ranges, pt.key); return tbl; } //- rjf: table coordinates -> strings internal String8 -rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px) +rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV2_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px) { String8 result = {0}; EV_ViewRuleList *view_rules = row->view_rules; @@ -828,7 +828,7 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa default:{}break; case RD_WatchViewColumnKind_Expr: { - result = ev_expr_string_from_row(arena, row, string_flags); + result = ev2_expr_string_from_row(arena, row, string_flags); }break; case RD_WatchViewColumnKind_Value: { @@ -1028,19 +1028,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ////////////////////////////// //- rjf: consume events & perform navigations/edits - calculate state // - typedef struct FrameRow FrameRow; - struct FrameRow - { - void *regs; - RDI_Parsed *rdi; - RDI_Procedure *procedure; - RDI_InlineSite *inline_site; - U64 unwind_idx; - U64 inline_depth; - }; - U64 frame_rows_count = 0; - FrameRow *frame_rows = 0; - EV_BlockList blocks = {0}; + EV2_BlockTree block_tree = {0}; + EV2_BlockRangeList block_ranges = {0}; UI_ScrollListRowBlockArray row_blocks = {0}; Vec2S64 cursor_tbl = {0}; Vec2S64 mark_tbl = {0}; @@ -1058,8 +1047,12 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // if(state_dirty) { - MemoryZeroStruct(&blocks); - mutable_entity_kind = RD_EntityKind_Watch; + MemoryZeroStruct(&block_tree); + MemoryZeroStruct(&block_ranges); + ev_key_set_expansion(eval_view, ev_key_zero(), ev_key_root(), 1); + block_tree = ev2_block_tree_from_string(scratch.arena, eval_view, filter, root_expr, top_level_view_rules); + block_ranges = ev2_block_range_list_from_tree(scratch.arena, &block_tree); +#if 0 // TODO(rjf): @blocks EV_Key root_parent_key = ev_key_make(5381, 0); EV_Key root_key = ev_key_make(ev_hash_from_key(root_parent_key), 1); ev_key_set_expansion(eval_view, root_parent_key, root_key, 1); @@ -1068,6 +1061,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo blocks.count -= 1; blocks.total_visual_row_count -= 1; blocks.total_semantic_row_count -= 1; +#endif } ////////////////////////// @@ -1075,24 +1069,25 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // EV_Key empty_row_parent_key = ev_key_make(max_U64, max_U64); EV_Key empty_row_key = ev_key_make(ev_hash_from_key(empty_row_parent_key), 1); +#if 0 // TODO(rjf): @blocks if(state_dirty && modifiable && filter.size == 0) { EV_Block *b = ev_block_begin(scratch.arena, EV_BlockKind_Null, empty_row_parent_key, empty_row_key, 0); b->visual_idx_range = b->semantic_idx_range = r1u64(0, 1); ev_block_end(&blocks, b); } +#endif ////////////////////////// - //- rjf: viz blocks -> ui row blocks + //- rjf: block ranges -> ui row blocks // { UI_ScrollListRowBlockChunkList row_block_chunks = {0}; - for(EV_BlockNode *n = blocks.first; n != 0; n = n->next) + for(EV2_BlockRangeNode *n = block_ranges.first; n != 0; n = n->next) { - EV_Block *vb = &n->v; UI_ScrollListRowBlock block = {0}; - block.row_count = dim_1u64(vb->visual_idx_range); - block.item_count = dim_1u64(vb->semantic_idx_range); + block.row_count = n->v.block->row_count; + block.item_count = n->v.block->single_item ? 1 : dim_1u64(n->v.range); ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block); } row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks); @@ -1126,7 +1121,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { EV_Key last_key = points[point_idx].pt_state->key; EV_Key last_parent_key = points[point_idx].pt_state->parent_key; - points[point_idx].pt_state[0] = rd_watch_view_point_from_tbl(&blocks, points[point_idx].pt_tbl); + points[point_idx].pt_state[0] = rd_watch_view_point_from_tbl(&block_ranges, points[point_idx].pt_tbl); if(ev_key_match(ev_key_zero(), points[point_idx].pt_state->key)) { points[point_idx].pt_state->key = last_parent_key; @@ -1155,8 +1150,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //- rjf: stable cursor state * blocks -> 2D table coordinates // { - cursor_tbl = rd_tbl_from_watch_view_point(&blocks, ewv->cursor); - mark_tbl = rd_tbl_from_watch_view_point(&blocks, ewv->mark); + cursor_tbl = rd_tbl_from_watch_view_point(&block_ranges, ewv->cursor); + mark_tbl = rd_tbl_from_watch_view_point(&block_ranges, ewv->mark); selection_tbl = r2s64p(Min(cursor_tbl.x, mark_tbl.x), Min(cursor_tbl.y, mark_tbl.y), Max(cursor_tbl.x, mark_tbl.x), Max(cursor_tbl.y, mark_tbl.y)); } @@ -1166,7 +1161,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // if(snap_to_cursor) { - Rng1S64 item_range = r1s64(0, 1 + blocks.total_visual_row_count); + Rng1S64 item_range = r1s64(0, 1 + block_tree.total_row_count); Rng1S64 scroll_row_idx_range = r1s64(item_range.min, ClampBot(item_range.min, item_range.max-1)); S64 cursor_item_idx = cursor_tbl.y-1; if(item_range.min <= cursor_item_idx && cursor_item_idx <= item_range.max) @@ -1242,9 +1237,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo 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, RD_WatchViewTextEditState*, ewv->text_edit_state_slots_count); - EV_WindowedRowList rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, 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); - EV_Row *row = rows.first; + EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(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)); + EV2_Row *row = rows.first; for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) { for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) @@ -1252,7 +1247,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); String8 string = rd_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, string_flags, 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)); - RD_WatchViewPoint pt = {x, row->parent_key, row->key}; + RD_WatchViewPoint pt = {x, row->block->key, row->key}; U64 hash = ev_hash_from_key(pt.key); U64 slot_idx = hash%ewv->text_edit_state_slots_count; RD_WatchViewTextEditState *edit_state = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState, 1); @@ -1273,15 +1268,15 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept) { - EV_WindowedRowList rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, 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); - EV_Row *row = rows.first; + EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(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)); + EV2_Row *row = rows.first; for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) { - if(selection_tbl.min.x <= 0 && ev_row_is_expandable(row)) + if(selection_tbl.min.x <= 0 && ev2_row_is_expandable(row)) { B32 is_expanded = ev_expansion_from_key(eval_view, row->key); - ev_key_set_expansion(eval_view, row->parent_key, row->key, !is_expanded); + ev_key_set_expansion(eval_view, row->block->key, row->key, !is_expanded); taken = 1; } RD_ViewRuleInfo *view_rule_info = &rd_nil_view_rule_info; @@ -1295,6 +1290,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo view_rule_params_root = n->v.root; } } +#if 0 // TODO(rjf): @blocks if(view_rule_info != &rd_nil_view_rule_info && row->block_kind == EV_BlockKind_Canvas) { rd_cmd(RD_CmdKind_OpenTab, @@ -1302,6 +1298,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo .params_tree = view_rule_params_root); taken = 1; } +#endif } } @@ -1314,6 +1311,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo selection_tbl.min.x == 1) { taken = 1; +#if 0 // TODO(rjf): @blocks EV_WindowedRowList rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, 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); EV_Row *row = rows.first; @@ -1350,6 +1348,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo .unwind_count = frame_row->unwind_idx, .inline_depth = frame_row->inline_depth); } +#endif } ////////////////////////// @@ -1371,7 +1370,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { - RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&blocks, v2s64(x, y)); + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, v2s64(x, y)); RD_WatchViewTextEditState *edit_state = rd_watch_view_text_edit_state_from_pt(ewv, pt); String8 string = str8(edit_state->input_buffer, edit_state->input_size); UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark); @@ -1426,7 +1425,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo case RD_WatchViewColumnKind_Expr: if(modifiable && filter.size == 0) { - RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&blocks, tbl); + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); if(!rd_entity_is_nil(watch)) { @@ -1449,8 +1448,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo case RD_WatchViewColumnKind_Value: if(editing_complete && evt->slot != UI_EventActionSlot_Cancel) { - EV_WindowedRowList rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, r1s64(ui_scroll_list_row_from_item(&row_blocks, y-1), - ui_scroll_list_row_from_item(&row_blocks, y-1)+1), &blocks); + EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, y-1), + ui_scroll_list_row_from_item(&row_blocks, y-1)+1)); B32 success = 0; if(rows.first != 0) { @@ -1471,7 +1470,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo case RD_WatchViewColumnKind_ViewRule: if(editing_complete) { - RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&blocks, tbl); + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); ev_key_set_view_rule(eval_view, pt.key, new_string); RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); RD_Entity *view_rule = rd_entity_child_from_kind(watch, RD_EntityKind_ViewRule); @@ -1507,9 +1506,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { taken = 1; String8List strs = {0}; - EV_WindowedRowList rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, 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); - EV_Row *row = rows.first; + EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(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)); + EV2_Row *row = rows.first; for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) { for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) @@ -1550,13 +1549,13 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo snap_to_cursor = 1; for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1) { - RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&blocks, v2s64(0, y)); + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y)); // rjf: row deletions if(selection_tbl.min.x <= 0) { - RD_WatchViewPoint fallback_pt_prev = rd_watch_view_point_from_tbl(&blocks, v2s64(0, y - 1)); - RD_WatchViewPoint fallback_pt_next = rd_watch_view_point_from_tbl(&blocks, v2s64(0, y + 1)); + RD_WatchViewPoint fallback_pt_prev = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y - 1)); + RD_WatchViewPoint fallback_pt_next = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y + 1)); RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); if(!rd_entity_is_nil(watch)) { @@ -1603,7 +1602,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo if(!ewv->text_editing && !(evt->flags & UI_EventFlag_Delete) && !(evt->flags & UI_EventFlag_Reorder)) { B32 cursor_tbl_min_is_empty_selection[Axis2_COUNT] = {0, 1}; - Rng2S64 cursor_tbl_range = r2s64(v2s64(0, 0), v2s64(ewv->column_count-1, blocks.total_semantic_row_count)); + Rng2S64 cursor_tbl_range = r2s64(v2s64(0, 0), v2s64(ewv->column_count-1, block_tree.total_row_count)); Vec2S32 delta = evt->delta_2s32; if(evt->flags & UI_EventFlag_PickSelectSide && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) { @@ -1689,9 +1688,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo if(!ewv->text_editing && evt->flags & UI_EventFlag_Reorder) { taken = 1; - EV_Key first_watch_key = ev_key_from_block_list_row_num(&blocks, selection_tbl.min.y); - EV_Key reorder_group_prev_watch_key = ev_key_from_block_list_row_num(&blocks, selection_tbl.min.y - 1); - EV_Key reorder_group_next_watch_key = ev_key_from_block_list_row_num(&blocks, selection_tbl.max.y + 1); + EV_Key first_watch_key = ev2_key_from_num(&block_ranges, selection_tbl.min.y); + EV_Key reorder_group_prev_watch_key = ev2_key_from_num(&block_ranges, selection_tbl.min.y - 1); + EV_Key reorder_group_next_watch_key = ev2_key_from_num(&block_ranges, selection_tbl.max.y + 1); RD_Entity *reorder_group_prev = rd_entity_from_ev_key_and_kind(reorder_group_prev_watch_key, mutable_entity_kind); RD_Entity *reorder_group_next = rd_entity_from_ev_key_and_kind(reorder_group_next_watch_key, mutable_entity_kind); RD_Entity *first_watch = rd_entity_from_ev_key_and_kind(first_watch_key, mutable_entity_kind); @@ -1700,7 +1699,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { for(S64 y = selection_tbl.min.y+1; y <= selection_tbl.max.y; y += 1) { - EV_Key key = ev_key_from_block_list_row_num(&blocks, y); + EV_Key key = ev2_key_from_num(&block_ranges, y); RD_Entity *new_last = rd_entity_from_ev_key_and_kind(key, mutable_entity_kind); if(!rd_entity_is_nil(new_last)) { @@ -1763,19 +1762,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo scroll_list_params.flags = UI_ScrollListFlag_All; scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, blocks.total_semantic_row_count)); - scroll_list_params.item_range = r1s64(0, blocks.total_visual_row_count + 1*!(flags & RD_WatchViewFlag_NoHeader)); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, block_tree.total_item_count)); + scroll_list_params.item_range = r1s64(0, block_tree.total_row_count); scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - UI_ScrollListRowBlockChunkList row_block_chunks = {0}; - for(EV_BlockNode *n = blocks.first; n != 0; n = n->next) - { - EV_Block *vb = &n->v; - UI_ScrollListRowBlock block = {0}; - block.row_count = dim_1u64(vb->visual_idx_range); - block.item_count = dim_1u64(vb->semantic_idx_range); - ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block); - } - scroll_list_params.row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks); + scroll_list_params.row_blocks = row_blocks; } UI_BoxFlags disabled_flags = ui_top_flags(); if(d_ctrl_targets_running()) @@ -1797,7 +1787,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //////////////////////////// //- rjf: build table header // - if(~flags & RD_WatchViewFlag_NoHeader && visible_row_rng.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + if(0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) { for(RD_WatchViewColumn *col = ewv->first_column; col != 0; col = col->next) UI_TableCell @@ -1867,12 +1857,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //////////////////////////// //- rjf: viz blocks -> rows // - EV_WindowedRowList rows = {0}; + EV2_WindowedRowList rows = {0}; { - rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, - r1s64(visible_row_rng.min - 1*!(flags & RD_WatchViewFlag_NoHeader), - visible_row_rng.max + 1*!!(flags & RD_WatchViewFlag_NoHeader)), - &blocks); + rows = ev2_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(visible_row_rng.min, visible_row_rng.max + 1)); } //////////////////////////// @@ -1881,29 +1868,26 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ProfScope("build table") { U64 semantic_idx = rows.count_before_semantic; - for(EV_Row *row = rows.first; row != 0; row = row->next, semantic_idx += 1) + for(EV2_Row *row = rows.first; row != 0; row = row->next, semantic_idx += 1) { //////////////////////// //- rjf: unpack row info // U64 row_hash = ev_hash_from_key(row->key); + U64 row_depth = ev2_depth_from_block(row->block); B32 row_selected = (selection_tbl.min.y <= (semantic_idx+1) && (semantic_idx+1) <= selection_tbl.max.y); B32 row_expanded = ev_expansion_from_key(eval_view, row->key); E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); E_Type *row_type = e_type_from_key(scratch.arena, row_eval.type_key); - B32 row_is_expandable = ev_row_is_expandable(row); - B32 row_is_editable = ev_row_is_editable(row); + B32 row_is_expandable = ev2_row_is_expandable(row); + B32 row_is_editable = ev2_row_is_editable(row); B32 next_row_expanded = row_expanded; - RD_ViewRuleInfo *ui_view_rule_info = &rd_nil_view_rule_info; - MD_Node *ui_view_rule_params_root = &md_nil_node; - for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next) + RD_ViewRuleInfo *ui_view_rule_info = rd_view_rule_info_from_string(row->block->expand_view_rule_info->string); + MD_Node *ui_view_rule_params_root = row->block->expand_view_rule_params; + if(ui_view_rule_info->ui == 0) { - RD_ViewRuleInfo *info = rd_view_rule_info_from_string(n->v.root->string); - if(info->ui != 0) - { - ui_view_rule_info = info; - ui_view_rule_params_root = n->v.root; - } + ui_view_rule_info = &rd_nil_view_rule_info; + ui_view_rule_params_root = &md_nil_node; } //////////////////////// @@ -1962,13 +1946,13 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ui_set_next_palette(palette); ui_set_next_flags(disabled_flags); ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_pref_height(ui_px(scroll_list_params.row_height_px*row->size_in_rows, 1.f)); + ui_set_next_pref_height(ui_px(scroll_list_params.row_height_px*row->visual_size, 1.f)); ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); UI_Box *row_box = ui_build_box_from_stringf(row_flags| (!row->next) * UI_BoxFlag_DrawSideBottom| UI_BoxFlag_Clickable| - ((row->block_kind != EV_BlockKind_Canvas) * UI_BoxFlag_DisableFocusOverlay)| - ((row->block_kind == EV_BlockKind_Canvas) * UI_BoxFlag_Clip), + ((ui_view_rule_info == &rd_nil_view_rule_info) * UI_BoxFlag_DisableFocusOverlay)| + ((ui_view_rule_info != &rd_nil_view_rule_info) * UI_BoxFlag_Clip), "row_%I64x", row_hash); ui_ts_vector_idx += 1; ui_ts_cell_idx = 0; @@ -1977,7 +1961,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //- rjf: canvas block row -> build singular row for "escape hatch" ui // B32 did_row_build = 0; - if(!did_row_build && row->block_kind == EV_BlockKind_Canvas) + if(!did_row_build && ui_view_rule_info != &rd_nil_view_rule_info) UI_Parent(row_box) UI_FocusHot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off) { //- rjf: build ui hook row contents @@ -1986,7 +1970,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo did_row_build = 1; //- rjf: unpack - RD_WatchViewPoint pt = {0, row->parent_key, row->key}; + RD_WatchViewPoint pt = {0, row->block->key, row->key}; RD_View *view = rd_view_from_handle(rd_regs()->view); RD_TransientViewNode *canvas_view_node = rd_transient_view_node_from_ev_key(view, row->key); RD_View *canvas_view = canvas_view_node->view; @@ -2000,7 +1984,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo rd_view_equip_spec(canvas_view, ui_view_rule_info, canvas_view_expr, ui_view_rule_params_root); } Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f, - (row->skipped_size_in_rows+row->size_in_rows+row->chopped_size_in_rows)*scroll_list_params.row_height_px); + (row->visual_size_skipped+row->visual_size+row->visual_size_chopped)*scroll_list_params.row_height_px); Rng2F32 canvas_rect = r2f32p(rect.x0, rect.y0 + ui_top_fixed_y(), rect.x0 + canvas_dim.x, @@ -2041,8 +2025,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } //- rjf: build main column for canvas - ui_set_next_fixed_y(-1.f * (row->skipped_size_in_rows) * scroll_list_params.row_height_px); - ui_set_next_fixed_height((row->skipped_size_in_rows + row->size_in_rows + row->chopped_size_in_rows) * scroll_list_params.row_height_px); + ui_set_next_fixed_y(-1.f * (row->visual_size_skipped) * scroll_list_params.row_height_px); + ui_set_next_fixed_height((row->visual_size_skipped + row->visual_size + row->visual_size_chopped) * scroll_list_params.row_height_px); ui_set_next_child_layout_axis(Axis2_X); UI_Box *canvas_box = ui_build_box_from_stringf(UI_BoxFlag_FloatingY, "###canvas_%I64x", row_hash); UI_Parent(canvas_box) UI_WidthFill UI_HeightFill @@ -2090,7 +2074,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //- rjf: draw start of cache lines in expansions // if((row_eval.mode == E_Mode_Offset || row_eval.mode == E_Mode_Null) && - row_eval.value.u64%64 == 0 && row->depth > 0 && + row_eval.value.u64%64 == 0 && row_depth > 0 && !row_expanded) { ui_set_next_fixed_x(0); @@ -2105,7 +2089,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // if((row_eval.mode == E_Mode_Offset || row_eval.mode == E_Mode_Null) && row_eval.value.u64%64 != 0 && - row->depth > 0 && + row_depth > 0 && !row_expanded) { U64 next_off = (row_eval.value.u64 + e_type_byte_size_from_key(row_eval.type_key)); @@ -2130,7 +2114,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo for(RD_WatchViewColumn *col = ewv->first_column; col != 0; col = col->next, x += 1) { //- rjf: unpack cell info - RD_WatchViewPoint cell_pt = {x, row->parent_key, row->key}; + RD_WatchViewPoint cell_pt = {x, row->block->key, row->key}; RD_WatchViewTextEditState *cell_edit_state = rd_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 = rd_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, string_flags|EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); @@ -2153,10 +2137,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo default:{}break; case RD_WatchViewColumnKind_Expr: { - cell_can_edit = (row->depth == 0 && modifiable && filter.size == 0); + cell_can_edit = (row_depth == 0 && modifiable && filter.size == 0); if(filter.size != 0) { - cell_matches = fuzzy_match_find(scratch.arena, filter, ev_expr_string_from_row(scratch.arena, row, string_flags)); + cell_matches = fuzzy_match_find(scratch.arena, filter, ev2_expr_string_from_row(scratch.arena, row, string_flags)); } cell_autocomp_flags = (RD_AutoCompListerFlag_Locals| RD_AutoCompListerFlag_Procedures| @@ -2191,7 +2175,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo value_cell:; { E_MsgList msgs = cell_eval.msgs; - if(row->depth == 0 && row->string.size != 0) + if(row_depth == 0 && row->string.size != 0) { E_TokenArray tokens = e_token_array_from_text(scratch.arena, row->string); E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, row->string, &tokens); @@ -2299,7 +2283,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) RD_Font(cell_is_code ? RD_FontSlot_Code : RD_FontSlot_Main) - UI_FlagsAdd(cell_flags | (row->depth > 0 ? UI_BoxFlag_DrawTextWeak : 0)) + UI_FlagsAdd(cell_flags | (row_depth > 0 ? UI_BoxFlag_DrawTextWeak : 0)) { // rjf: cell has errors? -> build error box if(cell_error_string.size != 0) RD_Font(RD_FontSlot_Main) @@ -2342,9 +2326,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo RD_LineEditFlag_NoBackground| RD_LineEditFlag_DisableEdit*(!cell_can_edit)| RD_LineEditFlag_Expander*!!(x == 0 && row_is_expandable && col->kind == RD_WatchViewColumnKind_Expr)| - RD_LineEditFlag_ExpanderPlaceholder*(x == 0 && row->depth==0 && col->kind == RD_WatchViewColumnKind_Expr)| - RD_LineEditFlag_ExpanderSpace*(x == 0 && row->depth!=0 && col->kind == RD_WatchViewColumnKind_Expr)), - x == 0 ? row->depth : 0, + RD_LineEditFlag_ExpanderPlaceholder*(x == 0 && row_depth==0 && col->kind == RD_WatchViewColumnKind_Expr)| + RD_LineEditFlag_ExpanderSpace*(x == 0 && row_depth!=0 && col->kind == RD_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, cell_pre_edit_string, @@ -2408,6 +2392,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } // rjf: double-click, not editable, callstack frame -> select frame +#if 0 // TODO(rjf): @blocks if(ui_double_clicked(sig) && !cell_can_edit && semantic_idx < frame_rows_count) { FrameRow *frame_row = &frame_rows[semantic_idx]; @@ -2415,6 +2400,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo .unwind_count = frame_row->unwind_idx, .inline_depth = frame_row->inline_depth); } +#endif // rjf: hovering with inheritance string -> show tooltip if(ui_hovering(sig) && cell_inheritance_string.size != 0) UI_Tooltip @@ -2440,7 +2426,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo if(DEV_eval_compiler_tooltips && x == 0 && ui_hovering(sig)) UI_Tooltip RD_Font(RD_FontSlot_Code) { local_persist char *spaces = " "; - String8 string = ev_expr_string_from_row(scratch.arena, row, 0); + String8 string = ev2_expr_string_from_row(scratch.arena, row, 0); E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens); E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); @@ -2589,7 +2575,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // if(next_row_expanded != row_expanded) { - ev_key_set_expansion(eval_view, row->parent_key, row->key, next_row_expanded); + ev_key_set_expansion(eval_view, row->block->key, row->key, next_row_expanded); } } } diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index d618dd34..22f3e66a 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -44,8 +44,7 @@ struct RD_CodeViewBuildResult typedef U32 RD_WatchViewFlags; enum { - RD_WatchViewFlag_NoHeader = (1<<0), - RD_WatchViewFlag_PrettyNameMembers = (1<<1), + RD_WatchViewFlag_PrettyNameMembers = (1<<0), }; typedef enum RD_WatchViewColumnKind @@ -155,11 +154,11 @@ internal RD_WatchViewColumn *rd_watch_view_column_from_x(RD_WatchViewState *wv, //- rjf: watch view points <-> table coordinates internal B32 rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b); -internal RD_WatchViewPoint rd_watch_view_point_from_tbl(EV_BlockList *blocks, Vec2S64 tbl); -internal Vec2S64 rd_tbl_from_watch_view_point(EV_BlockList *blocks, RD_WatchViewPoint pt); +internal RD_WatchViewPoint rd_watch_view_point_from_tbl(EV2_BlockRangeList *block_ranges, Vec2S64 tbl); +internal Vec2S64 rd_tbl_from_watch_view_point(EV2_BlockRangeList *block_ranges, RD_WatchViewPoint pt); //- rjf: table coordinates -> strings -internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px); +internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV2_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px); //- rjf: table coordinates -> text edit state internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchViewPoint pt);