mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-25 05:04:58 -07:00
replace watch view fill kind with top-level expression & view rule; collection macro for watches; reintroduce only/omit, with new expr-macro-based eval visualization system; remove root-expression-generation from expansion block generation, since it makes things a bit more complicated
This commit is contained in:
@@ -96,6 +96,8 @@ EV_ViewRuleTable:
|
||||
{x Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." }
|
||||
{x ByteSwap bswap "bswap" x - x - "Byte Swap" x "" "Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed." }
|
||||
{x Cast cast "cast" - - x - "Cast" x "x:{type}" "Specifies that the expression to which the view rule is applied should be casted to the provided type." }
|
||||
{x Only only "only" - - x - "Only" x "" "Specifies that only the provided member names should be shown in user-defined-type expansions." }
|
||||
{x Omit omit "omit" - - x - "Omit" x "" "Specifies that the provided member names should not be shown in user-defined-type expansions." }
|
||||
}
|
||||
|
||||
@enum EV_ViewRuleKind:
|
||||
|
||||
@@ -106,6 +106,7 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(default)
|
||||
////////////////////////////
|
||||
//- rjf: unpack expression type info
|
||||
//
|
||||
expr = ev_expr_from_expr_view_rules(arena, expr, view_rules);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
|
||||
E_TypeKey type_key = e_type_unwrap(irtree.type_key);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
@@ -393,3 +394,81 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast)
|
||||
expr = e_expr_ref_cast(arena, type_key, expr);
|
||||
return expr;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: "only"
|
||||
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key);
|
||||
if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Union || type_kind == E_TypeKind_Class)
|
||||
{
|
||||
E_MemberArray current_members = e_type_data_members_from_key(scratch.arena, irtree.type_key);
|
||||
E_MemberList new_members = {0};
|
||||
for EachIndex(idx, current_members.count)
|
||||
{
|
||||
B32 include = 0;
|
||||
for MD_EachNode(node, params->first)
|
||||
{
|
||||
if(str8_match(node->string, current_members.v[idx].name, 0))
|
||||
{
|
||||
include = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(include)
|
||||
{
|
||||
e_member_list_push(scratch.arena, &new_members, ¤t_members.v[idx]);
|
||||
}
|
||||
}
|
||||
E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members);
|
||||
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
|
||||
E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
|
||||
expr = e_expr_ref_addr(arena, expr);
|
||||
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type), expr);
|
||||
expr = e_expr_ref_deref(arena, expr);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return expr;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: "omit"
|
||||
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key);
|
||||
if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Union || type_kind == E_TypeKind_Class)
|
||||
{
|
||||
E_MemberArray current_members = e_type_data_members_from_key(scratch.arena, irtree.type_key);
|
||||
E_MemberList new_members = {0};
|
||||
for EachIndex(idx, current_members.count)
|
||||
{
|
||||
B32 include = 1;
|
||||
for MD_EachNode(node, params->first)
|
||||
{
|
||||
if(str8_match(node->string, current_members.v[idx].name, 0))
|
||||
{
|
||||
include = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(include)
|
||||
{
|
||||
e_member_list_push(scratch.arena, &new_members, ¤t_members.v[idx]);
|
||||
}
|
||||
}
|
||||
E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members);
|
||||
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
|
||||
E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
|
||||
expr = e_expr_ref_addr(arena, expr);
|
||||
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type), expr);
|
||||
expr = e_expr_ref_deref(arena, expr);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return expr;
|
||||
}
|
||||
|
||||
@@ -509,7 +509,7 @@ internal EV_Block *
|
||||
ev_block_split_and_continue(Arena *arena, EV_BlockList *list, EV_Block *split_block, U64 split_idx)
|
||||
{
|
||||
U64 total_count = split_block->semantic_idx_range.max;
|
||||
split_block->visual_idx_range.max = split_block->semantic_idx_range.max = split_idx;
|
||||
split_block->visual_idx_range.max = split_block->semantic_idx_range.max = split_idx+1;
|
||||
ev_block_end(list, split_block);
|
||||
EV_Block *continue_block = ev_block_begin(arena, split_block->kind, split_block->parent_key, split_block->key, split_block->depth);
|
||||
continue_block->string = split_block->string;
|
||||
@@ -539,25 +539,10 @@ ev_append_expr_blocks__rec(Arena *arena, EV_View *view, String8 filter, EV_Key p
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- rjf: apply expr resolution view rules
|
||||
E_Expr *expr_raw = expr;
|
||||
expr = ev_expr_from_expr_view_rules(arena, expr, view_rules);
|
||||
|
||||
//- rjf: determine if this key is expanded
|
||||
EV_ExpandNode *node = ev_expand_node_from_key(view, key);
|
||||
B32 parent_is_expanded = (node != 0 && node->expanded);
|
||||
|
||||
//- rjf: push block for expression root
|
||||
{
|
||||
EV_Block *block = ev_block_begin(arena, EV_BlockKind_Root, parent_key, key, depth);
|
||||
block->string = string;
|
||||
block->expr = expr;
|
||||
block->view_rules = view_rules;
|
||||
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);
|
||||
ev_block_end(list_out, block);
|
||||
}
|
||||
|
||||
//- rjf: determine view rule to generate children blocks
|
||||
EV_ViewRuleInfo *block_prod_view_rule_info = ev_view_rule_info_from_string(str8_lit("default"));
|
||||
MD_Node *block_prod_view_rule_params = &md_nil_node;
|
||||
@@ -638,7 +623,23 @@ ev_block_list_from_view_expr_keys(Arena *arena, EV_View *view, String8 filter, E
|
||||
ev_view_rule_list_push_string(arena, view_rule_list, n->string);
|
||||
}
|
||||
ev_view_rule_list_push_string(arena, view_rule_list, view_rule_string);
|
||||
ev_append_expr_blocks__rec(arena, view, filter, parent_key, key, expr, parse.expr, view_rule_list, depth, &blocks);
|
||||
|
||||
//- rjf: apply expr resolution view rules
|
||||
E_Expr *expr_resolved = ev_expr_from_expr_view_rules(arena, parse.expr, view_rule_list);
|
||||
|
||||
//- rjf: push block for expression root
|
||||
{
|
||||
EV_Block *block = ev_block_begin(arena, EV_BlockKind_Root, parent_key, key, depth);
|
||||
block->string = expr;
|
||||
block->expr = expr_resolved;
|
||||
block->view_rules = view_rule_list;
|
||||
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);
|
||||
ev_block_end(&blocks, block);
|
||||
}
|
||||
|
||||
//- rjf: push expansions for root
|
||||
ev_append_expr_blocks__rec(arena, view, filter, parent_key, key, expr, expr_resolved, view_rule_list, depth, &blocks);
|
||||
}
|
||||
ProfEnd();
|
||||
return blocks;
|
||||
|
||||
@@ -4,13 +4,15 @@
|
||||
//- GENERATED CODE
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
EV_ViewRuleInfo ev_builtin_view_rule_info_table[5] =
|
||||
EV_ViewRuleInfo ev_builtin_view_rule_info_table[7] =
|
||||
{
|
||||
{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 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, },
|
||||
{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, },
|
||||
{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, },
|
||||
{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, },
|
||||
{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , 0, },
|
||||
{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , 0, },
|
||||
};
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
@@ -13,6 +13,8 @@ EV_ViewRuleKind_Array,
|
||||
EV_ViewRuleKind_Slice,
|
||||
EV_ViewRuleKind_ByteSwap,
|
||||
EV_ViewRuleKind_Cast,
|
||||
EV_ViewRuleKind_Only,
|
||||
EV_ViewRuleKind_Omit,
|
||||
EV_ViewRuleKind_COUNT,
|
||||
} EV_ViewRuleKind;
|
||||
|
||||
@@ -20,5 +22,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit);
|
||||
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(default);
|
||||
#endif // EVAL_VISUALIZATION_META_H
|
||||
|
||||
Reference in New Issue
Block a user