diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 6c92cc68..e0d58d72 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -428,16 +428,10 @@ D_ViewRuleTable: COUNT, } -@gen -{ - @expand(D_ViewRuleTable a) `$(a.xp == "x" -> "D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(D_ViewRuleTable a) `$(a.vb == "x" -> "D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; -} - @data(D_ViewRuleSpecInfo) @c_file d_core_view_rule_spec_info_table: { @expand(D_ViewRuleTable a) - ```{str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.schema)"), str8_lit_comp("$(a.description)"), (D_ViewRuleSpecInfoFlag_Inherited*$(a.ih == "x"))|(D_ViewRuleSpecInfoFlag_Expandable*$(a.ex == "x"))|(D_ViewRuleSpecInfoFlag_ExprResolution*$(a.xp == "x"))|(D_ViewRuleSpecInfoFlag_VizBlockProd*$(a.vb == "x")), $(a.xp == "x" -> "D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xp != "x" -> 0), $(a.vb == "x" -> "D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; + ```{str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.schema)"), str8_lit_comp("$(a.description)"), (D_ViewRuleSpecInfoFlag_Inherited*$(a.ih == "x"))|(D_ViewRuleSpecInfoFlag_Expandable*$(a.ex == "x"))|(D_ViewRuleSpecInfoFlag_ExprResolution*$(a.xp == "x"))|(D_ViewRuleSpecInfoFlag_VizBlockProd*$(a.vb == "x")), }```; } //////////////////////////////// diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index de0c96e6..18dca9d5 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -3493,439 +3493,6 @@ d_eval_view_rule_from_key(D_EvalView *eval_view, D_ExpandKey key) //////////////////////////////// //~ rjf: Evaluation View Visualization & Interaction -//- rjf: expr * view rule table -> expr - -internal E_Expr * -d_expr_from_expr_cfg(Arena *arena, E_Expr *expr, D_CfgTable *cfg) -{ - for(D_CfgVal *val = cfg->first_val; val != 0 && val != &d_nil_cfg_val; val = val->linear_next) - { - D_ViewRuleSpec *spec = d_view_rule_spec_from_string(val->string); - if(spec->info.flags & D_ViewRuleSpecInfoFlag_ExprResolution) - { - expr = spec->info.expr_resolution(arena, expr, val->last->root); - } - } - return expr; -} - -//- rjf: evaluation value string builder helpers - -internal String8 -d_string_from_ascii_value(Arena *arena, U8 val) -{ - String8 result = {0}; - switch(val) - { - case 0x00:{result = str8_lit("\\0");}break; - case 0x07:{result = str8_lit("\\a");}break; - case 0x08:{result = str8_lit("\\b");}break; - case 0x0c:{result = str8_lit("\\f");}break; - case 0x0a:{result = str8_lit("\\n");}break; - case 0x0d:{result = str8_lit("\\r");}break; - case 0x09:{result = str8_lit("\\t");}break; - case 0x0b:{result = str8_lit("\\v");}break; - case 0x3f:{result = str8_lit("\\?");}break; - case '"': {result = str8_lit("\\\"");}break; - case '\'':{result = str8_lit("\\'");}break; - case '\\':{result = str8_lit("\\\\");}break; - default: - if(32 <= val && val < 255) - { - result = push_str8f(arena, "%c", val); - }break; - } - return result; -} - -internal String8 -d_string_from_hresult_facility_code(U32 code) -{ - String8 result = {0}; - switch(code) - { - default:{}break; - case 0x1:{result = str8_lit("RPC");}break; - case 0x2:{result = str8_lit("DISPATCH");}break; - case 0x3:{result = str8_lit("STORAGE");}break; - case 0x4:{result = str8_lit("ITF");}break; - case 0x7:{result = str8_lit("WIN32");}break; - case 0x8:{result = str8_lit("WINDOWS");}break; - case 0x9:{result = str8_lit("SECURITY|SSPI");}break; - case 0xA:{result = str8_lit("CONTROL");}break; - case 0xB:{result = str8_lit("CERT");}break; - case 0xC:{result = str8_lit("INTERNET");}break; - case 0xD:{result = str8_lit("MEDIASERVER");}break; - case 0xE:{result = str8_lit("MSMQ");}break; - case 0xF:{result = str8_lit("SETUPAPI");}break; - case 0x10:{result = str8_lit("SCARD");}break; - case 0x11:{result = str8_lit("COMPLUS");}break; - case 0x12:{result = str8_lit("AAF");}break; - case 0x13:{result = str8_lit("URT");}break; - case 0x14:{result = str8_lit("ACS");}break; - case 0x15:{result = str8_lit("DPLAY");}break; - case 0x16:{result = str8_lit("UMI");}break; - case 0x17:{result = str8_lit("SXS");}break; - case 0x18:{result = str8_lit("WINDOWS_CE");}break; - case 0x19:{result = str8_lit("HTTP");}break; - case 0x1A:{result = str8_lit("USERMODE_COMMONLOG");}break; - case 0x1B:{result = str8_lit("WER");}break; - case 0x1F:{result = str8_lit("USERMODE_FILTER_MANAGER");}break; - case 0x20:{result = str8_lit("BACKGROUNDCOPY");}break; - case 0x21:{result = str8_lit("CONFIGURATION|WIA");}break; - case 0x22:{result = str8_lit("STATE_MANAGEMENT");}break; - case 0x23:{result = str8_lit("METADIRECTORY");}break; - case 0x24:{result = str8_lit("WINDOWSUPDATE");}break; - case 0x25:{result = str8_lit("DIRECTORYSERVICE");}break; - case 0x26:{result = str8_lit("GRAPHICS");}break; - case 0x27:{result = str8_lit("SHELL|NAP");}break; - case 0x28:{result = str8_lit("TPM_SERVICES");}break; - case 0x29:{result = str8_lit("TPM_SOFTWARE");}break; - case 0x2A:{result = str8_lit("UI");}break; - case 0x2B:{result = str8_lit("XAML");}break; - case 0x2C:{result = str8_lit("ACTION_QUEUE");}break; - case 0x30:{result = str8_lit("WINDOWS_SETUP|PLA");}break; - case 0x31:{result = str8_lit("FVE");}break; - case 0x32:{result = str8_lit("FWP");}break; - case 0x33:{result = str8_lit("WINRM");}break; - case 0x34:{result = str8_lit("NDIS");}break; - case 0x35:{result = str8_lit("USERMODE_HYPERVISOR");}break; - case 0x36:{result = str8_lit("CMI");}break; - case 0x37:{result = str8_lit("USERMODE_VIRTUALIZATION");}break; - case 0x38:{result = str8_lit("USERMODE_VOLMGR");}break; - case 0x39:{result = str8_lit("BCD");}break; - case 0x3A:{result = str8_lit("USERMODE_VHD");}break; - case 0x3C:{result = str8_lit("SDIAG");}break; - case 0x3D:{result = str8_lit("WINPE|WEBSERVICES");}break; - case 0x3E:{result = str8_lit("WPN");}break; - case 0x3F:{result = str8_lit("WINDOWS_STORE");}break; - case 0x40:{result = str8_lit("INPUT");}break; - case 0x42:{result = str8_lit("EAP");}break; - case 0x50:{result = str8_lit("WINDOWS_DEFENDER");}break; - case 0x51:{result = str8_lit("OPC");}break; - case 0x52:{result = str8_lit("XPS");}break; - case 0x53:{result = str8_lit("RAS");}break; - case 0x54:{result = str8_lit("POWERSHELL|MBN");}break; - case 0x55:{result = str8_lit("EAS");}break; - case 0x62:{result = str8_lit("P2P_INT");}break; - case 0x63:{result = str8_lit("P2P");}break; - case 0x64:{result = str8_lit("DAF");}break; - case 0x65:{result = str8_lit("BLUETOOTH_ATT");}break; - case 0x66:{result = str8_lit("AUDIO");}break; - case 0x6D:{result = str8_lit("VISUALCPP");}break; - case 0x70:{result = str8_lit("SCRIPT");}break; - case 0x71:{result = str8_lit("PARSE");}break; - case 0x78:{result = str8_lit("BLB");}break; - case 0x79:{result = str8_lit("BLB_CLI");}break; - case 0x7A:{result = str8_lit("WSBAPP");}break; - case 0x80:{result = str8_lit("BLBUI");}break; - case 0x81:{result = str8_lit("USN");}break; - case 0x82:{result = str8_lit("USERMODE_VOLSNAP");}break; - case 0x83:{result = str8_lit("TIERING");}break; - case 0x85:{result = str8_lit("WSB_ONLINE");}break; - case 0x86:{result = str8_lit("ONLINE_ID");}break; - case 0x99:{result = str8_lit("DLS");}break; - case 0xA0:{result = str8_lit("SOS");}break; - case 0xB0:{result = str8_lit("DEBUGGERS");}break; - case 0xE7:{result = str8_lit("USERMODE_SPACES");}break; - case 0x100:{result = str8_lit("DMSERVER|RESTORE|SPP");}break; - case 0x101:{result = str8_lit("DEPLOYMENT_SERVICES_SERVER");}break; - case 0x102:{result = str8_lit("DEPLOYMENT_SERVICES_IMAGING");}break; - case 0x103:{result = str8_lit("DEPLOYMENT_SERVICES_MANAGEMENT");}break; - case 0x104:{result = str8_lit("DEPLOYMENT_SERVICES_UTIL");}break; - case 0x105:{result = str8_lit("DEPLOYMENT_SERVICES_BINLSVC");}break; - case 0x107:{result = str8_lit("DEPLOYMENT_SERVICES_PXE");}break; - case 0x108:{result = str8_lit("DEPLOYMENT_SERVICES_TFTP");}break; - case 0x110:{result = str8_lit("DEPLOYMENT_SERVICES_TRANSPORT_MANAGEMENT");}break; - case 0x116:{result = str8_lit("DEPLOYMENT_SERVICES_DRIVER_PROVISIONING");}break; - case 0x121:{result = str8_lit("DEPLOYMENT_SERVICES_MULTICAST_SERVER");}break; - case 0x122:{result = str8_lit("DEPLOYMENT_SERVICES_MULTICAST_CLIENT");}break; - case 0x125:{result = str8_lit("DEPLOYMENT_SERVICES_CONTENT_PROVIDER");}break; - case 0x131:{result = str8_lit("LINGUISTIC_SERVICES");}break; - case 0x375:{result = str8_lit("WEB");}break; - case 0x376:{result = str8_lit("WEB_SOCKET");}break; - case 0x446:{result = str8_lit("AUDIOSTREAMING");}break; - case 0x600:{result = str8_lit("ACCELERATOR");}break; - case 0x701:{result = str8_lit("MOBILE");}break; - case 0x7CC:{result = str8_lit("WMAAECMA");}break; - case 0x801:{result = str8_lit("WEP");}break; - case 0x802:{result = str8_lit("SYNCENGINE");}break; - case 0x878:{result = str8_lit("DIRECTMUSIC");}break; - case 0x879:{result = str8_lit("DIRECT3D10");}break; - case 0x87A:{result = str8_lit("DXGI");}break; - case 0x87B:{result = str8_lit("DXGI_DDI");}break; - case 0x87C:{result = str8_lit("DIRECT3D11");}break; - case 0x888:{result = str8_lit("LEAP");}break; - case 0x889:{result = str8_lit("AUDCLNT");}break; - case 0x898:{result = str8_lit("WINCODEC_DWRITE_DWM");}break; - case 0x899:{result = str8_lit("DIRECT2D");}break; - case 0x900:{result = str8_lit("DEFRAG");}break; - case 0x901:{result = str8_lit("USERMODE_SDBUS");}break; - case 0x902:{result = str8_lit("JSCRIPT");}break; - case 0xA01:{result = str8_lit("PIDGENX");}break; - } - return result; -} - -internal String8 -d_string_from_hresult_code(U32 code) -{ - String8 result = {0}; - switch(code) - { - default:{}break; - case 0x00000000: {result = str8_lit("S_OK: Operation successful");}break; - case 0x00000001: {result = str8_lit("S_FALSE: Operation successful but returned no results");}break; - case 0x80004004: {result = str8_lit("E_ABORT: Operation aborted");}break; - case 0x80004005: {result = str8_lit("E_FAIL: Unspecified failure");}break; - case 0x80004002: {result = str8_lit("E_NOINTERFACE: No such interface supported");}break; - case 0x80004001: {result = str8_lit("E_NOTIMPL: Not implemented");}break; - case 0x80004003: {result = str8_lit("E_POINTER: Pointer that is not valid");}break; - case 0x8000FFFF: {result = str8_lit("E_UNEXPECTED: Unexpected failure");}break; - case 0x80070005: {result = str8_lit("E_ACCESSDENIED: General access denied error");}break; - case 0x80070006: {result = str8_lit("E_HANDLE: Handle that is not valid");}break; - case 0x80070057: {result = str8_lit("E_INVALIDARG: One or more arguments are not valid");}break; - case 0x8007000E: {result = str8_lit("E_OUTOFMEMORY: Failed to allocate necessary memory");}break; - } - return result; -} - -internal String8 -d_string_from_simple_typed_eval(Arena *arena, D_EvalVizStringFlags flags, U32 radix, E_Eval eval) -{ - String8 result = {0}; - E_TypeKey type_key = e_type_unwrap(eval.type_key); - E_TypeKind type_kind = e_type_kind_from_key(type_key); - U64 type_byte_size = e_type_byte_size_from_key(type_key); - U8 digit_group_separator = 0; - if(!(flags & D_EvalVizStringFlag_ReadOnlyDisplayRules)) - { - digit_group_separator = 0; - } - switch(type_kind) - { - default:{}break; - - case E_TypeKind_Handle: - { - result = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); - }break; - - case E_TypeKind_HResult: - { - if(flags & D_EvalVizStringFlag_ReadOnlyDisplayRules) - { - Temp scratch = scratch_begin(&arena, 1); - U32 hresult_value = (U32)eval.value.u64; - U32 is_error = !!(hresult_value & (1ull<<31)); - U32 error_code = (hresult_value); - U32 facility = (hresult_value & 0x7ff0000) >> 16; - String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, radix, 0, digit_group_separator); - String8 facility_string = d_string_from_hresult_facility_code(facility); - String8 error_string = d_string_from_hresult_code(error_code); - result = push_str8f(arena, "%S%s%s%S%s%s%S%s", - error_string, - error_string.size != 0 ? " " : "", - facility_string.size != 0 ? "[" : "", - facility_string, - facility_string.size != 0 ? "] ": "", - error_string.size != 0 ? "(" : "", - value_string, - error_string.size != 0 ? ")" : ""); - scratch_end(scratch); - } - else - { - result = str8_from_s64(arena, eval.value.u64, radix, 0, digit_group_separator); - } - }break; - - case E_TypeKind_Char8: - case E_TypeKind_Char16: - case E_TypeKind_Char32: - case E_TypeKind_UChar8: - case E_TypeKind_UChar16: - case E_TypeKind_UChar32: - { - String8 char_str = d_string_from_ascii_value(arena, eval.value.s64); - if(char_str.size != 0) - { - if(flags & D_EvalVizStringFlag_ReadOnlyDisplayRules) - { - String8 imm_string = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); - result = push_str8f(arena, "'%S' (%S)", char_str, imm_string); - } - else - { - result = push_str8f(arena, "'%S'", char_str); - } - } - else - { - result = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); - } - }break; - - case E_TypeKind_S8: - case E_TypeKind_S16: - case E_TypeKind_S32: - case E_TypeKind_S64: - { - result = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); - }break; - - case E_TypeKind_U8: - case E_TypeKind_U16: - case E_TypeKind_U32: - case E_TypeKind_U64: - { - U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator); - }break; - - case E_TypeKind_U128: - { - Temp scratch = scratch_begin(&arena, 1); - U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], radix, min_digits, digit_group_separator); - String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], radix, min_digits, digit_group_separator); - result = push_str8f(arena, "%S:%S", upper64, lower64); - scratch_end(scratch); - }break; - - case E_TypeKind_F32: {result = push_str8f(arena, "%f", eval.value.f32);}break; - case E_TypeKind_F64: {result = push_str8f(arena, "%f", eval.value.f64);}break; - case E_TypeKind_Bool:{result = push_str8f(arena, "%s", eval.value.u64 ? "true" : "false");}break; - case E_TypeKind_Ptr: {result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; - case E_TypeKind_LRef:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; - case E_TypeKind_RRef:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; - case E_TypeKind_Function:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; - - case E_TypeKind_Enum: - { - Temp scratch = scratch_begin(&arena, 1); - E_Type *type = e_type_from_key(scratch.arena, type_key); - String8 constant_name = {0}; - for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) - { - if(eval.value.u64 == type->enum_vals[val_idx].val) - { - constant_name = type->enum_vals[val_idx].name; - break; - } - } - if(flags & D_EvalVizStringFlag_ReadOnlyDisplayRules) - { - if(constant_name.size != 0) - { - result = push_str8f(arena, "0x%I64x (%S)", eval.value.u64, constant_name); - } - else - { - result = push_str8f(arena, "0x%I64x (%I64u)", eval.value.u64, eval.value.u64); - } - } - else if(constant_name.size != 0) - { - result = push_str8_copy(arena, constant_name); - } - else - { - result = push_str8f(arena, "0x%I64x (%I64u)", eval.value.u64, eval.value.u64); - } - scratch_end(scratch); - }break; - } - return result; -} - -internal String8 -d_escaped_from_raw_string(Arena *arena, String8 raw) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List parts = {0}; - U64 start_split_idx = 0; - for(U64 idx = 0; idx <= raw.size; idx += 1) - { - U8 byte = (idx < raw.size) ? raw.str[idx] : 0; - B32 split = 1; - String8 separator_replace = {0}; - switch(byte) - { - default:{split = 0;}break; - case 0: {}break; - case '\a': {separator_replace = str8_lit("\\a");}break; - case '\b': {separator_replace = str8_lit("\\b");}break; - case '\f': {separator_replace = str8_lit("\\f");}break; - case '\n': {separator_replace = str8_lit("\\n");}break; - case '\r': {separator_replace = str8_lit("\\r");}break; - case '\t': {separator_replace = str8_lit("\\t");}break; - case '\v': {separator_replace = str8_lit("\\v");}break; - case '\\': {separator_replace = str8_lit("\\\\");}break; - case '"': {separator_replace = str8_lit("\\\"");}break; - case '?': {separator_replace = str8_lit("\\?");}break; - } - if(split) - { - String8 substr = str8_substr(raw, r1u64(start_split_idx, idx)); - start_split_idx = idx+1; - str8_list_push(scratch.arena, &parts, substr); - if(separator_replace.size != 0) - { - str8_list_push(scratch.arena, &parts, separator_replace); - } - } - } - StringJoin join = {0}; - String8 result = str8_list_join(arena, &parts, &join); - scratch_end(scratch); - return result; -} - -//- rjf: type info -> expandability/editablity - -internal B32 -d_type_key_is_expandable(E_TypeKey type_key) -{ - B32 result = 0; - for(E_TypeKey t = type_key; !result; t = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t)))) - { - E_TypeKind kind = e_type_kind_from_key(t); - if(kind == E_TypeKind_Null || kind == E_TypeKind_Function) - { - break; - } - if(kind == E_TypeKind_Struct || - kind == E_TypeKind_Union || - kind == E_TypeKind_Class || - kind == E_TypeKind_Array || - kind == E_TypeKind_Enum) - { - result = 1; - } - } - return result; -} - -internal B32 -d_type_key_is_editable(E_TypeKey type_key) -{ - B32 result = 0; - for(E_TypeKey t = type_key; !result; t = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t)))) - { - E_TypeKind kind = e_type_kind_from_key(t); - if(kind == E_TypeKind_Null || kind == E_TypeKind_Function) - { - break; - } - if((E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) || e_type_kind_is_pointer_or_ref(kind)) - { - result = 1; - } - } - return result; -} - //- rjf: writing values back to child processes internal B32 @@ -3995,854 +3562,6 @@ d_commit_eval_value_string(E_Eval dst_eval, String8 string) return result; } -//- rjf: type helpers - -internal E_MemberArray -d_filtered_data_members_from_members_cfg_table(Arena *arena, E_MemberArray members, D_CfgTable *cfg) -{ - D_CfgVal *only = d_cfg_val_from_string(cfg, str8_lit("only")); - D_CfgVal *omit = d_cfg_val_from_string(cfg, str8_lit("omit")); - E_MemberArray filtered_members = members; - if(only != &d_nil_cfg_val || omit != &d_nil_cfg_val) - { - Temp scratch = scratch_begin(&arena, 1); - typedef struct DF_TypeMemberLooseNode DF_TypeMemberLooseNode; - struct DF_TypeMemberLooseNode - { - DF_TypeMemberLooseNode *next; - E_Member *member; - }; - DF_TypeMemberLooseNode *first_member = 0; - DF_TypeMemberLooseNode *last_member = 0; - U64 member_count = 0; - MemoryZeroStruct(&filtered_members); - for(U64 idx = 0; idx < members.count; idx += 1) - { - // rjf: check if included by 'only's - B32 is_included = 1; - for(D_CfgTree *r = only->first; r != &d_nil_cfg_tree; r = r->next) - { - is_included = 0; - for(MD_EachNode(name_node, r->root->first)) - { - String8 name = name_node->string; - if(str8_match(members.v[idx].name, name, 0)) - { - is_included = 1; - goto end_inclusion_check; - } - } - } - end_inclusion_check:; - - // rjf: remove if excluded by 'omit's - for(D_CfgTree *r = omit->first; r != &d_nil_cfg_tree; r = r->next) - { - for(MD_EachNode(name_node, r->root->first)) - { - String8 name = name_node->string; - if(str8_match(members.v[idx].name, name, 0)) - { - is_included = 0; - goto end_exclusion_check; - } - } - } - end_exclusion_check:; - - // rjf: push if included - if(is_included) - { - DF_TypeMemberLooseNode *n = push_array(scratch.arena, DF_TypeMemberLooseNode, 1); - n->member = &members.v[idx]; - SLLQueuePush(first_member, last_member, n); - member_count += 1; - } - } - - // rjf: bake - { - filtered_members.count = member_count; - filtered_members.v = push_array_no_zero(arena, E_Member, filtered_members.count); - U64 idx = 0; - for(DF_TypeMemberLooseNode *n = first_member; n != 0; n = n->next, idx += 1) - { - MemoryCopyStruct(&filtered_members.v[idx], n->member); - filtered_members.v[idx].name = push_str8_copy(arena, filtered_members.v[idx].name); - filtered_members.v[idx].inheritance_key_chain = e_type_key_list_copy(arena, &filtered_members.v[idx].inheritance_key_chain); - } - } - scratch_end(scratch); - } - return filtered_members; -} - -internal D_EvalLinkBaseChunkList -d_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_key, U64 link_member_off, E_Eval eval, U64 cap) -{ - D_EvalLinkBaseChunkList list = {0}; - for(E_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) - { - // rjf: check this ptr's validity - if(base_eval.value.u64 == 0 || (base_eval.value.u64 == last_eval.value.u64 && base_eval.mode == last_eval.mode)) - { - break; - } - - // rjf: gather - { - D_EvalLinkBaseChunkNode *chunk = list.last; - if(chunk == 0 || chunk->count == ArrayCount(chunk->b)) - { - chunk = push_array_no_zero(arena, D_EvalLinkBaseChunkNode, 1); - chunk->next = 0; - chunk->count = 0; - SLLQueuePush(list.first, list.last, chunk); - } - chunk->b[chunk->count].offset = base_eval.value.u64; - chunk->count += 1; - list.count += 1; - } - - // rjf: grab link member - E_Eval link_member_eval = - { - .value = {.u64 = base_eval.value.u64 + link_member_off}, - .mode = E_Mode_Offset, - .space = base_eval.space, - .type_key = link_member_type_key, - }; - E_Eval link_member_value_eval = e_value_eval_from_eval(link_member_eval); - - // rjf: advance to next link - last_eval = base_eval; - base_eval.mode = E_Mode_Offset; - base_eval.value.u64 = link_member_value_eval.value.u64; - } - return list; -} - -internal D_EvalLinkBase -d_eval_link_base_from_chunk_list_index(D_EvalLinkBaseChunkList *list, U64 idx) -{ - D_EvalLinkBase result = zero_struct; - U64 scan_idx = 0; - for(D_EvalLinkBaseChunkNode *chunk = list->first; chunk != 0; chunk = chunk->next) - { - U64 chunk_idx_opl = scan_idx+chunk->count; - if(scan_idx <= idx && idx < chunk_idx_opl) - { - result = chunk->b[idx - scan_idx]; - } - scan_idx = chunk_idx_opl; - } - return result; -} - -internal D_EvalLinkBaseArray -d_eval_link_base_array_from_chunk_list(Arena *arena, D_EvalLinkBaseChunkList *chunks) -{ - D_EvalLinkBaseArray array = {0}; - array.count = chunks->count; - array.v = push_array_no_zero(arena, D_EvalLinkBase, array.count); - U64 idx = 0; - for(D_EvalLinkBaseChunkNode *n = chunks->first; n != 0; n = n->next) - { - MemoryCopy(array.v + idx, n->b, n->count * sizeof(D_EvalLinkBase)); - idx += n->count; - } - return array; -} - -//- rjf: viz block collection building - -internal D_EvalVizBlock * -d_eval_viz_block_begin(Arena *arena, D_EvalVizBlockKind kind, D_ExpandKey parent_key, D_ExpandKey key, S32 depth) -{ - D_EvalVizBlockNode *n = push_array(arena, D_EvalVizBlockNode, 1); - n->v.kind = kind; - n->v.parent_key = parent_key; - n->v.key = key; - n->v.depth = depth; - n->v.expr = &e_expr_nil; - n->v.cfg_table = &d_nil_cfg_table; - return &n->v; -} - -internal D_EvalVizBlock * -d_eval_viz_block_split_and_continue(Arena *arena, D_EvalVizBlockList *list, D_EvalVizBlock *split_block, U64 split_idx) -{ - U64 total_count = split_block->semantic_idx_range.max; - split_block->visual_idx_range.max = split_block->semantic_idx_range.max = split_idx; - d_eval_viz_block_end(list, split_block); - D_EvalVizBlock *continue_block = d_eval_viz_block_begin(arena, split_block->kind, split_block->parent_key, split_block->key, split_block->depth); - continue_block->string = split_block->string; - continue_block->expr = split_block->expr; - continue_block->visual_idx_range = continue_block->semantic_idx_range = r1u64(split_idx+1, total_count); - continue_block->cfg_table = split_block->cfg_table; - continue_block->link_bases = split_block->link_bases; - continue_block->members = split_block->members; - continue_block->enum_vals = split_block->enum_vals; - continue_block->fzy_target = split_block->fzy_target; - continue_block->fzy_backing_items = split_block->fzy_backing_items; - return continue_block; -} - -internal void -d_eval_viz_block_end(D_EvalVizBlockList *list, D_EvalVizBlock *block) -{ - D_EvalVizBlockNode *n = CastFromMember(D_EvalVizBlockNode, v, block); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - list->total_visual_row_count += dim_1u64(block->visual_idx_range); - list->total_semantic_row_count += dim_1u64(block->semantic_idx_range); -} - -internal void -d_append_expr_eval_viz_blocks__rec(Arena *arena, D_EvalView *eval_view, D_ExpandKey parent_key, D_ExpandKey key, String8 string, E_Expr *expr, D_CfgTable *cfg_table, S32 depth, D_EvalVizBlockList *list_out) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: apply expr resolution view rules - expr = d_expr_from_expr_cfg(arena, expr, cfg_table); - - //- rjf: determine if this key is expanded - D_ExpandNode *node = d_expand_node_from_key(&eval_view->expand_tree_table, key); - B32 parent_is_expanded = (node != 0 && node->expanded); - - //- rjf: push block for expression root - { - D_EvalVizBlock *block = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Root, parent_key, key, depth); - block->string = string; - block->expr = expr; - block->cfg_table = cfg_table; - block->visual_idx_range = r1u64(key.child_num-1, key.child_num+0); - block->semantic_idx_range = r1u64(key.child_num-1, key.child_num+0); - d_eval_viz_block_end(list_out, block); - } - - //- rjf: determine view rule to generate children blocks - D_ViewRuleSpec *expand_view_rule_spec = d_view_rule_spec_from_string(str8_lit("default")); - MD_Node *expand_view_rule_params = &md_nil_node; - if(parent_is_expanded) - { - for(D_CfgVal *val = cfg_table->first_val; - val != 0 && val != &d_nil_cfg_val; - val = val->linear_next) - { - D_ViewRuleSpec *spec = d_view_rule_spec_from_string(val->string); - if(spec->info.flags & D_ViewRuleSpecInfoFlag_VizBlockProd) - { - expand_view_rule_spec = spec; - expand_view_rule_params = val->last->root; - break; - } - } - } - - //- rjf: do view rule children block generation, if we have an applicable view rule - if(parent_is_expanded && expand_view_rule_spec != &d_nil_core_view_rule_spec) - { - expand_view_rule_spec->info.viz_block_prod(arena, eval_view, parent_key, key, node, string, expr, cfg_table, depth+1, expand_view_rule_params, list_out); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal D_EvalVizBlockList -d_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, D_EvalView *eval_view, D_CfgTable *cfg_table, String8 expr, D_ExpandKey parent_key, D_ExpandKey key) -{ - ProfBeginFunction(); - D_EvalVizBlockList blocks = {0}; - { - E_TokenArray tokens = e_token_array_from_text(arena, expr); - E_Parse parse = e_parse_expr_from_text_tokens(arena, expr, &tokens); - U64 parse_opl = parse.last_token >= tokens.v + tokens.count ? expr.size : parse.last_token->range.min; - U64 expr_comma_pos = str8_find_needle(expr, parse_opl, str8_lit(","), 0); - U64 passthrough_pos = str8_find_needle(expr, parse_opl, str8_lit("--"), 0); - String8List default_view_rules = {0}; - if(expr_comma_pos < expr.size && expr_comma_pos < passthrough_pos) - { - String8 expr_extension = str8_substr(expr, r1u64(expr_comma_pos+1, passthrough_pos)); - expr_extension = str8_skip_chop_whitespace(expr_extension); - if(str8_match(expr_extension, str8_lit("x"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(arena, &default_view_rules, "hex"); - } - else if(str8_match(expr_extension, str8_lit("b"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(arena, &default_view_rules, "bin"); - } - else if(str8_match(expr_extension, str8_lit("o"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(arena, &default_view_rules, "oct"); - } - else if(expr_extension.size != 0) - { - str8_list_pushf(arena, &default_view_rules, "array:{%S}", expr_extension); - } - } - if(passthrough_pos < expr.size) - { - String8 passthrough_view_rule = str8_skip_chop_whitespace(str8_skip(expr, passthrough_pos+2)); - if(passthrough_view_rule.size != 0) - { - str8_list_push(arena, &default_view_rules, passthrough_view_rule); - } - } - String8 view_rule_string = d_eval_view_rule_from_key(eval_view, key); - D_CfgTable *cfg_table_inherited = push_array(arena, D_CfgTable, 1); - *cfg_table_inherited = d_cfg_table_from_inheritance(arena, cfg_table); - for(String8Node *n = default_view_rules.first; n != 0; n = n->next) - { - d_cfg_table_push_unparsed_string(arena, cfg_table_inherited, n->string, D_CfgSrc_User); - } - d_cfg_table_push_unparsed_string(arena, cfg_table_inherited, view_rule_string, D_CfgSrc_User); - d_append_expr_eval_viz_blocks__rec(arena, eval_view, parent_key, key, expr, parse.expr, cfg_table_inherited, 0, &blocks); - } - ProfEnd(); - return blocks; -} - -internal void -d_eval_viz_block_list_concat__in_place(D_EvalVizBlockList *dst, D_EvalVizBlockList *to_push) -{ - if(dst->last == 0) - { - *dst = *to_push; - } - else if(to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - dst->total_visual_row_count += to_push->total_visual_row_count; - dst->total_semantic_row_count += to_push->total_semantic_row_count; - } - MemoryZeroStruct(to_push); -} - -internal S64 -d_row_num_from_viz_block_list_key(D_EvalVizBlockList *blocks, D_ExpandKey key) -{ - S64 row_num = 1; - B32 found = 0; - for(D_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - D_EvalVizBlock *block = &n->v; - if(key.parent_hash == block->key.parent_hash) - { - B32 this_block_contains_this_key = 0; - { - if(block->fzy_backing_items.v != 0) - { - U64 item_num = fzy_item_num_from_array_element_idx__linear_search(&block->fzy_backing_items, key.child_num); - this_block_contains_this_key = (item_num != 0 && contains_1u64(block->semantic_idx_range, item_num-1)); - } - else - { - this_block_contains_this_key = (block->semantic_idx_range.min+1 <= key.child_num && key.child_num < block->semantic_idx_range.max+1); - } - } - if(this_block_contains_this_key) - { - found = 1; - if(block->fzy_backing_items.v != 0) - { - U64 item_num = fzy_item_num_from_array_element_idx__linear_search(&block->fzy_backing_items, key.child_num); - row_num += item_num-1-block->semantic_idx_range.min; - } - else - { - row_num += key.child_num-1-block->semantic_idx_range.min; - } - break; - } - } - if(!found) - { - row_num += (S64)dim_1u64(block->semantic_idx_range); - } - } - if(!found) - { - row_num = 0; - } - return row_num; -} - -internal D_ExpandKey -d_key_from_viz_block_list_row_num(D_EvalVizBlockList *blocks, S64 row_num) -{ - D_ExpandKey key = {0}; - S64 scan_y = 1; - for(D_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - D_EvalVizBlock *vb = &n->v; - Rng1S64 vb_row_num_range = r1s64(scan_y, scan_y + (S64)dim_1u64(vb->semantic_idx_range)); - if(contains_1s64(vb_row_num_range, row_num)) - { - key = vb->key; - if(vb->fzy_backing_items.v != 0) - { - U64 item_idx = (U64)((row_num - vb_row_num_range.min) + vb->semantic_idx_range.min); - if(item_idx < vb->fzy_backing_items.count) - { - key.child_num = vb->fzy_backing_items.v[item_idx].idx; - } - } - else - { - key.child_num = vb->semantic_idx_range.min + (row_num - vb_row_num_range.min) + 1; - } - break; - } - scan_y += dim_1s64(vb_row_num_range); - } - return key; -} - -internal D_ExpandKey -d_parent_key_from_viz_block_list_row_num(D_EvalVizBlockList *blocks, S64 row_num) -{ - D_ExpandKey key = {0}; - S64 scan_y = 1; - for(D_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - D_EvalVizBlock *vb = &n->v; - Rng1S64 vb_row_num_range = r1s64(scan_y, scan_y + (S64)dim_1u64(vb->semantic_idx_range)); - if(contains_1s64(vb_row_num_range, row_num)) - { - key = vb->parent_key; - break; - } - scan_y += dim_1s64(vb_row_num_range); - } - return key; -} - -//- rjf: viz block * index -> expression - -internal E_Expr * -d_expr_from_eval_viz_block_index(Arena *arena, D_EvalVizBlock *block, U64 index) -{ - E_Expr *result = block->expr; - switch(block->kind) - { - default:{}break; - case D_EvalVizBlockKind_Members: - { - E_MemberArray *members = &block->members; - if(index < members->count) - { - E_Member *member = &members->v[index]; - E_Expr *dot_expr = e_expr_ref_member_access(arena, block->expr, member->name); - result = dot_expr; - } - }break; - case D_EvalVizBlockKind_EnumMembers: - { - E_EnumValArray *enum_vals = &block->enum_vals; - if(index < enum_vals->count) - { - E_EnumVal *val = &enum_vals->v[index]; - E_Expr *dot_expr = e_expr_ref_member_access(arena, block->expr, val->name); - result = dot_expr; - } - }break; - case D_EvalVizBlockKind_Elements: - { - E_Expr *idx_expr = e_expr_ref_array_index(arena, block->expr, index); - result = idx_expr; - }break; - case D_EvalVizBlockKind_DebugInfoTable: - { - // rjf: unpack row info - FZY_Item *item = &block->fzy_backing_items.v[index]; - D_ExpandKey parent_key = block->parent_key; - D_ExpandKey key = block->key; - key.child_num = block->fzy_backing_items.v[index].idx; - - // rjf: determine module to which this item belongs - E_Module *module = e_parse_ctx->primary_module; - U64 base_idx = 0; - { - for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) - { - U64 all_items_count = 0; - rdi_section_raw_table_from_kind(e_parse_ctx->modules[module_idx].rdi, block->fzy_target, &all_items_count); - if(base_idx <= item->idx && item->idx < base_idx + all_items_count) - { - module = &e_parse_ctx->modules[module_idx]; - break; - } - base_idx += all_items_count; - } - } - - // rjf: build expr - E_Expr *item_expr = &e_expr_nil; - { - RDI_SectionKind section = block->fzy_target; - U64 element_idx = block->fzy_backing_items.v[index].idx - base_idx; - switch(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_ModuleOff, e_value_u64(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_ModuleOff, e_value_u64(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; - } - } - - result = item_expr; - }break; - } - return result; -} - -//- rjf: viz row list building - -internal D_EvalVizRow * -d_eval_viz_row_list_push_new(Arena *arena, D_EvalView *eval_view, D_EvalVizWindowedRowList *rows, D_EvalVizBlock *block, D_ExpandKey key, E_Expr *expr) -{ - // rjf: push - D_EvalVizRow *row = push_array(arena, D_EvalVizRow, 1); - SLLQueuePush(rows->first, rows->last, row); - rows->count += 1; - - // rjf: pick cfg table; resolve expression if needed - D_CfgTable *cfg_table = 0; - switch(block->kind) - { - default: - { - cfg_table = push_array(arena, D_CfgTable, 1); - *cfg_table = d_cfg_table_from_inheritance(arena, block->cfg_table); - String8 row_view_rules = d_eval_view_rule_from_key(eval_view, key); - if(row_view_rules.size != 0) - { - d_cfg_table_push_unparsed_string(arena, cfg_table, row_view_rules, D_CfgSrc_User); - } - expr = d_expr_from_expr_cfg(arena, expr, cfg_table); - }break; - case D_EvalVizBlockKind_Root: - case D_EvalVizBlockKind_Canvas: - { - cfg_table = block->cfg_table; - }break; - } - - // rjf: determine row ui hook to use for this row - DF_ViewRuleSpec *value_ui_rule_spec = &df_nil_view_rule_spec; - MD_Node *value_ui_rule_params = &md_nil_node; - for(D_CfgVal *val = cfg_table->first_val; val != 0 && val != &d_nil_cfg_val; val = val->linear_next) - { - DF_ViewRuleSpec *spec = df_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_ViewRuleSpecInfoFlag_RowUI) - { - value_ui_rule_spec = spec; - value_ui_rule_params = val->last->root; - break; - } - } - - // rjf: determine block ui hook to use for this row - DF_ViewRuleSpec *expand_ui_rule_spec = &df_nil_view_rule_spec; - MD_Node *expand_ui_rule_params = &md_nil_node; - if(block->kind == D_EvalVizBlockKind_Canvas) - { - for(D_CfgVal *val = cfg_table->first_val; val != 0 && val != &d_nil_cfg_val; val = val->linear_next) - { - DF_ViewRuleSpec *spec = df_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_ViewRuleSpecInfoFlag_ViewUI) - { - expand_ui_rule_spec = spec; - expand_ui_rule_params = val->last->root; - break; - } - } - } - - // rjf: fill - row->depth = block->depth; - row->parent_key = block->parent_key; - row->key = key; - row->size_in_rows = 1; - row->string = block->string; - row->expr = expr; - if(row->expr->kind == E_ExprKind_MemberAccess) - { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first); - E_TypeKey type = irtree.type_key; - E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, type); - E_Member *member = e_type_member_from_array_name(&data_members, row->expr->last->string); - if(member != 0) - { - row->member = e_type_member_copy(arena, member); - } - scratch_end(scratch); - } - row->cfg_table = cfg_table; - row->value_ui_rule_spec = value_ui_rule_spec; - row->value_ui_rule_params = value_ui_rule_params; - row->expand_ui_rule_spec = expand_ui_rule_spec; - row->expand_ui_rule_params = expand_ui_rule_params; - return row; -} - -internal D_EvalVizWindowedRowList -d_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, D_EvalView *eval_view, Rng1S64 visible_range, D_EvalVizBlockList *blocks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////////// - //- rjf: produce windowed rows, per block - // - U64 visual_idx_off = 0; - U64 semantic_idx_off = 0; - D_EvalVizWindowedRowList list = {0}; - for(D_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - D_EvalVizBlock *block = &n->v; - - ////////////////////////////// - //- rjf: extract block info - // - U64 block_num_visual_rows = dim_1u64(block->visual_idx_range); - U64 block_num_semantic_rows = dim_1u64(block->semantic_idx_range); - Rng1S64 block_visual_range = r1s64(visual_idx_off, visual_idx_off + block_num_visual_rows); - Rng1S64 block_semantic_range = r1s64(semantic_idx_off, semantic_idx_off + block_num_semantic_rows); - - ////////////////////////////// - //- rjf: get skip/chop of block's index range - // - U64 num_skipped_visual = 0; - U64 num_chopped_visual = 0; - { - if(visible_range.min > block_visual_range.min) - { - num_skipped_visual = (visible_range.min - block_visual_range.min); - num_skipped_visual = Min(num_skipped_visual, block_num_visual_rows); - } - if(visible_range.max < block_visual_range.max) - { - num_chopped_visual = (block_visual_range.max - visible_range.max); - num_chopped_visual = Min(num_chopped_visual, block_num_visual_rows); - } - } - - ////////////////////////////// - //- rjf: get visible idx range & invisible counts - // - Rng1U64 visible_idx_range = block->visual_idx_range; - { - visible_idx_range.min += num_skipped_visual; - visible_idx_range.max -= num_chopped_visual; - } - - ////////////////////////////// - //- rjf: sum & advance - // - list.count_before_visual += num_skipped_visual; - if(block_num_visual_rows != 0) - { - list.count_before_semantic += block_num_semantic_rows * num_skipped_visual / block_num_visual_rows; - } - visual_idx_off += block_num_visual_rows; - semantic_idx_off += block_num_semantic_rows; - - ////////////////////////////// - //- rjf: produce rows, depending on block's kind - // - if(visible_idx_range.max > visible_idx_range.min) switch(block->kind) - { - default:{}break; - - ////////////////////////////// - //- rjf: single rows, piping in info from the originating block - // - case D_EvalVizBlockKind_Null: - case D_EvalVizBlockKind_Root: - { - d_eval_viz_row_list_push_new(arena, eval_view, &list, block, block->key, block->expr); - }break; - - ////////////////////////////// - //- rjf: canvas -> produce blank row, sized by the idx range specified in the block - // - case D_EvalVizBlockKind_Canvas: - if(num_skipped_visual < block_num_visual_rows) - { - D_ExpandKey key = d_expand_key_make(df_hash_from_expand_key(block->parent_key), 1); - D_EvalVizRow *row = d_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, block->expr); - row->size_in_rows = dim_1u64(intersect_1u64(visible_idx_range, r1u64(0, dim_1u64(block->visual_idx_range)))); - row->skipped_size_in_rows= (visible_idx_range.min > block->visual_idx_range.min) ? visible_idx_range.min - block->visual_idx_range.min : 0; - row->chopped_size_in_rows= (visible_idx_range.max < block->visual_idx_range.max) ? block->visual_idx_range.max - visible_idx_range.max : 0; - }break; - - ////////////////////////////// - //- rjf: all elements of a debug info table -> produce rows for visible range - // - case D_EvalVizBlockKind_DebugInfoTable: - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) - { - FZY_Item *item = &block->fzy_backing_items.v[idx]; - D_ExpandKey parent_key = block->parent_key; - D_ExpandKey key = block->key; - key.child_num = block->fzy_backing_items.v[idx].idx; - E_Expr *row_expr = d_expr_from_eval_viz_block_index(arena, block, idx); - d_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, row_expr); - }break; - - ////////////////////////////// - //- rjf: members/elements/enum-members - // - case D_EvalVizBlockKind_Members: - case D_EvalVizBlockKind_EnumMembers: - case D_EvalVizBlockKind_Elements: - { - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) - { - D_ExpandKey key = d_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); - E_Expr *expr = d_expr_from_eval_viz_block_index(arena, block, idx); - d_eval_viz_row_list_push_new(arena, eval_view, &list, block, key, expr); - } - }break; - } - } - scratch_end(scratch); - ProfEnd(); - return list; -} - -//- rjf: viz row -> strings - -internal String8 -d_expr_string_from_viz_row(Arena *arena, D_EvalVizRow *row) -{ - String8 result = row->string; - if(result.size == 0) switch(row->expr->kind) - { - default: - { - result = e_string_from_expr(arena, row->expr); - }break; - case E_ExprKind_ArrayIndex: - { - result = push_str8f(arena, "[%S]", e_string_from_expr(arena, row->expr->last)); - }break; - case E_ExprKind_MemberAccess: - { - result = push_str8f(arena, ".%S", e_string_from_expr(arena, row->expr->last)); - }break; - } - return result; -} - -//- rjf: viz row -> expandability/editability - -internal B32 -d_viz_row_is_expandable(D_EvalVizRow *row) -{ - B32 result = 0; - { - // rjf: determine if view rules force expandability - if(!result) - { - for(D_CfgVal *val = row->cfg_table->first_val; val != 0 && val != &d_nil_cfg_val; val = val->linear_next) - { - D_ViewRuleSpec *spec = d_view_rule_spec_from_string(val->string); - if(spec->info.flags & D_ViewRuleSpecInfoFlag_Expandable) - { - result = 1; - break; - } - } - } - - // rjf: determine if type info force expandability - if(!result) - { - Temp scratch = scratch_begin(0, 0); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr); - result = d_type_key_is_expandable(irtree.type_key); - scratch_end(scratch); - } - } - return result; -} - -internal B32 -d_viz_row_is_editable(D_EvalVizRow *row) -{ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr); - result = d_type_key_is_editable(irtree.type_key); - scratch_end(scratch); - return result; -} - //- rjf: view rule config tree info extraction internal U64 @@ -4855,29 +3574,6 @@ d_base_offset_from_eval(E_Eval eval) return eval.value.u64; } -internal E_Value -d_value_from_params(MD_Node *params) -{ - Temp scratch = scratch_begin(0, 0); - String8 expr = md_string_from_children(scratch.arena, params); - E_Eval eval = e_eval_from_string(scratch.arena, expr); - E_Eval value_eval = e_value_eval_from_eval(eval); - scratch_end(scratch); - return value_eval.value; -} - -internal E_TypeKey -d_type_key_from_params(MD_Node *params) -{ - Temp scratch = scratch_begin(0, 0); - String8 expr = md_string_from_children(scratch.arena, params); - E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr); - E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, expr, &tokens); - E_TypeKey type_key = e_type_from_expr(parse.expr); - scratch_end(scratch); - return type_key; -} - internal E_Value d_value_from_params_key(MD_Node *params, String8 key) { diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 9465cb8f..c9046cea 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -280,8 +280,6 @@ struct D_ViewRuleSpecInfo String8 schema; String8 description; D_ViewRuleSpecInfoFlags flags; - D_CoreViewRuleExprResolutionHookFunctionType *expr_resolution; - D_CoreViewRuleVizBlockProdHookFunctionType *viz_block_prod; }; typedef struct D_ViewRuleSpecInfoArray D_ViewRuleSpecInfoArray; @@ -1347,60 +1345,11 @@ internal String8 d_eval_view_rule_from_key(D_EvalView *eval_view, D_ExpandKey ke //////////////////////////////// //~ rjf: Evaluation Visualization -//- rjf: expr * view rule table -> expr -internal E_Expr *d_expr_from_expr_cfg(Arena *arena, E_Expr *expr, D_CfgTable *cfg); - -//- rjf: evaluation value string builder helpers -internal String8 d_string_from_ascii_value(Arena *arena, U8 val); -internal String8 d_string_from_hresult_facility_code(U32 code); -internal String8 d_string_from_hresult_code(U32 code); -internal String8 d_string_from_simple_typed_eval(Arena *arena, D_EvalVizStringFlags flags, U32 radix, E_Eval eval); -internal String8 d_escaped_from_raw_string(Arena *arena, String8 raw); - -//- rjf: type info -> expandability/editablity -internal B32 d_type_key_is_expandable(E_TypeKey type_key); -internal B32 d_type_key_is_editable(E_TypeKey type_key); - //- rjf: writing values back to child processes internal B32 d_commit_eval_value_string(E_Eval dst_eval, String8 string); -//- rjf: type helpers -internal E_MemberArray d_filtered_data_members_from_members_cfg_table(Arena *arena, E_MemberArray members, D_CfgTable *cfg); -internal D_EvalLinkBaseChunkList d_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_key, U64 link_member_off, E_Eval eval, U64 cap); -internal D_EvalLinkBase d_eval_link_base_from_chunk_list_index(D_EvalLinkBaseChunkList *list, U64 idx); -internal D_EvalLinkBaseArray d_eval_link_base_array_from_chunk_list(Arena *arena, D_EvalLinkBaseChunkList *chunks); - -//- rjf: viz block collection building -internal D_EvalVizBlock *d_eval_viz_block_begin(Arena *arena, D_EvalVizBlockKind kind, D_ExpandKey parent_key, D_ExpandKey key, S32 depth); -internal D_EvalVizBlock *d_eval_viz_block_split_and_continue(Arena *arena, D_EvalVizBlockList *list, D_EvalVizBlock *split_block, U64 split_idx); -internal void d_eval_viz_block_end(D_EvalVizBlockList *list, D_EvalVizBlock *block); -internal void d_append_expr_eval_viz_blocks__rec(Arena *arena, D_EvalView *view, D_ExpandKey parent_key, D_ExpandKey key, String8 string, E_Expr *expr, D_CfgTable *cfg_table, S32 depth, D_EvalVizBlockList *list_out); -internal D_EvalVizBlockList d_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, D_EvalView *eval_view, D_CfgTable *cfg_table, String8 expr, D_ExpandKey parent_key, D_ExpandKey key); -internal void d_eval_viz_block_list_concat__in_place(D_EvalVizBlockList *dst, D_EvalVizBlockList *to_push); - -//- rjf: viz block list <-> table coordinates -internal S64 d_row_num_from_viz_block_list_key(D_EvalVizBlockList *blocks, D_ExpandKey key); -internal D_ExpandKey d_key_from_viz_block_list_row_num(D_EvalVizBlockList *blocks, S64 row_num); -internal D_ExpandKey d_parent_key_from_viz_block_list_row_num(D_EvalVizBlockList *blocks, S64 row_num); - -//- rjf: viz block * index -> expression -internal E_Expr *d_expr_from_eval_viz_block_index(Arena *arena, D_EvalVizBlock *block, U64 index); - -//- rjf: viz row list building -internal D_EvalVizRow *d_eval_viz_row_list_push_new(Arena *arena, D_EvalView *eval_view, D_EvalVizWindowedRowList *rows, D_EvalVizBlock *block, D_ExpandKey key, E_Expr *expr); -internal D_EvalVizWindowedRowList d_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, D_EvalView *eval_view, Rng1S64 visible_range, D_EvalVizBlockList *blocks); - -//- rjf: viz row -> strings -internal String8 d_expr_string_from_viz_row(Arena *arena, D_EvalVizRow *row); - -//- rjf: viz row -> expandability/editability -internal B32 d_viz_row_is_expandable(D_EvalVizRow *row); -internal B32 d_viz_row_is_editable(D_EvalVizRow *row); - //- rjf: eval / view rule params tree info extraction internal U64 d_base_offset_from_eval(E_Eval eval); -internal E_Value d_value_from_params(MD_Node *params); -internal E_TypeKey d_type_key_from_params(MD_Node *params); internal E_Value d_value_from_params_key(MD_Node *params, String8 key); internal Rng1U64 d_range_from_eval_params(E_Eval eval, MD_Node *params); internal TXT_LangKind d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params); diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c index 25a9b5c2..0ff672d6 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.c +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -287,27 +287,27 @@ D_CmdSpecInfo d_core_cmd_kind_spec_info_table[38] = D_ViewRuleSpecInfo d_core_view_rule_spec_info_table[21] = { -{str8_lit_comp("default"), str8_lit_comp("Default"), str8_lit_comp(""), str8_lit_comp(""), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(default) , }, -{str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("x:{expr}"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , 0, }, -{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp(""), str8_lit_comp("Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, }, -{str8_lit_comp("list"), str8_lit_comp("List"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(list) , }, -{str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, }, -{str8_lit_comp("cast"), str8_lit_comp("Cast"), str8_lit_comp("x:{type}"), str8_lit_comp("Specifies that the expression to which the view rule is applied should be casted to the provided type."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, }, -{str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("bin"), str8_lit_comp("Binary Base (Base 2)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-2 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("oct"), str8_lit_comp("Octal Base (Base 8)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-8 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("hex"), str8_lit_comp("Hexadecimal Base (Base 16)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-16 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("only"), str8_lit_comp("Only Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that only the specified members should appear in struct, union, or class evaluations."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(only) , }, -{str8_lit_comp("omit"), str8_lit_comp("Omit Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Omits a list of member names from appearing in struct, union, or class evaluations."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(omit) , }, -{str8_lit_comp("no_addr"), str8_lit_comp("Disable Address Values"), str8_lit_comp(""), str8_lit_comp("Displays only what pointers point to, if possible, without the pointer's address value."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("checkbox"), str8_lit_comp("Checkbox"), str8_lit_comp(""), str8_lit_comp("Displays simple integer values as checkboxes, encoding zero or nonzero values."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("color_rgba"), str8_lit_comp("Color (RGBA)"), str8_lit_comp(""), str8_lit_comp("Displays as a color, interpreting the data as encoding R, G, B, and A values."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(color_rgba) , }, -{str8_lit_comp("text"), str8_lit_comp("Text"), str8_lit_comp("x:{'lang':lang, 'size':expr}"), str8_lit_comp("Displays as text."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(text) , }, -{str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("x:{'arch':arch, 'size':expr}"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(disasm) , }, -{str8_lit_comp("memory"), str8_lit_comp("Memory"), str8_lit_comp("x:{'size':expr}"), str8_lit_comp("Displays as a raw memory grid."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(memory) , }, -{str8_lit_comp("graph"), str8_lit_comp("Graph"), str8_lit_comp(""), str8_lit_comp("Displays as a pointer graph, visualizing nodes and edges formed by pointers directly."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(graph) , }, -{str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("x:{'w':expr, 'h':expr, 'fmt':tex2dformat}"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(bitmap) , }, -{str8_lit_comp("geo3d"), str8_lit_comp("Geometry (3D)"), str8_lit_comp("x:{'count':expr, 'vtx':expr, 'vtx_size':expr}"), str8_lit_comp("Displays as geometry, interpreting the data as index or vertex data."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), 0, D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo3d) , }, +{str8_lit_comp("default"), str8_lit_comp("Default"), str8_lit_comp(""), str8_lit_comp(""), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("x:{expr}"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp(""), str8_lit_comp("Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("list"), str8_lit_comp("List"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("cast"), str8_lit_comp("Cast"), str8_lit_comp("x:{type}"), str8_lit_comp("Specifies that the expression to which the view rule is applied should be casted to the provided type."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("bin"), str8_lit_comp("Binary Base (Base 2)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-2 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("oct"), str8_lit_comp("Octal Base (Base 8)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-8 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("hex"), str8_lit_comp("Hexadecimal Base (Base 16)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-16 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("only"), str8_lit_comp("Only Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that only the specified members should appear in struct, union, or class evaluations."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("omit"), str8_lit_comp("Omit Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Omits a list of member names from appearing in struct, union, or class evaluations."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("no_addr"), str8_lit_comp("Disable Address Values"), str8_lit_comp(""), str8_lit_comp("Displays only what pointers point to, if possible, without the pointer's address value."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("checkbox"), str8_lit_comp("Checkbox"), str8_lit_comp(""), str8_lit_comp("Displays simple integer values as checkboxes, encoding zero or nonzero values."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("color_rgba"), str8_lit_comp("Color (RGBA)"), str8_lit_comp(""), str8_lit_comp("Displays as a color, interpreting the data as encoding R, G, B, and A values."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("text"), str8_lit_comp("Text"), str8_lit_comp("x:{'lang':lang, 'size':expr}"), str8_lit_comp("Displays as text."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("x:{'arch':arch, 'size':expr}"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("memory"), str8_lit_comp("Memory"), str8_lit_comp("x:{'size':expr}"), str8_lit_comp("Displays as a raw memory grid."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("graph"), str8_lit_comp("Graph"), str8_lit_comp(""), str8_lit_comp("Displays as a pointer graph, visualizing nodes and edges formed by pointers directly."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("x:{'w':expr, 'h':expr, 'fmt':tex2dformat}"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("geo3d"), str8_lit_comp("Geometry (3D)"), str8_lit_comp("x:{'count':expr, 'vtx':expr, 'vtx_size':expr}"), str8_lit_comp("Displays as geometry, interpreting the data as index or vertex data."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, }; C_LINKAGE_END diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index bad40fa5..fc468627 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -273,21 +273,6 @@ U64 inline_depth; .string = d_regs()->string,\ .params_tree = d_regs()->params_tree,\ -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array); -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice); -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap); -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(color_rgba); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(text); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(memory); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(graph); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap); -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo3d); global B32 DEV_telemetry_capture = 0; global B32 DEV_simulate_lag = 0; global B32 DEV_draw_ui_text_pos = 0; diff --git a/src/dbg_frontend/dbg_frontend_core.c b/src/dbg_frontend/dbg_frontend_core.c index ba9fa2f4..6086b072 100644 --- a/src/dbg_frontend/dbg_frontend_core.c +++ b/src/dbg_frontend/dbg_frontend_core.c @@ -6025,7 +6025,7 @@ df_append_value_strings_from_eval(Arena *arena, D_EvalVizStringFlags flags, U32 default: { E_Eval value_eval = e_value_eval_from_eval(eval); - String8 string = d_string_from_simple_typed_eval(arena, flags, radix, value_eval); + String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, value_eval); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; str8_list_push(arena, out, string); }break; @@ -6076,7 +6076,7 @@ df_append_value_strings_from_eval(Arena *arena, D_EvalVizStringFlags flags, U32 case 2: {string = str8_from_16(arena, str16_cstring((U16 *)string_buffer));}break; case 4: {string = str8_from_32(arena, str32_cstring((U32 *)string_buffer));}break; } - String8 string_escaped = d_escaped_from_raw_string(arena, string); + String8 string_escaped = ev_escaped_from_raw_string(arena, string); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string_escaped).x; space_taken += 2*fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; str8_list_push(arena, out, str8_lit("\"")); @@ -6136,7 +6136,7 @@ df_append_value_strings_from_eval(Arena *arena, D_EvalVizStringFlags flags, U32 space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, ptr_prefix).x; str8_list_push(arena, out, ptr_prefix); } - String8 string = d_string_from_simple_typed_eval(arena, flags, radix, value_eval); + String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, value_eval); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; str8_list_push(arena, out, string); if(did_content) @@ -6197,7 +6197,7 @@ df_append_value_strings_from_eval(Arena *arena, D_EvalVizStringFlags flags, U32 case 2: {string = str8_from_16(arena, str16_cstring((U16 *)string_buffer));}break; case 4: {string = str8_from_32(arena, str32_cstring((U32 *)string_buffer));}break; } - String8 string_escaped = d_escaped_from_raw_string(arena, string); + String8 string_escaped = ev_escaped_from_raw_string(arena, string); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string_escaped).x; space_taken += 2*fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; str8_list_push(arena, out, str8_lit("\"")); diff --git a/src/dbg_frontend/dbg_frontend_view_rules.c b/src/dbg_frontend/dbg_frontend_view_rules.c index f1874675..2658eefc 100644 --- a/src/dbg_frontend/dbg_frontend_view_rules.c +++ b/src/dbg_frontend/dbg_frontend_view_rules.c @@ -1,293 +1,12 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -//~ rjf: default - -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(default) -{ - Temp scratch = scratch_begin(&arena, 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: do struct/union/class member block generation - // - 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))) - { - // rjf: type -> filtered data members - E_MemberArray data_members = e_type_data_members_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); - E_MemberArray filtered_data_members = d_filtered_data_members_from_members_cfg_table(arena, data_members, cfg_table); - - // rjf: build blocks for all members, split by sub-expansions - D_EvalVizBlock *last_vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Members, key, d_expand_key_make(df_hash_from_expand_key(key), 0), depth); - { - last_vb->expr = expr; - last_vb->cfg_table = cfg_table; - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, filtered_data_members.count); - last_vb->members = filtered_data_members; - } - for(D_ExpandNode *child = expand_node->first; child != 0; child = child->next) - { - // rjf: unpack expansion info; skip out-of-bounds splits - U64 child_num = child->key.child_num; - U64 child_idx = child_num-1; - E_Expr *child_expr = d_expr_from_eval_viz_block_index(arena, last_vb, child_idx); - if(child_idx >= last_vb->semantic_idx_range.max) - { - continue; - } - - // rjf: form split: truncate & complete last block; begin next block - last_vb = d_eval_viz_block_split_and_continue(arena, out, last_vb, child_idx); - - // rjf: build child config table - D_CfgTable *child_cfg_table = push_array(arena, D_CfgTable, 1); - *child_cfg_table = d_cfg_table_from_inheritance(arena, cfg_table); - { - String8 view_rule_string = d_eval_view_rule_from_key(eval_view, child->key); - if(view_rule_string.size != 0) - { - d_cfg_table_push_unparsed_string(arena, child_cfg_table, view_rule_string, D_CfgSrc_User); - } - } - - // rjf: recurse for child - d_append_expr_eval_viz_blocks__rec(arena, eval_view, key, child->key, str8_zero(), child_expr, child_cfg_table, depth, out); - } - d_eval_viz_block_end(out, last_vb); - } - - //////////////////////////// - //- rjf: do enum member block generation - // - // (just a single block for all enum members; enum members can never be expanded) - // - 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); - D_EvalVizBlock *last_vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_EnumMembers, key, d_expand_key_make(df_hash_from_expand_key(key), 0), depth); - { - last_vb->expr = expr; - last_vb->cfg_table = cfg_table; - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, type->count); - last_vb->enum_vals.v = type->enum_vals; - last_vb->enum_vals.count = type->count; - } - d_eval_viz_block_end(out, last_vb); - } - - //////////////////////////// - //- rjf: do array element block generation - // - else if(type_kind == E_TypeKind_Array || - (e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Array)) - { - // rjf: unpack array type info - E_Type *array_type = e_type_from_key(scratch.arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); - U64 array_count = array_type->count; - B32 need_extra_deref = e_type_kind_is_pointer_or_ref(type_kind); - - // rjf: build blocks for all elements, split by sub-expansions - D_EvalVizBlock *last_vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Elements, key, d_expand_key_make(df_hash_from_expand_key(key), 0), depth); - { - last_vb->expr = need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; - last_vb->cfg_table = cfg_table; - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, array_count); - } - for(D_ExpandNode *child = expand_node->first; child != 0; child = child->next) - { - // rjf: unpack expansion info; skip out-of-bounds splits - U64 child_num = child->key.child_num; - U64 child_idx = child_num-1; - E_Expr *child_expr = d_expr_from_eval_viz_block_index(arena, last_vb, child_idx); - if(child_idx >= last_vb->semantic_idx_range.max) - { - continue; - } - - // rjf: form split: truncate & complete last block; begin next block - last_vb = d_eval_viz_block_split_and_continue(arena, out, last_vb, child_idx); - - // rjf: build child config table - D_CfgTable *child_cfg_table = push_array(arena, D_CfgTable, 1); - *child_cfg_table = d_cfg_table_from_inheritance(arena, cfg_table); - { - String8 view_rule_string = d_eval_view_rule_from_key(eval_view, child->key); - if(view_rule_string.size != 0) - { - d_cfg_table_push_unparsed_string(arena, child_cfg_table, view_rule_string, D_CfgSrc_User); - } - } - - // rjf: recurse for child - d_append_expr_eval_viz_blocks__rec(arena, eval_view, key, child->key, str8_zero(), child_expr, child_cfg_table, depth, out); - } - d_eval_viz_block_end(out, last_vb); - } - - //////////////////////////// - //- rjf: do pointer-to-pointer block generation - // - else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind)) - { - // rjf: compute key - D_ExpandKey child_key = d_expand_key_make(df_hash_from_expand_key(key), 1); - - // rjf: build child config table - D_CfgTable *child_cfg_table = push_array(arena, D_CfgTable, 1); - *child_cfg_table = d_cfg_table_from_inheritance(arena, cfg_table); - { - String8 view_rule_string = d_eval_view_rule_from_key(eval_view, child_key); - if(view_rule_string.size != 0) - { - d_cfg_table_push_unparsed_string(arena, child_cfg_table, view_rule_string, D_CfgSrc_User); - } - } - - // rjf: recurse for child - E_Expr *child_expr = e_expr_ref_deref(arena, expr); - d_append_expr_eval_viz_blocks__rec(arena, eval_view, key, child_key, str8_zero(), child_expr, child_cfg_table, depth, out); - } - - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: "array" - -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array) -{ - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); - E_TypeKey type_key = irtree.type_key; - E_TypeKind type_kind = e_type_kind_from_key(type_key); - if(e_type_kind_is_pointer_or_ref(type_kind)) - { - E_Value count = d_value_from_params(params); - 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.u64); - E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key); - expr = e_expr_ref_cast(arena, ptr_type_key, expr); - } - scratch_end(scratch); - return expr; -} - -//////////////////////////////// -//~ rjf: "slice" - -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice) -{ - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); - E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key); - if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class) - { - // rjf: unpack members - E_MemberArray members = e_type_data_members_from_key(scratch.arena, irtree.type_key); - - // rjf: choose base pointer & count members - E_Member *base_ptr_member = 0; - E_Member *count_member = 0; - for(U64 idx = 0; idx < members.count; idx += 1) - { - E_Member *member = &members.v[idx]; - E_TypeKey member_type = e_type_unwrap(member->type_key); - E_TypeKind member_type_kind = e_type_kind_from_key(member_type); - if(count_member == 0 && e_type_kind_is_integer(member_type_kind)) - { - count_member = member; - } - if(base_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind)) - { - base_ptr_member = &members.v[idx]; - } - if(count_member != 0 && base_ptr_member != 0) - { - break; - } - } - - // rjf: evaluate count member, determine count - U64 count = 0; - if(count_member != 0) - { - E_Expr *count_member_expr = e_expr_ref_member_access(scratch.arena, expr, count_member->name); - E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr); - E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval); - count = count_member_value_eval.value.u64; - } - - // rjf: generate new struct slice type - E_TypeKey slice_type_key = zero_struct; - if(base_ptr_member != 0 && count_member != 0) - { - 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); - 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, .off = base_ptr_member->off}); - E_MemberArray slice_type_members_array = e_member_array_from_list(scratch.arena, &slice_type_members); - slice_type_key = e_type_key_cons(.arch = e_type_state->ctx->primary_module->arch, - .kind = E_TypeKind_Struct, - .name = struct_name, - .members = slice_type_members_array.v, - .count = slice_type_members_array.count); - } - - // rjf: generate new expression tree - addr of struct, cast-to-ptr, deref - if(base_ptr_member != 0 && count_member != 0) - { - expr = e_expr_ref_addr(arena, expr); - expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, slice_type_key), expr); - expr = e_expr_ref_deref(arena, expr); - } - } - scratch_end(scratch); - return expr; -} - //////////////////////////////// //~ rjf: "list" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list){} +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(list){} DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(list){} -//////////////////////////////// -//~ rjf: "bswap" - -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap) -{ - expr = e_expr_ref_bswap(arena, expr); - return expr; -} - -//////////////////////////////// -//~ rjf: "cast" - -D_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast) -{ - E_TypeKey type_key = d_type_key_from_params(params); - expr = e_expr_ref_cast(arena, type_key, expr); - return expr; -} - //////////////////////////////// //~ rjf: "dec" @@ -311,14 +30,14 @@ DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(hex){} //////////////////////////////// //~ rjf: "only" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only){} +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(only){} DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(only){} DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(only){} //////////////////////////////// //~ rjf: "omit" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit){} +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(omit){} DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(omit){} DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(omit){} @@ -345,15 +64,15 @@ DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(checkbox) //////////////////////////////// //~ rjf: "rgba" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(color_rgba) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(color_rgba) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(color_rgba) @@ -418,83 +137,83 @@ DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(color_rgba) //////////////////////////////// //~ rjf: "text" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(text) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(text) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } //////////////////////////////// //~ rjf: "disasm" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(disasm) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } //////////////////////////////// //~ rjf: "memory" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(memory) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(memory) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 16); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } //////////////////////////////// //~ rjf: "graph" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(graph) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(graph) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } //////////////////////////////// //~ rjf: "bitmap" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(bitmap) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 8); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } //////////////////////////////// //~ rjf: "geo3d" -D_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo3d) +EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(geo3d) { - D_EvalVizBlock *vb = d_eval_viz_block_begin(arena, D_EvalVizBlockKind_Canvas, key, d_expand_key_make(df_hash_from_expand_key(key), 1), depth); + EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth); vb->string = string; vb->expr = expr; vb->visual_idx_range = r1u64(0, 16); vb->semantic_idx_range = r1u64(0, 1); - vb->cfg_table = cfg_table; - d_eval_viz_block_end(out, vb); + vb->view_rules = view_rules; + ev_block_end(out, vb); } diff --git a/src/dbg_frontend/dbg_frontend_views.c b/src/dbg_frontend/dbg_frontend_views.c index 3e1c6a6f..471e85d5 100644 --- a/src/dbg_frontend/dbg_frontend_views.c +++ b/src/dbg_frontend/dbg_frontend_views.c @@ -2489,7 +2489,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d cell_ui_hook = value_ui_rule_spec->info.row_ui; cell_ui_params = value_ui_rule_root; } - cell_can_edit = d_type_key_is_editable(cell_eval.type_key); + cell_can_edit = ev_type_key_is_editable(cell_eval.type_key); }break; case DF_WatchViewColumnKind_Type: {