diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 15cf1087..2d112567 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -61,7 +61,7 @@ e_autoresolved_eval_from_eval(E_Eval eval) if(string_idx == 0) { string_idx = gvar->name_string_idx; } if(string_idx != 0) { - eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 0); + eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0); } } return eval; @@ -127,7 +127,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx); - E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0); + E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0); eval.type_key = ptr_to_derived_type_key; } } diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 766675e7..ffb4f0a0 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -130,14 +130,10 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key); if(e_type_kind_is_pointer_or_ref(lhs_type_kind)) { - lookup_info.idxed_expr_count = 1; + E_Type *type = e_type_from_key(scratch.arena, lhs_type_key); + lookup_info.idxed_expr_count = type->count; E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_irtree.type_key)); E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); - if(direct_type_kind == E_TypeKind_Array) - { - E_Type *direct_type = e_type_from_key(scratch.arena, direct_type_key); - lookup_info.idxed_expr_count = direct_type->count; - } if(direct_type_kind == E_TypeKind_Struct || direct_type_kind == E_TypeKind_Class || direct_type_kind == E_TypeKind_Union || @@ -155,6 +151,11 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); lookup_info.named_expr_count = lhs_type->count; } + else if(lhs_type_kind == E_TypeKind_Array) + { + E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); + lookup_info.idxed_expr_count = lhs_type->count; + } } scratch_end(scratch); return lookup_info; @@ -405,44 +406,83 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(default) E_LOOKUP_RANGE_FUNCTION_DEF(default) { - E_LookupRange result = {0}; Temp scratch = scratch_begin(&arena, 1); { + //- rjf: unpack type of expression E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs); E_TypeKey lhs_type_key = lhs_irtree.type_key; E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key); - if(lhs_type_kind == E_TypeKind_Struct || - lhs_type_kind == E_TypeKind_Union || - lhs_type_kind == E_TypeKind_Class || - lhs_type_kind == E_TypeKind_Enum) + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_type_key)); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + + //- rjf: pull out specific kinds of types + B32 do_struct_range = 0; + B32 do_index_range = 0; + E_TypeKey struct_type_key = zero_struct; + E_TypeKind struct_type_kind = E_TypeKind_Null; + if(e_type_kind_is_pointer_or_ref(lhs_type_kind)) + { + E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); + if(lhs_type->count == 1 && + (direct_type_kind == E_TypeKind_Struct || + direct_type_kind == E_TypeKind_Union || + direct_type_kind == E_TypeKind_Class || + direct_type_kind == E_TypeKind_Enum)) + { + struct_type_key = direct_type_key; + struct_type_kind = direct_type_kind; + do_struct_range = 1; + } + else + { + do_index_range = 1; + } + } + else if(lhs_type_kind == E_TypeKind_Struct || + lhs_type_kind == E_TypeKind_Union || + lhs_type_kind == E_TypeKind_Class || + lhs_type_kind == E_TypeKind_Enum) + { + struct_type_key = lhs_type_key; + struct_type_kind = lhs_type_kind; + do_struct_range = 1; + } + else if(lhs_type_kind == E_TypeKind_Set) + { + do_index_range = 1; + } + else if(lhs_type_kind == E_TypeKind_Array) + { + do_index_range = 1; + } + + //- rjf: struct case -> the lookup-range will return a range of members + if(do_struct_range) { E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); Rng1U64 legal_idx_range = r1u64(0, lhs_type->count); Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); U64 read_range_count = dim_1u64(read_range); - result.exprs_count = read_range_count; - result.exprs = push_array(arena, E_Expr *, result.exprs_count); - for(U64 idx = 0; idx < result.exprs_count; idx += 1) + for(U64 idx = 0; idx < read_range_count; idx += 1) { U64 member_idx = idx + read_range.min; String8 member_name = (lhs_type->members ? lhs_type->members[member_idx].name : lhs_type->enum_vals ? lhs_type->enum_vals[member_idx].name : str8_lit("")); - result.exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name); + exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name); } } - else if(lhs_type_kind == E_TypeKind_Set) + + //- rjf: ptr case -> the lookup-range will return a range of dereferences + else if(do_index_range) { - result.exprs_count = dim_1u64(idx_range); - result.exprs = push_array(arena, E_Expr *, result.exprs_count); - result.exprs_strings = push_array(arena, String8, result.exprs_count); - for(U64 idx = 0; idx < result.exprs_count; idx += 1) + U64 read_range_count = dim_1u64(idx_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) { - result.exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx); + exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx); } } } scratch_end(scratch); - return result; } E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default) @@ -486,8 +526,7 @@ E_IRGEN_FUNCTION_DEF(array) Temp scratch = scratch_begin(&arena, 1); E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next); E_TypeKey element_type_key = e_type_ptee_from_key(type_key); - E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count_eval.value.u64); - E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0); + E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_eval.value.u64, 0); irtree.type_key = ptr_type_key; scratch_end(scratch); } @@ -542,8 +581,7 @@ E_IRGEN_FUNCTION_DEF(slice) { String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key); - E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count); - E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0); + E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count, 0); E_MemberList slice_type_members = {0}; e_member_list_push(scratch.arena, &slice_type_members, count_member); e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .pretty_name = base_ptr_member->pretty_name, .off = base_ptr_member->off}); @@ -1055,7 +1093,7 @@ E_IRGEN_FUNCTION_DEF(default) // rjf: generate result.root = r_tree.root; - result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 0); + result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 1, 0); result.mode = E_Mode_Value; }break; @@ -1414,7 +1452,7 @@ E_IRGEN_FUNCTION_DEF(default) E_TypeKey ptr_type = ptr_tree->type_key; if(ptr_is_decay) { - ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 0); + ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 1, 0); } E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root); result.root = new_root; diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 3bbb6f63..b788412f 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -73,14 +73,6 @@ struct E_LookupAccess E_IRTreeAndType irtree_and_type; }; -typedef struct E_LookupRange E_LookupRange; -struct E_LookupRange -{ - U64 exprs_count; - E_Expr **exprs; - String8 *exprs_strings; -}; - #define E_LOOKUP_INFO_FUNCTION_SIG(name) E_LookupInfo name(Arena *arena, E_Expr *lhs, String8 filter) #define E_LOOKUP_INFO_FUNCTION_NAME(name) e_lookup_info_##name #define E_LOOKUP_INFO_FUNCTION_DEF(name) internal E_LOOKUP_INFO_FUNCTION_SIG(E_LOOKUP_INFO_FUNCTION_NAME(name)) @@ -93,7 +85,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default); typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType); E_LOOKUP_ACCESS_FUNCTION_DEF(default); -#define E_LOOKUP_RANGE_FUNCTION_SIG(name) E_LookupRange name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, void *user_data) +#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data) #define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name #define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name)) typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 12e4ea03..e2265042 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1041,7 +1041,7 @@ e_type_from_expr(E_Expr *expr) case E_ExprKind_Ptr: { E_TypeKey direct_type_key = e_type_from_expr(expr->first); - result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 0); + result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 1, 0); }break; case E_ExprKind_Array: { @@ -1356,7 +1356,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to else { E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); - type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 0); + type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0); E_Expr *casted = atom; E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); e_expr_push_child(cast, type); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 981581ee..7c91ce63 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -456,19 +456,12 @@ e_type_key_cons_array(E_TypeKey element_type_key, U64 count) } internal E_TypeKey -e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags) +e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags) { E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key); return key; } -internal E_TypeKey -e_type_key_cons_space_ptr(E_TypeKey direct_type_key) -{ - E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_SpacePtr, .direct_key = direct_type_key); - return key; -} - internal E_TypeKey e_type_key_cons_base(Type *type) { @@ -489,7 +482,7 @@ e_type_key_cons_base(Type *type) if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; } if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; } if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; } - result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags); + result = e_type_key_cons_ptr(arch_from_context(), direct_type, 1, flags); }break; case TypeKind_Array: { @@ -804,6 +797,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->kind = kind; type->direct_type_key = direct_type_key; type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->count = 1; }break; case RDI_TypeKind_Array: diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index a8cbd1b1..89fb27b2 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -318,8 +318,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params); //- rjf: constructed type construction helpers internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count); -internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags); -internal E_TypeKey e_type_key_cons_space_ptr(E_TypeKey direct_type_key); +internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags); internal E_TypeKey e_type_key_cons_base(Type *type); //- rjf: basic type key functions diff --git a/src/eval_visualization/eval_visualization.mdesk b/src/eval_visualization/eval_visualization.mdesk index 6a202e77..416018f1 100644 --- a/src/eval_visualization/eval_visualization.mdesk +++ b/src/eval_visualization/eval_visualization.mdesk @@ -91,7 +91,6 @@ @table(coverage_check name name_lower string ih ex xr xe display_name docs schema description) EV_ViewRuleTable: { - {x Default default "default" - - - x "Default" - "" "" } {x Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } {x List list "list" - - - x "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } {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." } @@ -109,6 +108,7 @@ EV_ViewRuleTable: @enum EV_ViewRuleKind: { + EV_ViewRuleKind_Null, @expand(EV_ViewRuleTable a) `$(a.name)`, COUNT, } @@ -116,11 +116,11 @@ EV_ViewRuleTable: @gen { @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`; } @data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table: { + `{0}`, @expand(EV_ViewRuleTable a) - ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(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) }```; + ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") }```; } diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index 44c535d0..4618f35f 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -96,208 +96,6 @@ ev_arch_from_eval_params(E_Eval eval, MD_Node *params) return arch; } -//////////////////////////////// -//~ rjf: default - -typedef struct EV_DefaultExpandAccel EV_DefaultExpandAccel; -struct EV_DefaultExpandAccel -{ - E_MemberArray members; - E_EnumValArray enum_vals; - E_LookupRule *lookup_rule; - void *lookup_user_data; - U64 array_count; - B32 array_need_extra_deref; - B32 is_ptr2ptr; -}; - -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default) -{ - Temp scratch = scratch_begin(&arena, 1); - U64 total_row_count = 0; - EV_DefaultExpandAccel *accel = push_array(arena, EV_DefaultExpandAccel, 1); - - //////////////////////////// - //- rjf: unpack expression type info - // - 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); - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(type_key)); - E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); - - //////////////////////////// - //- rjf: structs/unions/classes -> expansions generate rows for all members - // - if((type_kind == E_TypeKind_Struct || - type_kind == E_TypeKind_Union || - type_kind == E_TypeKind_Class) || - (e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || - direct_type_kind == E_TypeKind_Union || - direct_type_kind == E_TypeKind_Class))) - { - E_TypeKey struct_type_key = e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key; - accel->members = e_type_data_members_from_key__cached(struct_type_key); - total_row_count = accel->members.count; - } - - //////////////////////////// - //- rjf: enums -> expansions generate rows for all members - // - else if(type_kind == E_TypeKind_Enum || - (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); - accel->enum_vals.v = type->enum_vals; - accel->enum_vals.count = type->count; - total_row_count = accel->enum_vals.count; - } - - //////////////////////////// - //- rjf: arrays -> expansions generate rows for all elements - // - else if(type_kind == E_TypeKind_Array || - (e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Array)) - { - B32 need_extra_deref = e_type_kind_is_pointer_or_ref(type_kind); - E_Expr *array_expr = need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; - E_Type *type = e_type_from_key(arena, need_extra_deref ? direct_type_key : type_key); - total_row_count = type->count; - accel->array_count = type->count; - accel->array_need_extra_deref = need_extra_deref; - } - - //////////////////////////// - //- rjf: pointer-to-pointer -> expansions generate dereference - // - else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind)) - { - total_row_count = 1; - accel->is_ptr2ptr = 1; - } - - //////////////////////////// - //- rjf: sets -> expansions generate rows for all possible lookups - // - else if(type_kind == E_TypeKind_Set) - { - E_Type *type = e_type_from_key(scratch.arena, type_key); - E_LookupRule *rule = e_lookup_rule_from_string(type->name); - E_LookupInfo lookup_info = rule->info(arena, expr, filter); - total_row_count = Max(lookup_info.named_expr_count, lookup_info.idxed_expr_count); - accel->lookup_rule = rule; - accel->lookup_user_data = lookup_info.user_data; - } - - //////////////////////////// - //- rjf: package result - // - EV_ExpandInfo result = {0}; - { - result.user_data = accel; - result.row_count = total_row_count; - } - - scratch_end(scratch); - return result; -} - -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) -{ - EV_DefaultExpandAccel *accel = (EV_DefaultExpandAccel *)user_data; - EV_ExpandRangeInfo result = {0}; - U64 needed_row_count = dim_1u64(idx_range); - - //////////////////////////// - //- rjf: fill with members - // - if(accel->members.count != 0) - { - E_MemberArray *members = &accel->members; - result.row_exprs_count = Min(needed_row_count, members->count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, 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; - } - } - - //////////////////////////// - //- rjf: fill with enum vals - // - else if(accel->enum_vals.count != 0) - { - E_EnumValArray *enumvals = &accel->enum_vals; - result.row_exprs_count = Min(needed_row_count, enumvals->count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, 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; - } - } - - //////////////////////////// - //- rjf: fill with array indices - // - else if(accel->array_count != 0) - { - E_Expr *array_expr = accel->array_need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; - 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_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, 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; - } - } - - //////////////////////////// - //- rjf: fill with ptr-to-ptr deref - // - else if(accel->is_ptr2ptr) - { - result.row_exprs_count = 1; - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs[0] = e_expr_ref_deref(arena, expr); - result.row_members[0] = &e_member_nil; - } - - //////////////////////////// - //- rjf: fill with lookups - // - else if(accel->lookup_rule != 0) - { - E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data); - result.row_exprs_count = lookup_range.exprs_count; - result.row_exprs = lookup_range.exprs; - result.row_strings = lookup_range.exprs_strings; - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) - { - result.row_members[row_expr_idx] = &e_member_nil; - } - } - - return result; -} - //////////////////////////////// //~ rjf: "list" @@ -306,9 +104,3 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list) EV_ExpandInfo info = {0}; return info; } - -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list) -{ - EV_ExpandRangeInfo info = {0}; - return info; -} diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 71925429..3b547ff0 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -15,22 +15,6 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil) 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 @@ -352,7 +336,7 @@ ev_view_rule_info_table_push(Arena *arena, EV_ViewRuleInfoTable *table, EV_ViewR internal void ev_view_rule_info_table_push_builtins(Arena *arena, EV_ViewRuleInfoTable *table) { - for EachEnumVal(EV_ViewRuleKind, kind) + for EachNonZeroEnumVal(EV_ViewRuleKind, kind) { ev_view_rule_info_table_push(arena, table, &ev_builtin_view_rule_info_table[kind]); } @@ -387,206 +371,11 @@ ev_view_rule_info_from_string(String8 string) return info; } -//////////////////////////////// -//~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups - -internal void -ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required) -{ - if(table->slots_count == 0) - { - table->slots_count = 4096; - table->slots = push_array(arena, EV_AutoViewRuleSlot, table->slots_count); - } - U64 hash = e_hash_from_type_key(type_key); - U64 slot_idx = hash%table->slots_count; - EV_AutoViewRuleSlot *slot = &table->slots[slot_idx]; - EV_AutoViewRuleNode *node = 0; - for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next) - { - if(e_type_match(n->key, type_key)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(arena, EV_AutoViewRuleNode, 1); - node->key = type_key; - node->view_rule = push_str8_copy(arena, view_rule); - node->is_required = is_required; - SLLQueuePush(slot->first, slot->last, node); - } -} - -internal void -ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table) -{ - ev_auto_view_rule_table = table; -} - -internal EV_ViewRuleList * -ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional) -{ - EV_ViewRuleList *result = &ev_nil_view_rule_list; - if(ev_auto_view_rule_table != 0 && ev_auto_view_rule_table->slots_count != 0) - { - U64 hash = e_hash_from_type_key(type_key); - U64 slot_idx = hash%ev_auto_view_rule_table->slots_count; - EV_AutoViewRuleSlot *slot = &ev_auto_view_rule_table->slots[slot_idx]; - EV_AutoViewRuleNode *node = 0; - for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next) - { - if(e_type_match(n->key, type_key) && ((n->is_required && gather_required) || (!n->is_required && gather_optional))) - { - if(result == &ev_nil_view_rule_list) - { - result = push_array(arena, EV_ViewRuleList, 1); - } - ev_view_rule_list_push_string(arena, result, n->view_rule); - } - } - } - return result; -} - -//////////////////////////////// -//~ rjf: View Rule Instance List Building - -internal void -ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root) -{ - EV_ViewRuleNode *n = push_array(arena, EV_ViewRuleNode, 1); - n->v.root = root; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal void -ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string) -{ - if(string.size != 0) - { - MD_Node *root = md_tree_from_string(arena, string); - for MD_EachNode(tln, root->first) - { - ev_view_rule_list_push_tree(arena, list, tln); - } - } -} - -internal EV_ViewRuleList * -ev_view_rule_list_from_string(Arena *arena, String8 string) -{ - EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1); - ev_view_rule_list_push_string(arena, dst, string); - return dst; -} - -internal EV_ViewRuleList * -ev_view_rule_list_from_expr_fastpaths(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - // rjf: parse expression - E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); - E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens); - - // rjf: extract view rules, encoded via fastpaths in expression string - String8List fastpath_view_rules = {0}; - { - U64 parse_opl = (parse.last_token >= tokens.v + tokens.count ? string.size : parse.last_token->range.min); - U64 comma_pos = str8_find_needle(string, parse_opl, str8_lit(","), 0); - U64 passthrough_pos = str8_find_needle(string, 0, str8_lit("--"), 0); - if(comma_pos < string.size && comma_pos < passthrough_pos) - { - String8 comma_extension = str8_skip_chop_whitespace(str8_substr(string, r1u64(comma_pos+1, passthrough_pos))); - if(str8_match(comma_extension, str8_lit("x"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(scratch.arena, &fastpath_view_rules, "hex"); - } - else if(str8_match(comma_extension, str8_lit("b"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(scratch.arena, &fastpath_view_rules, "bin"); - } - else if(str8_match(comma_extension, str8_lit("o"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(scratch.arena, &fastpath_view_rules, "oct"); - } - else if(comma_extension.size != 0) - { - str8_list_pushf(scratch.arena, &fastpath_view_rules, "array:{%S}", comma_extension); - } - } - if(passthrough_pos < string.size) - { - String8 passthrough_view_rule = str8_skip_chop_whitespace(str8_skip(string, passthrough_pos+2)); - if(passthrough_view_rule.size != 0) - { - str8_list_push(scratch.arena, &fastpath_view_rules, passthrough_view_rule); - } - } - } - - // rjf: convert strings to parsed view rules - EV_ViewRuleList *view_rule_list = push_array(arena, EV_ViewRuleList, 1); - for(String8Node *n = fastpath_view_rules.first; n != 0; n = n->next) - { - ev_view_rule_list_push_string(arena, view_rule_list, push_str8_copy(arena, n->string)); - } - - scratch_end(scratch); - return view_rule_list; -} - -internal EV_ViewRuleList * -ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src) -{ - EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1); - for(EV_ViewRuleNode *n = src->first; n != 0; n = n->next) - { - EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); - if(info->flags & EV_ViewRuleInfoFlag_Inherited) - { - ev_view_rule_list_push_tree(arena, dst, n->v.root); - } - } - return dst; -} - -internal EV_ViewRuleList * -ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src) -{ - EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1); - for(EV_ViewRuleNode *n = src->first; n != 0; n = n->next) - { - ev_view_rule_list_push_tree(arena, dst, n->v.root); - } - return dst; -} - -internal void -ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src) -{ - if(dst->first && src[0] != &ev_nil_view_rule_list && src[0]->first) - { - dst->last->next = src[0]->first; - dst->last = src[0]->last; - dst->count += src[0]->count; - } - else if(!dst->first) - { - MemoryCopyStruct(dst, *src); - } - *src = &ev_nil_view_rule_list; -} - //////////////////////////////// //~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application) internal E_Expr * -ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules) +ev_resolved_from_expr(Arena *arena, E_Expr *expr) { ProfBeginFunction(); { @@ -642,7 +431,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules) RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx); - E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0); + E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0); expr = e_expr_ref_cast(arena, ptr_to_derived_type_key, expr); } } @@ -659,7 +448,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules) //~ rjf: Block Building internal EV_BlockTree -ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules) +ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr) { ProfBeginFunction(); EV_BlockTree tree = {&ev_nil_block}; @@ -667,21 +456,12 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str Temp scratch = scratch_begin(&arena, 1); EV_ViewRuleInfo *default_expand_view_rule_info = ev_view_rule_info_from_string(str8_lit("default")); - //- rjf: form complete set of view rules - EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_copy(arena, view_rules); - { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); - EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(arena, irtree.type_key, 1, 1); - ev_view_rule_list_concat_in_place(top_level_view_rules, &auto_view_rules); - } - //- rjf: generate root block tree.root = push_array(arena, EV_Block, 1); MemoryCopyStruct(tree.root, &ev_nil_block); tree.root->key = ev_key_root(); tree.root->string = string; - tree.root->expr = ev_resolved_from_expr(arena, expr, top_level_view_rules); - tree.root->view_rules = top_level_view_rules; + tree.root->expr = ev_resolved_from_expr(arena, expr); tree.root->row_count = 1; tree.total_row_count += 1; tree.total_item_count += 1; @@ -694,11 +474,10 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str EV_Block *parent_block; E_Expr *expr; U64 child_id; - EV_ViewRuleList *view_rules; U64 split_relative_idx; B32 default_expanded; }; - Task start_task = {0, tree.root, tree.root->expr, 1, top_level_view_rules, 0}; + Task start_task = {0, tree.root, tree.root->expr, 1, 0}; Task *first_task = &start_task; Task *last_task = first_task; for(Task *t = first_task; t != 0; t = t->next) @@ -721,24 +500,66 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str } // rjf: get expansion view rule info - EV_ViewRuleInfo *expand_view_rule_info = default_expand_view_rule_info; - MD_Node *expand_params = &md_nil_node; - for(EV_ViewRuleNode *n = t->view_rules->first; n != 0; n = n->next) + E_LookupRule *lookup_rule = &e_lookup_rule__default; + EV_ViewRuleInfo *expand_rule = default_expand_view_rule_info; + E_Expr *lookup_rule_tag = &e_expr_nil; + E_Expr *expand_rule_tag = &e_expr_nil; + for(E_Expr *tag = t->expr->first_tag; tag != &e_expr_nil; tag = tag->next) { - EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); - if(info->expr_expand_info != 0 && info->expr_expand_info != EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)) + E_LookupRule *lookup_rule_candidate = e_lookup_rule_from_string(tag->first->string); + EV_ViewRuleInfo *expand_rule_candidate = ev_view_rule_info_from_string(tag->first->string); + if(lookup_rule_candidate != &e_lookup_rule__default) { - expand_view_rule_info = info; - expand_params = n->v.root; + lookup_rule = lookup_rule_candidate; + lookup_rule_tag = tag; + } + if(expand_rule_candidate != &ev_nil_view_rule_info) + { + expand_rule = expand_rule_candidate; + expand_rule_tag = tag; } } - // rjf: get expansion info - EV_ExpandInfo expand_info = expand_view_rule_info->expr_expand_info(arena, view, filter, t->expr, expand_params); + // rjf: for set types, try to use the set's name to lookup rules, if we don't + // have any + if(lookup_rule == &e_lookup_rule__default || + expand_rule == default_expand_view_rule_info) + { + E_IRTreeAndType expr_irtree = e_irtree_and_type_from_expr(scratch.arena, t->expr); + E_TypeKey expr_type_key = expr_irtree.type_key; + E_TypeKind expr_type_kind = e_type_kind_from_key(expr_type_key); + if(expr_type_kind == E_TypeKind_Set) + { + E_Type *expr_type = e_type_from_key(scratch.arena, expr_type_key); + if(lookup_rule == &e_lookup_rule__default) + { + lookup_rule = e_lookup_rule_from_string(expr_type->name); + } + if(expand_rule == default_expand_view_rule_info) + { + expand_rule = ev_view_rule_info_from_string(expr_type->name); + if(expand_rule == &ev_nil_view_rule_info) + { + expand_rule = default_expand_view_rule_info; + } + } + } + } + + // rjf: get top-level lookup/expansion info + E_LookupInfo lookup_info = lookup_rule->info(arena, t->expr, filter); + EV_ExpandInfo expand_info = expand_rule->expr_expand_info(arena, view, filter, t->expr, expand_rule_tag); + + // rjf: determine expansion info + U64 expansion_row_count = lookup_info.named_expr_count ? lookup_info.named_expr_count : lookup_info.idxed_expr_count; + if(expand_rule != &ev_nil_view_rule_info) + { + expansion_row_count = expand_info.row_count; + } // rjf: generate block for expansion EV_Block *expansion_block = &ev_nil_block; - if(expand_info.row_count != 0) + if(expansion_row_count != 0) { expansion_block = push_array(arena, EV_Block, 1); MemoryCopyStruct(expansion_block, &ev_nil_block); @@ -747,22 +568,24 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str expansion_block->key = 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->lookup_tag = lookup_rule_tag; + expansion_block->expand_tag = expand_rule_tag; + expansion_block->lookup_rule = lookup_rule; + expansion_block->expand_rule = expand_rule; + expansion_block->lookup_rule_user_data = lookup_info.user_data; + expansion_block->expand_rule_user_data = expand_info.user_data; + expansion_block->row_count = expansion_row_count; expansion_block->single_item = expand_info.single_item; expansion_block->rows_default_expanded = expand_info.rows_default_expanded; - tree.total_row_count += expand_info.row_count; - tree.total_item_count += expand_info.single_item ? 1 : expand_info.row_count; + tree.total_row_count += expansion_row_count; + tree.total_item_count += expand_info.single_item ? 1 : expansion_row_count; } // rjf: gather children expansions from expansion state U64 child_count = 0; EV_Key *child_keys = 0; U64 *child_nums = 0; - if(!child_count && !expand_info.rows_default_expanded && expand_node != 0 && expand_info.row_count != 0 && expand_view_rule_info->expr_expand_range_info) + if(!child_count && !expand_info.rows_default_expanded && expand_node != 0 && expansion_row_count != 0) { // rjf: count children for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, child_count += 1){} @@ -776,7 +599,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, idx += 1) { child_keys[idx] = child->key; - child_nums[idx] = expand_view_rule_info->expr_expand_num_from_id(child->key.child_id, expand_info.user_data); + child_nums[idx] = lookup_rule->num_from_id(child->key.child_id, lookup_info.user_data); if(child_nums[idx] != child_keys[idx].child_id) { needs_sort = 1; @@ -816,7 +639,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str child_nums = push_array(scratch.arena, U64, child_count); for(U64 idx = 0; idx < child_count; idx += 1) { - U64 child_id = expand_view_rule_info->expr_expand_id_from_num(idx+1, expand_info.user_data); + U64 child_id = lookup_rule->id_from_num(idx+1, lookup_info.user_data); child_keys[idx] = ev_key_make(ev_hash_from_key(key), child_id); child_nums[idx] = idx+1; } @@ -827,39 +650,24 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str { U64 split_num = child_nums[idx]; U64 split_relative_idx = split_num - 1; - if(split_relative_idx >= expand_info.row_count) + if(split_relative_idx >= expansion_row_count) { continue; } if(expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx])) { - EV_ExpandRangeInfo child_expand = expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1), expand_info.user_data); - if(child_expand.row_exprs_count > 0) + Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1); + E_Expr *child_expr = &e_expr_nil; + String8 child_string = {0}; + lookup_rule->range(arena, t->expr, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string, lookup_info.user_data); + if(child_expr != &e_expr_nil) { EV_Key child_key = child_keys[idx]; - E_Expr *child_expr = child_expand.row_exprs[0]; - EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, t->view_rules); - String8 child_view_rule_string = ev_view_rule_from_key(view, child_key); - ev_view_rule_list_push_string(arena, child_view_rules, child_view_rule_string); - if(child_expand.row_strings[0].size != 0) - { - EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, child_expand.row_strings[0]); - ev_view_rule_list_concat_in_place(child_view_rules, &fastpath_view_rules); - } - { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType child_irtree = e_irtree_and_type_from_expr(scratch.arena, child_expr); - EV_ViewRuleList *child_auto_view_rules = ev_auto_view_rules_from_type_key(arena, child_irtree.type_key, 1, child_view_rule_string.size == 0); - ev_view_rule_list_concat_in_place(child_view_rules, &child_auto_view_rules); - scratch_end(scratch); - } - E_Expr *child_expr__resolved = ev_resolved_from_expr(arena, child_expr, child_view_rules); Task *task = push_array(scratch.arena, Task, 1); SLLQueuePush(first_task, last_task, task); task->parent_block = expansion_block; - task->expr = child_expr__resolved; + task->expr = child_expr; task->child_id = child_key.child_id; - task->view_rules = child_view_rules; task->split_relative_idx = split_relative_idx; task->default_expanded = expand_info.rows_default_expanded; } @@ -873,7 +681,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str } internal EV_BlockTree -ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules) +ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string) { ProfBeginFunction(); EV_BlockTree tree = {0}; @@ -881,10 +689,7 @@ ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 s { E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens); - EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, string); - EV_ViewRuleList *all_view_rules = ev_view_rule_list_copy(arena, view_rules); - ev_view_rule_list_concat_in_place(all_view_rules, &fastpath_view_rules); - tree = ev_block_tree_from_expr(arena, view, filter, string, parse.expr, all_view_rules); + tree = ev_block_tree_from_expr(arena, view, filter, string, parse.expr); } scratch_end(scratch); ProfEnd(); @@ -1004,7 +809,7 @@ ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num) if(contains_1u64(global_range, num)) { U64 relative_num = (num - base_num) + n->v.range.min + 1; - U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(relative_num, n->v.block->expand_view_rule_info_user_data); + U64 child_id = n->v.block->lookup_rule->id_from_num(relative_num, n->v.block->lookup_rule_user_data); EV_Key block_key = n->v.block->key; key = ev_key_make(ev_hash_from_key(block_key), child_id); break; @@ -1024,7 +829,7 @@ ev_num_from_key(EV_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(key.child_id, n->v.block->expand_view_rule_info_user_data); + U64 relative_num = n->v.block->lookup_rule->num_from_id(key.child_id, n->v.block->lookup_rule_user_data); Rng1U64 num_range = r1u64(n->v.range.min, n->v.block->single_item ? (n->v.range.min+1) : n->v.range.max); if(contains_1u64(num_range, relative_num-1)) { @@ -1141,25 +946,18 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 if(block_relative_range__windowed.max > block_relative_range__windowed.min) { // rjf: get info about expansion range - 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); + U64 range_exprs_count = dim_1u64(block_relative_range__windowed); + E_Expr **range_exprs = push_array(arena, E_Expr *, range_exprs_count); + String8 *range_exprs_strings = push_array(arena, String8 ,range_exprs_count); + for EachIndex(idx, range_exprs_count) + { + range_exprs[idx] = &e_expr_nil; + } + n->v.block->lookup_rule->range(arena, n->v.block->expr, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data); // rjf: no expansion operator applied -> push row for block expression; pass through block info - if(expand_range_info.row_exprs_count == 0) + if(range_exprs_count == 0) { - E_Member *member = &e_member_nil; - if(n->v.block->expr->kind == E_ExprKind_MemberAccess) - { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, n->v.block->expr->first); - E_TypeKey lhs_type_key = lhs_irtree.type_key; - E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, n->v.block->expr->last->string); - if(expr_member.kind != E_MemberKind_Null) - { - member = push_array(arena, E_Member, 1); - MemoryCopyStruct(member, &expr_member); - } - scratch_end(scratch); - } EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1); SLLQueuePush(rows.first, rows.last, row_node); rows.count += 1; @@ -1171,67 +969,24 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1; row->string = n->v.block->string; row->expr = n->v.block->expr; - row->member = member; - row->view_rules = n->v.block->view_rules; } // rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range - else + else for EachIndex(idx, range_exprs_count) { - for EachIndex(idx, expand_range_info.row_exprs_count) - { - U64 child_num = block_relative_range.min + num_skipped + 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); - EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id); - E_Expr *row_expr = expand_range_info.row_exprs[idx]; - EV_ViewRuleList *row_view_rules = ev_view_rule_list_from_inheritance(arena, n->v.block->view_rules); - String8 row_view_rule_string = ev_view_rule_from_key(view, row_key); - ev_view_rule_list_push_string(arena, row_view_rules, row_view_rule_string); - if(expand_range_info.row_strings[idx].size != 0) - { - EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, expand_range_info.row_strings[idx]); - ev_view_rule_list_concat_in_place(row_view_rules, &fastpath_view_rules); - } - { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType row_irtree = e_irtree_and_type_from_expr(scratch.arena, row_expr); - EV_ViewRuleList *row_auto_view_rules = ev_auto_view_rules_from_type_key(arena, row_irtree.type_key, 1, row_view_rule_string.size == 0); - ev_view_rule_list_concat_in_place(row_view_rules, &row_auto_view_rules); - scratch_end(scratch); - } - E_Expr *row_expr__resolved = ev_resolved_from_expr(arena, row_expr, row_view_rules); - EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1); - SLLQueuePush(rows.first, rows.last, row_node); - rows.count += 1; - EV_Row *row = &row_node->row; - row->block = n->v.block; - row->key = row_key; - row->visual_size = 1; - row->string = expand_range_info.row_strings[idx]; - row->expr = row_expr__resolved; - row->member = expand_range_info.row_members[idx]; - row->view_rules = row_view_rules; - if(row->member == &e_member_nil || row->member == 0) - { - if(row->expr->kind == E_ExprKind_MemberAccess) - { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first); - E_TypeKey lhs_type_key = lhs_irtree.type_key; - E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, row->expr->last->string); - if(expr_member.kind != E_MemberKind_Null) - { - row->member = push_array(arena, E_Member, 1); - MemoryCopyStruct(row->member, &expr_member); - } - scratch_end(scratch); - } - } - if(expand_range_info.row_view_rules[idx].size != 0) - { - ev_key_set_view_rule(view, row->key, expand_range_info.row_view_rules[idx]); - } - } + U64 child_num = block_relative_range.min + num_skipped + idx + 1; + U64 child_id = n->v.block->lookup_rule->id_from_num(child_num, n->v.block->lookup_rule_user_data); + EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id); + E_Expr *row_expr = range_exprs[idx]; + EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1); + SLLQueuePush(rows.first, rows.last, row_node); + rows.count += 1; + EV_Row *row = &row_node->row; + row->block = n->v.block; + row->key = row_key; + row->visual_size = 1; + row->string = range_exprs_strings[idx]; + row->expr = row_expr; } } } @@ -1298,14 +1053,7 @@ ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags) }break; case E_ExprKind_MemberAccess: { - if(flags & EV_StringFlag_PrettyNames && row->member->pretty_name.size != 0) - { - result = push_str8_copy(arena, row->member->pretty_name); - } - else - { - result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last)); - } + result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last)); }break; } return result; @@ -1319,9 +1067,9 @@ ev_row_is_expandable(EV_Row *row) // rjf: determine if view rules force expandability if(!result) { - for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next) + for(E_Expr *tag = row->expr->first_tag; tag != &e_expr_nil; tag = tag->next) { - EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); + EV_ViewRuleInfo *info = ev_view_rule_info_from_string(tag->first->string); if(info->flags & EV_ViewRuleInfoFlag_Expandable) { result = 1; diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 2a1da35f..696adcc4 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -74,30 +74,6 @@ struct EV_View EV_KeyViewRuleNode *free_key_view_rule_node; }; -//////////////////////////////// -//~ rjf: View Rule Instance Types - -typedef struct EV_ViewRule EV_ViewRule; -struct EV_ViewRule -{ - MD_Node *root; -}; - -typedef struct EV_ViewRuleNode EV_ViewRuleNode; -struct EV_ViewRuleNode -{ - EV_ViewRuleNode *next; - EV_ViewRule v; -}; - -typedef struct EV_ViewRuleList EV_ViewRuleList; -struct EV_ViewRuleList -{ - EV_ViewRuleNode *first; - EV_ViewRuleNode *last; - U64 count; -}; - //////////////////////////////// //~ rjf: View Rule Info Types @@ -111,36 +87,10 @@ struct EV_ExpandInfo B32 rows_default_expanded; }; -typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo; -struct EV_ExpandRangeInfo -{ - U64 row_exprs_count; - String8 *row_strings; - String8 *row_view_rules; - E_Expr **row_exprs; - E_Member **row_members; -}; - -#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params) +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, E_Expr *tag) #define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name #define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name)) - -#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(name) EV_ExpandRangeInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data) -#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_range_info__##name -#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name)) - -#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(name) U64 name(U64 num, void *user_data) -#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name) ev_view_rule_expr_expand_id_from_num_##name -#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name)) - -#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(name) U64 name(U64 id, void *user_data) -#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name) ev_view_rule_expr_expand_num_from_id_##name -#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name)) - typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType); -typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType); -typedef EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_ViewRuleExprExpandIDFromNumHookFunctionType); -typedef EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_ViewRuleExprExpandNumFromIDHookFunctionType); typedef U32 EV_ViewRuleInfoFlags; // NOTE(rjf): see @view_rule_info enum @@ -155,9 +105,6 @@ struct EV_ViewRuleInfo String8 string; EV_ViewRuleInfoFlags flags; EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info; - EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info; - EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_id_from_num; - EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_num_from_id; }; typedef struct EV_ViewRuleInfoNode EV_ViewRuleInfoNode; @@ -203,10 +150,12 @@ struct EV_Block // rjf: expression / visualization info String8 string; E_Expr *expr; - EV_ViewRuleList *view_rules; - EV_ViewRuleInfo *expand_view_rule_info; - MD_Node *expand_view_rule_params; - void *expand_view_rule_info_user_data; + E_Expr *lookup_tag; + E_Expr *expand_tag; + E_LookupRule *lookup_rule; + EV_ViewRuleInfo *expand_rule; + void *lookup_rule_user_data; + void *expand_rule_user_data; // rjf: expansion info U64 row_count; @@ -255,8 +204,6 @@ struct EV_Row U64 visual_size; String8 string; E_Expr *expr; - E_Member *member; - EV_ViewRuleList *view_rules; }; typedef struct EV_WindowedRowNode EV_WindowedRowNode; @@ -324,9 +271,6 @@ enum //~ rjf: Nil/Identity View Rule Hooks 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 @@ -336,14 +280,10 @@ global read_only EV_ViewRuleInfo ev_nil_view_rule_info = {0}, 0, 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; -global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &ev_nil_view_rule_list, &ev_nil_view_rule_info}; +global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_lookup_rule__default, &ev_nil_view_rule_info}; //////////////////////////////// //~ rjf: Key Functions @@ -384,34 +324,16 @@ internal void ev_view_rule_info_table_push_builtins(Arena *arena, EV_ViewRuleInf internal void ev_select_view_rule_info_table(EV_ViewRuleInfoTable *table); internal EV_ViewRuleInfo *ev_view_rule_info_from_string(String8 string); -//////////////////////////////// -//~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups - -internal void ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required); -internal void ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table); -internal EV_ViewRuleList *ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional); - -//////////////////////////////// -//~ rjf: View Rule Instance List Building - -internal void ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root); -internal void ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string); -internal EV_ViewRuleList *ev_view_rule_list_from_string(Arena *arena, String8 string); -internal EV_ViewRuleList *ev_view_rule_list_from_expr_fastpaths(Arena *arena, String8 string); -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); -internal void ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src); - //////////////////////////////// //~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application) -internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules); +internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr); //////////////////////////////// //~ rjf: Block Building -internal EV_BlockTree ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules); -internal EV_BlockTree ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules); +internal EV_BlockTree ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr); +internal EV_BlockTree ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string); internal U64 ev_depth_from_block(EV_Block *block); //////////////////////////////// diff --git a/src/eval_visualization/generated/eval_visualization.meta.c b/src/eval_visualization/generated/eval_visualization.meta.c index d40c4a80..30964f74 100644 --- a/src/eval_visualization/generated/eval_visualization.meta.c +++ b/src/eval_visualization/generated/eval_visualization.meta.c @@ -6,20 +6,20 @@ C_LINKAGE_BEGIN EV_ViewRuleInfo ev_builtin_view_rule_info_table[14] = { -{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*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) }, -{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("list"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(list) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(list) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, -{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("wrap"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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) }, -{str8_lit_comp("no_addr"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 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("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("list"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(list) }, +{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("wrap"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, +{str8_lit_comp("no_addr"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), }, }; C_LINKAGE_END diff --git a/src/eval_visualization/generated/eval_visualization.meta.h b/src/eval_visualization/generated/eval_visualization.meta.h index b3283350..5625eefd 100644 --- a/src/eval_visualization/generated/eval_visualization.meta.h +++ b/src/eval_visualization/generated/eval_visualization.meta.h @@ -8,7 +8,7 @@ typedef enum EV_ViewRuleKind { -EV_ViewRuleKind_Default, +EV_ViewRuleKind_EV_ViewRuleKind_Null, EV_ViewRuleKind_Array, EV_ViewRuleKind_List, EV_ViewRuleKind_Slice, @@ -25,8 +25,5 @@ EV_ViewRuleKind_NoAddress, EV_ViewRuleKind_COUNT, } EV_ViewRuleKind; -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list); #endif // EVAL_VISUALIZATION_META_H diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 9b0ad608..49c88b7f 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -719,48 +719,6 @@ str8_lit_comp("5"), str8_lit_comp("c"), }; -String8 rd_collection_name_table[2] = -{ -str8_lit_comp("scheduler_machine"), -str8_lit_comp("scheduler_process"), -}; - -RD_EntityKind rd_collection_entity_kind_table[2] = -{ -RD_EntityKind_Nil, -RD_EntityKind_Nil, -}; - -CTRL_EntityKind rd_collection_ctrl_entity_kind_table[2] = -{ -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -}; - -EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[2] = -{ -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_machine), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_process), -}; - -EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[2] = -{ -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_machine), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_process), -}; - -EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[2] = -{ -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_machine), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_process), -}; - -EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[2] = -{ -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_machine), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_process), -}; - RD_ViewRuleInfo rd_view_rule_kind_info_table[28] = { {{0}, {0}, {0}, {0}, RD_IconKind_Null, 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(null)}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 9e88a8d8..b8f1cc6b 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -651,14 +651,6 @@ RD_ViewRuleUIFunctionType *ui; .params_tree = rd_regs()->params_tree,\ .os_event = rd_regs()->os_event,\ -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_machine); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_machine); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_machine); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process); RD_VIEW_RULE_UI_FUNCTION_DEF(null); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(text); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(disasm); @@ -709,13 +701,6 @@ extern RD_StringBindingPair rd_default_binding_table[111]; extern String8 rd_binding_version_remap_old_name_table[8]; extern String8 rd_binding_version_remap_new_name_table[8]; extern String8 rd_icon_kind_text_table[69]; -extern String8 rd_collection_name_table[2]; -extern RD_EntityKind rd_collection_entity_kind_table[2]; -extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[2]; -extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[2]; -extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[2]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[2]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[2]; extern RD_ViewRuleInfo rd_view_rule_kind_info_table[28]; extern RD_IconKind rd_entity_kind_icon_kind_table[27]; extern String8 rd_theme_preset_display_string_table[9]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 16859833..789ed7bd 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1015,82 +1015,6 @@ RD_IconTable: @expand(RD_IconTable a) `str8_lit_comp("$(a.text)")`; } -//////////////////////////////// -//~ rjf: Collections - -@table(name entity_kind ctrl_entity_kind id_space) -RD_CollectionTable: -{ - //- rjf: frontend entity groups - //{watches Watch Null x} - //{targets Target Null x} - //{breakpoints Breakpoint Null x} - //{watch_pins WatchPin Null x} - //{file_path_maps FilePathMap Null x} - //{auto_view_rules AutoViewRule Null x} - - //- rjf: control entity groups - //{machines Nil Machine x} - //{processes Nil Process x} - //{threads Nil Thread x} - //{modules Nil Module x} - - //- rjf: scheduling control entity hierarchies - {scheduler_machine Nil Null x} - {scheduler_process Nil Null x} - - //- rjf: debug info / architecture watch tables - // {locals Nil Null -} - // {registers Nil Null -} - // {globals Nil Null x} - // {thread_locals Nil Null x} - // {types Nil Null x} - // {procedures Nil Null x} -} - -@gen -{ - @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF($(a.name));`; - @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF($(a.name));`; - @expand(RD_CollectionTable a) `$(a.id_space == x -> "EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF("..a.name..");")`; - @expand(RD_CollectionTable a) `$(a.id_space == x -> "EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF("..a.name..");")`; -} - -@data(String8) rd_collection_name_table: -{ - @expand(RD_CollectionTable a) `str8_lit_comp("$(a.name)")` -} - -@data(RD_EntityKind) rd_collection_entity_kind_table: -{ - @expand(RD_CollectionTable a) `RD_EntityKind_$(a.entity_kind)`, -} - -@data(CTRL_EntityKind) rd_collection_ctrl_entity_kind_table: -{ - @expand(RD_CollectionTable a) `CTRL_EntityKind_$(a.ctrl_entity_kind)`, -} - -@data(`EV_ViewRuleExprExpandInfoHookFunctionType *`) rd_collection_expr_expand_info_hook_function_table: -{ - @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME($(a.name))` -} - -@data(`EV_ViewRuleExprExpandRangeInfoHookFunctionType *`) rd_collection_expr_expand_range_info_hook_function_table: -{ - @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME($(a.name))` -} - -@data(`EV_ViewRuleExprExpandIDFromNumHookFunctionType *`) rd_collection_expr_expand_id_from_num_hook_function_table: -{ - @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME($(a.id_space == x -> a.name)$(a.id_space != x -> identity))` -} - -@data(`EV_ViewRuleExprExpandIDFromNumHookFunctionType *`) rd_collection_expr_expand_num_from_id_hook_function_table: -{ - @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME($(a.id_space == x -> a.name)$(a.id_space != x -> identity))` -} - //////////////////////////////// //~ rjf: View Rules diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 21c67123..f8cb8411 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -8736,18 +8736,19 @@ rd_window_frame(void) //////////////////////////////// //~ rjf: Eval Visualization -typedef struct RD_EntityExpandAccel RD_EntityExpandAccel; -struct RD_EntityExpandAccel -{ - RD_EntityArray entities; -}; - typedef struct RD_CtrlEntityExpandAccel RD_CtrlEntityExpandAccel; struct RD_CtrlEntityExpandAccel { CTRL_EntityArray entities; }; +#if 0 // TODO(rjf): @cfg +typedef struct RD_EntityExpandAccel RD_EntityExpandAccel; +struct RD_EntityExpandAccel +{ + RD_EntityArray entities; +}; + //- rjf: control entity hierarchies EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine) @@ -8908,6 +8909,7 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process) { return id; } +#endif //- rjf: debug info tables @@ -8942,24 +8944,17 @@ E_LOOKUP_INFO_FUNCTION_DEF(watches) E_LOOKUP_RANGE_FUNCTION_DEF(watches) { - E_LookupRange result = {0}; + RD_CfgArray *cfgs = (RD_CfgArray *)user_data; + Rng1U64 legal_idx_range = r1u64(0, cfgs->count); + Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); + U64 read_range_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) { - RD_CfgArray *cfgs = (RD_CfgArray *)user_data; - Rng1U64 legal_idx_range = r1u64(0, cfgs->count); - Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); - U64 read_range_count = dim_1u64(read_range); - result.exprs_count = read_range_count; - result.exprs = push_array(arena, E_Expr *, result.exprs_count); - result.exprs_strings = push_array(arena, String8, result.exprs_count); - for(U64 idx = 0; idx < result.exprs_count; idx += 1) - { - U64 cfg_idx = read_range.min + idx; - String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string; - result.exprs[idx] = e_parse_expr_from_text(arena, expr_string); - result.exprs_strings[idx] = push_str8_copy(arena, expr_string); - } + U64 cfg_idx = read_range.min + idx; + String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string; + exprs[idx] = e_parse_expr_from_text(arena, expr_string); + exprs_strings[idx] = push_str8_copy(arena, expr_string); } - return result; } E_LOOKUP_INFO_FUNCTION_DEF(locals) @@ -8990,23 +8985,16 @@ E_LOOKUP_INFO_FUNCTION_DEF(locals) E_LOOKUP_RANGE_FUNCTION_DEF(locals) { - E_LookupRange result = {0}; + String8Array *accel = (String8Array *)user_data; + Rng1U64 legal_idx_range = r1u64(0, accel->count); + Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); + U64 read_range_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) { - String8Array *accel = (String8Array *)user_data; - Rng1U64 legal_idx_range = r1u64(0, accel->count); - Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); - U64 read_range_count = dim_1u64(read_range); - result.exprs_count = read_range_count; - result.exprs = push_array(arena, E_Expr *, result.exprs_count); - result.exprs_strings = push_array(arena, String8, result.exprs_count); - for(U64 idx = 0; idx < result.exprs_count; idx += 1) - { - String8 expr_string = accel->v[read_range.min + idx]; - result.exprs[idx] = e_parse_expr_from_text(arena, expr_string); - result.exprs_strings[idx] = push_str8_copy(arena, expr_string); - } + String8 expr_string = accel->v[read_range.min + idx]; + exprs[idx] = e_parse_expr_from_text(arena, expr_string); + exprs_strings[idx] = push_str8_copy(arena, expr_string); } - return result; } E_LOOKUP_INFO_FUNCTION_DEF(registers) @@ -9045,22 +9033,16 @@ E_LOOKUP_INFO_FUNCTION_DEF(registers) E_LOOKUP_RANGE_FUNCTION_DEF(registers) { String8Array *accel = (String8Array *)user_data; - E_LookupRange result = {0}; + Rng1U64 legal_idx_range = r1u64(0, accel->count); + Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); + U64 read_range_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) { - Rng1U64 legal_idx_range = r1u64(0, accel->count); - Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); - result.exprs_count = dim_1u64(read_range); - result.exprs = push_array(arena, E_Expr *, result.exprs_count); - result.exprs_strings = push_array(arena, String8, result.exprs_count); - for(U64 idx = 0; idx < result.exprs_count; idx += 1) - { - String8 register_name = accel->v[read_range.min + idx]; - String8 register_expr = push_str8f(arena, "reg:%S", register_name); - result.exprs_strings[idx] = register_name; - result.exprs[idx] = e_parse_expr_from_text(arena, register_expr); - } + String8 register_name = accel->v[read_range.min + idx]; + String8 register_expr = push_str8f(arena, "reg:%S", register_name); + exprs_strings[idx] = register_name; + exprs[idx] = e_parse_expr_from_text(arena, register_expr); } - return result; } E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg) @@ -9241,101 +9223,94 @@ E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table) E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) { RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; - E_LookupRange result = {0}; + U64 needed_row_count = dim_1u64(idx_range); + for EachIndex(idx, needed_row_count) { - U64 needed_row_count = dim_1u64(idx_range); - result.exprs_count = Min(needed_row_count, accel->items.count); - result.exprs = push_array(arena, E_Expr *, result.exprs_count); - result.exprs_strings = push_array(arena, String8, result.exprs_count); - for EachIndex(idx, result.exprs_count) + // rjf: unpack row + DI_SearchItem *item = &accel->items.v[idx_range.min + idx]; + + // rjf: skip bad elements + if(item->dbgi_idx >= accel->rdis_count) { - // rjf: unpack row - DI_SearchItem *item = &accel->items.v[idx_range.min + idx]; - - // rjf: skip bad elements - if(item->dbgi_idx >= accel->rdis_count) - { - continue; - } - - // rjf: unpack row info - RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; - E_Module *module = &e_parse_ctx->modules[item->dbgi_idx]; - - // rjf: build expr - E_Expr *item_expr = &e_expr_nil; - { - U64 element_idx = item->idx; - switch(accel->section) - { - default:{}break; - case RDI_SectionKind_Procedures: - { - RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx); - RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx); - U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); - String8 bytecode = e_bytecode_from_oplist(arena, &oplist); - U32 type_idx = procedure->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); - item_expr->mode = E_Mode_Value; - item_expr->space = module->space; - item_expr->type_key = type_key; - item_expr->bytecode = bytecode; - item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size); - }break; - case RDI_SectionKind_GlobalVariables: - { - RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx); - U64 voff = gvar->voff; - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); - String8 bytecode = e_bytecode_from_oplist(arena, &oplist); - U32 type_idx = gvar->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); - item_expr->mode = E_Mode_Offset; - item_expr->space = module->space; - item_expr->type_key = type_key; - item_expr->bytecode = bytecode; - item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size); - }break; - case RDI_SectionKind_ThreadVariables: - { - RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off)); - String8 bytecode = e_bytecode_from_oplist(arena, &oplist); - U32 type_idx = tvar->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); - item_expr->mode = E_Mode_Offset; - item_expr->space = module->space; - item_expr->type_key = type_key; - item_expr->bytecode = bytecode; - item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size); - }break; - case RDI_SectionKind_UDTs: - { - RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); - item_expr->type_key = type_key; - }break; - } - } - - // rjf: fill - result.exprs[idx] = item_expr; + continue; } + + // rjf: unpack row info + RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; + E_Module *module = &e_parse_ctx->modules[item->dbgi_idx]; + + // rjf: build expr + E_Expr *item_expr = &e_expr_nil; + { + U64 element_idx = item->idx; + switch(accel->section) + { + default:{}break; + case RDI_SectionKind_Procedures: + { + RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx); + RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx); + U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = procedure->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Value; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_GlobalVariables: + { + RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx); + U64 voff = gvar->voff; + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = gvar->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Offset; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_ThreadVariables: + { + RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = tvar->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Offset; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_UDTs: + { + RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); + item_expr->type_key = type_key; + }break; + } + } + + // rjf: fill + exprs[idx] = item_expr; } - return result; } E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table) @@ -9356,174 +9331,8 @@ E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(debug_info_table) return num; } -internal EV_ExpandInfo -rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind) -{ - RD_EntityExpandAccel *accel = push_array(arena, RD_EntityExpandAccel, 1); - Temp scratch = scratch_begin(&arena, 1); - { - RD_EntityList entities = rd_query_cached_entity_list_with_kind(kind); - RD_EntityList entities_filtered = {0}; - for(RD_EntityNode *n = entities.first; n != 0; n = n->next) - { - RD_Entity *entity = n->entity; - String8 entity_expr_string = entity->string; - B32 is_collection = 0; - for EachElement(idx, rd_collection_name_table) - { - if(str8_match(entity_expr_string, rd_collection_name_table[idx], 0)) - { - is_collection = 1; - break; - } - } - B32 is_in_filter = 1; - if(!is_collection && filter.size != 0) - { - RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); - RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); - RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); - FuzzyMatchRangeList expr_matches = fuzzy_match_find(scratch.arena, filter, entity_expr_string); - FuzzyMatchRangeList loc_matches = fuzzy_match_find(scratch.arena, filter, loc->string); - FuzzyMatchRangeList exe_matches = fuzzy_match_find(scratch.arena, filter, exe->string); - FuzzyMatchRangeList args_matches = fuzzy_match_find(scratch.arena, filter, args->string); - is_in_filter = (expr_matches.count == expr_matches.needle_part_count || - loc_matches.count == loc_matches.needle_part_count || - exe_matches.count == exe_matches.needle_part_count || - args_matches.count == args_matches.needle_part_count); - } - if(is_collection || is_in_filter) - { - rd_entity_list_push(scratch.arena, &entities_filtered, entity); - } - } - accel->entities = rd_entity_array_from_list(arena, &entities_filtered); - } - scratch_end(scratch); - EV_ExpandInfo info = {accel, accel->entities.count + 1}; - info.add_new_row = 1; - return info; -} - -internal EV_ExpandRangeInfo -rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top) -{ - RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; - EV_ExpandRangeInfo result = {0}; - { - U64 entities_base_idx = (U64)!!add_new_at_top; - U64 needed_row_count = dim_1u64(idx_range); - result.row_exprs_count = Min(needed_row_count, accel->entities.count+1); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) - { - U64 child_idx = idx_range.min + row_expr_idx; - RD_Entity *entity = &rd_nil_entity; - if(entities_base_idx <= child_idx && child_idx < entities_base_idx+accel->entities.count) - { - entity = accel->entities.v[child_idx-entities_base_idx]; - } - if(!rd_entity_is_nil(entity)) - { - String8 entity_expr_string = (kind == RD_EntityKind_Watch ? entity->string : push_str8f(arena, "entity:$%I64u", entity->id)); - if(kind == RD_EntityKind_Watch) - { - result.row_strings[row_expr_idx] = entity_expr_string; - } - result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); - result.row_view_rules[row_expr_idx] = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule)->string; - } - else - { - result.row_exprs[row_expr_idx] = &e_expr_nil; - } - result.row_members[row_expr_idx] = &e_member_nil; - } - } - return result; -} - -internal U64 -rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top) -{ - U64 id = 0; - RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; - U64 entities_base_idx = (U64)!!add_new_at_top; - if(entities_base_idx+1 <= num && num < entities_base_idx+accel->entities.count+1) - { - id = accel->entities.v[num-(entities_base_idx+1)]->id; - } - else - { - id = max_U64; - } - return id; -} - -internal U64 -rd_ev_view_rule_expr_num_from_id__meta_entities(U64 id, void *user_data, RD_EntityKind kind, B32 add_new_at_top) -{ - RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; - U64 num = 0; - U64 entities_base_idx = (U64)!!add_new_at_top; - if(id == max_U64) - { - num = add_new_at_top ? 1 : (entities_base_idx + accel->entities.count + 1); - } - else for(U64 idx = 0; idx < accel->entities.count; idx += 1) - { - if(accel->entities.v[idx]->id == id) - { - num = entities_base_idx+idx+1; - break; - } - } - return num; -} - -internal EV_ExpandInfo -rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind) -{ - RD_CtrlEntityExpandAccel *accel = push_array(arena, RD_CtrlEntityExpandAccel, 1); - Temp scratch = scratch_begin(&arena, 1); - { - CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); - CTRL_EntityList entities_filtered = {0}; - for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next) - { - CTRL_Entity *entity = n->v; - B32 is_in_filter = 1; - if(filter.size != 0) - { - is_in_filter = 0; - FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string); - if(matches.count == matches.needle_part_count) - { - is_in_filter = 1; - } - } - if(is_in_filter) - { - ctrl_entity_list_push(scratch.arena, &entities_filtered, entity); - } - } - accel->entities = ctrl_entity_array_from_list(arena, &entities_filtered); - } - scratch_end(scratch); - EV_ExpandInfo info = {accel, accel->entities.count}; - // TODO(rjf): @hack - if(kind == CTRL_EntityKind_Machine) - { - info.rows_default_expanded = 1; - } - return info; -} - internal F32 -rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out) +rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, String8List *out) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -9535,22 +9344,22 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul B32 no_addr = 0; B32 no_string = 0; B32 has_array = 0; - for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next) + for(E_Expr *tag = eval.expr->first_tag; tag != &e_expr_nil; tag = tag->next) { if(0){} - else if(str8_match(n->v.root->string, str8_lit("dec"), 0)) {radix = 10;} - else if(str8_match(n->v.root->string, str8_lit("hex"), 0)) {radix = 16;} - else if(str8_match(n->v.root->string, str8_lit("bin"), 0)) {radix = 2; } - else if(str8_match(n->v.root->string, str8_lit("oct"), 0)) {radix = 8; } - else if(str8_match(n->v.root->string, str8_lit("no_addr"), 0)) {no_addr = 1;} - else if(str8_match(n->v.root->string, str8_lit("no_string"), 0)) {no_string = 1;} - else if(str8_match(n->v.root->string, str8_lit("array"), 0)) {has_array = 1;} - else if(str8_match(n->v.root->string, str8_lit("digits"), 0)) + else if(str8_match(tag->string, str8_lit("dec"), 0)) {radix = 10;} + else if(str8_match(tag->string, str8_lit("hex"), 0)) {radix = 16;} + else if(str8_match(tag->string, str8_lit("bin"), 0)) {radix = 2; } + else if(str8_match(tag->string, str8_lit("oct"), 0)) {radix = 8; } + else if(str8_match(tag->string, str8_lit("no_addr"), 0)) {no_addr = 1;} + else if(str8_match(tag->string, str8_lit("no_string"), 0)) {no_string = 1;} + else if(str8_match(tag->first->string, str8_lit("array"), 0)) {has_array = 1;} + else if(str8_match(tag->first->string, str8_lit("digits"), 0)) { - String8 expr = md_string_from_children(scratch.arena, n->v.root); - E_Eval eval = e_eval_from_string(scratch.arena, expr); - E_Eval value_eval = e_value_eval_from_eval(eval); - min_digits = (U32)value_eval.value.u64; + E_Expr *num_expr = tag->first->next; + E_Eval num_eval = e_eval_from_expr(scratch.arena, num_expr); + E_Eval num_value_eval = e_value_eval_from_eval(num_eval); + min_digits = (U32)num_value_eval.value.u64; } } if(eval.space.kind == RD_EvalSpaceKind_MetaEntity || @@ -9718,7 +9527,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr); E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr); - space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, 0, view_rules, out); + space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, out); } else { @@ -9745,7 +9554,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul // rjf: special case: push strings for textual string content B32 did_content = 0; - if(!did_content && array_is_string && !no_string && (member == 0 || member->kind != E_MemberKind_Padding)) + if(!did_content && array_is_string && !no_string) { U64 element_size = e_type_byte_size_from_key(direct_type_key); did_content = 1; @@ -9804,7 +9613,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { E_Expr *element_expr = e_expr_ref_array_index(scratch.arena, eval.expr, idx); E_Eval element_eval = e_eval_from_expr(scratch.arena, element_expr); - space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, 0, view_rules, out); + space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, out); if(idx+1 < array_count) { String8 comma = str8_lit(", "); @@ -9858,9 +9667,9 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { E_Member *mem = &data_members.v[member_idx]; E_Expr *dot_expr = e_expr_ref_member_access(scratch.arena, eval.expr, mem->name); - E_Expr *dot_expr_resolved = ev_resolved_from_expr(scratch.arena, dot_expr, view_rules); + E_Expr *dot_expr_resolved = ev_resolved_from_expr(scratch.arena, dot_expr); E_Eval dot_eval = e_eval_from_expr(scratch.arena, dot_expr_resolved); - space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, 0, view_rules, out); + space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, out); if(member_idx+1 < data_members.count) { String8 comma = str8_lit(", "); @@ -9897,11 +9706,11 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul } internal String8 -rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules) +rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval) { Temp scratch = scratch_begin(&arena, 1); String8List strs = {0}; - rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, member, view_rules, &strs); + rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, &strs); String8 result = str8_list_join(arena, &strs, 0); scratch_end(scratch); return result; @@ -13043,15 +12852,6 @@ rd_frame(void) } e_select_parse_ctx(parse_ctx); - //////////////////////////// - //- rjf: create names/type-info for debugger collections - // - E_TypeKey collection_type_keys[ArrayCount(rd_collection_name_table)] = {0}; - for EachElement(idx, rd_collection_name_table) - { - collection_type_keys[idx] = e_type_key_cons(.kind = E_TypeKind_Array, .name = rd_collection_name_table[idx]); - } - //////////////////////////// //- rjf: build eval IR context // @@ -13064,19 +12864,6 @@ rd_frame(void) ctx->lookup_rule_map = push_array(scratch.arena, E_LookupRuleMap, 1); ctx->lookup_rule_map[0] = e_lookup_rule_map_make(scratch.arena, 512); - //- rjf: add macros for collections -#if 0 // TODO(rjf): @cfg - { - for EachElement(idx, rd_collection_name_table) - { - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->mode = E_Mode_Null; - expr->type_key = collection_type_keys[idx]; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, rd_collection_name_table[idx], expr); - } - } -#endif - //- rjf: choose set of evallable meta names String8 evallable_meta_names[] = { @@ -13107,10 +12894,10 @@ rd_frame(void) bool_type_key = e_type_key_basic(E_TypeKind_Bool); u64_type_key = e_type_key_basic(E_TypeKind_U64); vaddr_range_type_key = e_type_key_cons(E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v); - code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsCodeText); - path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPathText); - string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText); - location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText); + code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText); + path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText); + string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText); + location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText); } //- rjf: build types for each evallable meta name @@ -13380,52 +13167,16 @@ rd_frame(void) EV_ViewRuleInfoTable *view_rule_info_table = push_array(scratch.arena, EV_ViewRuleInfoTable, 1); { ev_view_rule_info_table_push_builtins(scratch.arena, view_rule_info_table); - - // rjf: collection view rules - for EachElement(idx, rd_collection_name_table) - { - EV_ViewRuleInfo info = {0}; - info.string = rd_collection_name_table[idx]; - info.flags = EV_ViewRuleInfoFlag_Expandable; - info.expr_expand_info = rd_collection_expr_expand_info_hook_function_table[idx]; - info.expr_expand_range_info = rd_collection_expr_expand_range_info_hook_function_table[idx]; - info.expr_expand_id_from_num = rd_collection_expr_expand_id_from_num_hook_function_table[idx]; - info.expr_expand_num_from_id = rd_collection_expr_expand_num_from_id_hook_function_table[idx]; - ev_view_rule_info_table_push(scratch.arena, view_rule_info_table, &info); - } - - // rjf: visualizer view rules - for EachEnumVal(RD_ViewRuleKind, k) - { - RD_ViewRuleInfo *src_info = &rd_view_rule_kind_info_table[k]; - if(src_info->flags & RD_ViewRuleInfoFlag_CanUseInWatchTable) - { - EV_ViewRuleInfo dst_info = {0}; - dst_info.string = src_info->string; - dst_info.flags = src_info->flags & RD_ViewRuleInfoFlag_CanExpand ? EV_ViewRuleInfoFlag_Expandable : 0; - dst_info.expr_expand_info = src_info->expr_expand_info; - dst_info.expr_expand_range_info = EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil); - dst_info.expr_expand_id_from_num = EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity); - dst_info.expr_expand_num_from_id = EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity); - ev_view_rule_info_table_push(scratch.arena, view_rule_info_table, &dst_info); - } - } } ev_select_view_rule_info_table(view_rule_info_table); //////////////////////////// //- rjf: build eval visualization auto-view-rule table // + // TODO(rjf): @cfg + // EV_AutoViewRuleTable *auto_view_rule_table = push_array(scratch.arena, EV_AutoViewRuleTable, 1); { - // ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_CheckB32)), str8_lit("checkbox"), 1); - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MetaEvalFrameArray)), str8_lit("slice"), 1); - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MachineMetaEval)), str8_lit("scheduler_machine"), 1); - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_ProcessMetaEval)), str8_lit("scheduler_process"), 1); - for EachElement(idx, rd_collection_name_table) - { - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx], 1); - } RD_CfgList auto_view_rules = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("auto_view_rule")); for(RD_CfgNode *n = auto_view_rules.first; n != 0; n = n->next) { @@ -13437,11 +13188,11 @@ rd_frame(void) E_TypeKey type_key = e_type_from_expr(type_parse.expr); if(!e_type_key_match(e_type_key_zero(), type_key)) { - ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0); + // ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0); } } } - ev_select_auto_view_rule_table(auto_view_rule_table); + // ev_select_auto_view_rule_table(auto_view_rule_table); //////////////////////////// //- rjf: autosave if needed diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 1d2e38f4..7dbc97af 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1303,18 +1303,8 @@ internal void rd_window_frame(void); //////////////////////////////// //~ rjf: Eval Visualization -internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind); -internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top); -internal U64 rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top); -internal U64 rd_ev_view_rule_expr_num_from_id__meta_entities(U64 id, void *user_data, RD_EntityKind kind, B32 add_new_at_top); - -internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind); -internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind); -internal U64 rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind); -internal U64 rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind); - -internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out); -internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules); +internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, String8List *out); +internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval); //////////////////////////////// //~ rjf: Hover Eval diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 252fcb25..0f785c4f 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -987,6 +987,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) //- rjf: row -> context info +#if 0 // TODO(rjf): @cfg internal RD_WatchViewRowInfo rd_watch_view_row_info_from_row(EV_Row *row) { @@ -1103,6 +1104,7 @@ rd_watch_view_row_info_from_row(EV_Row *row) } return info; } +#endif //- rjf: row * cell -> string @@ -1204,7 +1206,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, RD_WatchRowInfo *row_info //- rjf: evaluate wrapped expression result.eval = e_eval_from_expr(scratch.arena, root_expr); - result.string = rd_value_string_from_eval(arena, 0, 10, font, font_size, max_size_px, result.eval, &e_member_nil, row->view_rules); + result.string = rd_value_string_from_eval(arena, 0, 10, font, font_size, max_size_px, result.eval); scratch_end(scratch); }break; @@ -1214,6 +1216,8 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, RD_WatchRowInfo *row_info //- rjf: row/column -> strings +#if 0 // TODO(rjf): @cfg + internal E_Expr * rd_expr_from_watch_view_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn *col) { @@ -1409,6 +1413,8 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn return result; } +#endif + //- rjf: table coordinates -> text edit state internal RD_WatchViewTextEditState * @@ -1491,7 +1497,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view ////////////////////////////// //- rjf: unpack arguments // - EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_from_string(scratch.arena, root_view_rule); EV_View *eval_view = rd_view_eval_view(); String8 filter = rd_view_filter(); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); @@ -1559,7 +1564,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view MemoryZeroStruct(&block_tree); MemoryZeroStruct(&block_ranges); ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1); - block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, root_expr, top_level_view_rules); + block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, root_expr); block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree); } @@ -2026,10 +2031,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row_node != 0; y += 1, row_node = row_node->next) { EV_Row *row = &row_node->row; - for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) + RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); + S64 cell_x = 0; + for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, cell_x += 1) { - RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); - String8 cell_string = rd_string_from_eval_viz_row_column(scratch.arena, row, col, string_flags|EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); + if(cell_x < selection_tbl.min.x || selection_tbl.max.x < cell_x) + { + continue; + } + RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px); + String8 cell_string = cell_info.string; 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) @@ -2038,7 +2049,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view comma_pos < cell_string.size ? "\"" : "", cell_string, comma_pos < cell_string.size ? "\"" : "", - x+1 <= selection_tbl.max.x ? "," : ""); + cell_x+1 <= selection_tbl.max.x ? "," : ""); } else { @@ -2288,6 +2299,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view RD_EntityKind collection_entity_kind = RD_EntityKind_Nil; E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, selection_block->expr); E_Type *type = e_type_from_key(scratch.arena, irtree.type_key); +#if 0 // TODO(rjf): @cfg for EachElement(idx, rd_collection_name_table) { if(str8_match(type->name, rd_collection_name_table[idx], 0)) @@ -2296,6 +2308,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view break; } } +#endif // rjf: map selection endpoints to entities RD_Entity *first_entity = &rd_nil_entity; diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index 90ce0dc6..841045e1 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -239,14 +239,18 @@ internal Vec2S64 rd_tbl_from_watch_pt(EV_BlockRangeList *block_ranges, RD_WatchP internal RD_WatchRowInfo rd_watch_row_info_from_row(Arena *arena, EV_Row *row); //- rjf: row -> context info +#if 0 // TODO(rjf): @cfg internal RD_WatchViewRowInfo rd_watch_view_row_info_from_row(EV_Row *row); +#endif //- rjf: row * cell -> info internal RD_WatchRowCellInfo rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, RD_WatchRowInfo *row_info, RD_WatchCell *cell, FNT_Tag font, F32 font_size, F32 max_size_px); //- rjf: row/column -> exprs / strings +#if 0 // TODO(rjf): @cfg internal E_Expr *rd_expr_from_watch_view_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn *col); internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px); +#endif //- rjf: table coordinates -> text edit state internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchPt pt); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index d33e32bd..eceda5a1 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1286,8 +1286,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe String8 eval_string = {0}; if(!e_type_key_match(e_type_key_zero(), eval.type_key)) { - EV_ViewRuleList view_rules = {0}; - eval_string = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval, &e_member_nil, &view_rules); + eval_string = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval); } ui_spacer(ui_em(1.5f, 1.f)); ui_set_next_pref_width(ui_children_sum(1));