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:
Ryan Fleury
2024-09-20 16:15:29 -07:00
parent a1debd9219
commit c98db01b63
10 changed files with 186 additions and 51 deletions
@@ -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, &current_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, &current_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