From 57a35c6b2826ca45feb00ac7b29766fe9e138015 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 12 Feb 2024 12:35:43 +0000 Subject: [PATCH 1/5] Make tabs 4-spaces (1 was too little) --- src/font_cache/font_cache.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/font_cache/font_cache.c b/src/font_cache/font_cache.c index b3b8eaa2..36f5fa62 100644 --- a/src/font_cache/font_cache.c +++ b/src/font_cache/font_cache.c @@ -10,6 +10,8 @@ #include "third_party/blake2/blake2b.c" #endif +#define TAB_STRING " " + internal F_Hash f_hash_from_string(String8 string) { @@ -617,7 +619,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F_RunFlags flags, Stri B32 is_tab = (piece_substring.size == 1 && piece_substring.str[0] == '\t'); if(is_tab) { - piece_substring = str8_lit(" "); + piece_substring = str8_lit(TAB_STRING); } //- rjf: piece substring -> raster cache info From 156615a3ba8129dd9dd9dd452754453f1ffac08e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 12 Feb 2024 14:16:23 +0000 Subject: [PATCH 2/5] Add view rule `slice` --- src/df/core/df_core.mdesk | 1 + src/df/core/generated/df_core.meta.c | 1 + src/df/core/generated/df_core.meta.h | 2 + src/df/gfx/df_view_rule_hooks.c | 67 ++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 8273f114..c58e7e60 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -487,6 +487,7 @@ DF_CoreViewRuleTable: { {Null null "" - - - - "" - "" } {Array array "array" - - x - "Array" x "Specifies that a pointer points to N elements, rather than only 1." } + {Slice slice "slice" - - x - "Slice" x "Specifies that a struct to be rendered as a slice." } {List list "list" - - - x "List" x "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." } {ByteSwap bswap "bswap" x - x - "Byte Swap" x "Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed." } {BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "Specifies that all integral evaluations should appear in base-10 form." } diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 29aae133..cc23fe88 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -217,6 +217,7 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] = { {str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, {str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(array) , 0, }, +{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp("Specifies that a struct to be rendered as a slice."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(slice) , 0, }, {str8_lit_comp("list"), str8_lit_comp("List"), 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."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(list) , }, {str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp("Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(bswap) , 0, }, {str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 45553c01..56e1add3 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -344,6 +344,7 @@ typedef enum DF_CoreViewRuleKind { DF_CoreViewRuleKind_Null, DF_CoreViewRuleKind_Array, +DF_CoreViewRuleKind_Slice, DF_CoreViewRuleKind_List, DF_CoreViewRuleKind_ByteSwap, DF_CoreViewRuleKind_BaseDec, @@ -410,6 +411,7 @@ B32 force_confirm; }; DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 3e2568b4..873d4cba 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -352,6 +352,73 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) return eval; } + +void dbg_printf(char const *fmt, ...) { + va_list argp; + va_start(argp, fmt); + char buf[4096] = {}; + vsnprintf_s(buf, 4095, fmt, argp); + va_end(argp); + OutputDebugStringA(buf); +} + +//////////////////////////////// +//~ bill: "slice" + +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) +{ + TG_Key type_key = eval.type_key; + TG_Kind type_kind = tg_kind_from_key(type_key); + + if (type_kind == TG_Kind_Struct) { + Temp scratch = scratch_begin(&arena, 1); + DF_CfgNode *struct_node = val->last; + if (struct_node != &df_g_nil_cfg_node) { + + TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(arena, parse_ctx->type_graph, parse_ctx->rdbg, type_key); + TG_Member *member_ptr = NULL; + TG_Member *member_len = NULL; + for (U64 i = 0; i < data_members.count; i++) { + TG_Member *member = &data_members.v[i]; + if (str8_match(member->name, str8_lit("data"), StringMatchFlag_CaseInsensitive) || + str8_match(member->name, str8_lit("ptr"), StringMatchFlag_CaseInsensitive)) { + member_ptr = member; + } else if (str8_match(member->name, str8_lit("len"), StringMatchFlag_CaseInsensitive) || + str8_match(member->name, str8_lit("size"), StringMatchFlag_CaseInsensitive)) { + member_len = member; + } + } + + if (member_ptr && member_len) { + U64 slice_len = 0; + + DF_Eval len_eval = zero_struct; + len_eval.mode = EVAL_EvalMode_Addr; + len_eval.offset = eval.offset + member_len->off; + len_eval.type_key = member_len->type_key; + len_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, len_eval); + if (len_eval.mode == EVAL_EvalMode_Value) { + slice_len = len_eval.imm_u64; + } + + + TG_Key pointee = tg_ptee_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, member_ptr->type_key); + TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, slice_len); + + // TODO(bill): How do you make this render with the original name, if possible? + DF_Eval new_eval = zero_struct; + new_eval.mode = EVAL_EvalMode_Addr; + new_eval.offset = eval.offset + member_ptr->off; + new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); + + eval = new_eval; + } + } + scratch_end(scratch); + } + return eval; +} + //////////////////////////////// //~ rjf: "list" From fa6b04ab24e6dcce497e701516e2d1b49627f407 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 12 Feb 2024 14:32:49 +0000 Subject: [PATCH 3/5] Support `String8` like strings --- src/df/gfx/df_view_rule_hooks.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 873d4cba..f5e8ae96 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -381,6 +381,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) for (U64 i = 0; i < data_members.count; i++) { TG_Member *member = &data_members.v[i]; if (str8_match(member->name, str8_lit("data"), StringMatchFlag_CaseInsensitive) || + str8_match(member->name, str8_lit("str"), StringMatchFlag_CaseInsensitive) || str8_match(member->name, str8_lit("ptr"), StringMatchFlag_CaseInsensitive)) { member_ptr = member; } else if (str8_match(member->name, str8_lit("len"), StringMatchFlag_CaseInsensitive) || @@ -419,6 +420,8 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) return eval; } + + //////////////////////////////// //~ rjf: "list" From f41f8dd71950d151d6f5b85b36736dd4fcc5bcee Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 12 Feb 2024 14:33:57 +0000 Subject: [PATCH 4/5] Remove `dbg_printf` --- src/df/gfx/df_view_rule_hooks.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index f5e8ae96..307ee272 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -352,16 +352,6 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) return eval; } - -void dbg_printf(char const *fmt, ...) { - va_list argp; - va_start(argp, fmt); - char buf[4096] = {}; - vsnprintf_s(buf, 4095, fmt, argp); - va_end(argp); - OutputDebugStringA(buf); -} - //////////////////////////////// //~ bill: "slice" From 0ccfb51102c35550d8735c11dd7c53480c42b009 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 12 Feb 2024 15:51:31 +0000 Subject: [PATCH 5/5] Very bad `odin_map` view rule, only renders keys currently --- src/df/core/df_core.mdesk | 3 +- src/df/core/generated/df_core.meta.c | 3 +- src/df/core/generated/df_core.meta.h | 6 +- src/df/gfx/df_view_rule_hooks.c | 146 ++++++++++++++++++++++----- 4 files changed, 131 insertions(+), 27 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index c58e7e60..f9586029 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -487,7 +487,6 @@ DF_CoreViewRuleTable: { {Null null "" - - - - "" - "" } {Array array "array" - - x - "Array" x "Specifies that a pointer points to N elements, rather than only 1." } - {Slice slice "slice" - - x - "Slice" x "Specifies that a struct to be rendered as a slice." } {List list "list" - - - x "List" x "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." } {ByteSwap bswap "bswap" x - x - "Byte Swap" x "Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed." } {BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "Specifies that all integral evaluations should appear in base-10 form." } @@ -502,6 +501,8 @@ DF_CoreViewRuleTable: {Disasm disasm "disasm" - x - x "Disassembly" x "Displays as disassembled instructions, interpreting the data as raw machine code." } {Bitmap bitmap "bitmap" - x - x "Bitmap" x "Displays as a bitmap, interpreting the data as raw pixel data." } {Geo geo "geo" - x - x "Geometry" x "Displays as geometry, interpreting the data as vertex data." } + {Slice slice "slice" - - x - "Slice" x "Specifies that some struct is to be rendered as a slice." } + {OdinMap odin_map "odin_map" - - x - "Odin Map" x "Specifies that a struct to be rendered as an Odin map." } } //////////////////////////////// diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index cc23fe88..f0a19b2e 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -217,7 +217,6 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] = { {str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, {str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(array) , 0, }, -{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp("Specifies that a struct to be rendered as a slice."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(slice) , 0, }, {str8_lit_comp("list"), str8_lit_comp("List"), 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."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(list) , }, {str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp("Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(bswap) , 0, }, {str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, @@ -232,5 +231,7 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] = {str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(disasm) , }, {str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(bitmap) , }, {str8_lit_comp("geo"), str8_lit_comp("Geometry"), str8_lit_comp("Displays as geometry, interpreting the data as vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo) , }, +{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp("Specifies that some struct is to be rendered as a slice."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(slice) , 0, }, +{str8_lit_comp("odin_map"), str8_lit_comp("Odin Map"), str8_lit_comp("Specifies that a struct to be rendered as an Odin map."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(odin_map) , 0, }, }; diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 56e1add3..7d1bb9ea 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -344,7 +344,6 @@ typedef enum DF_CoreViewRuleKind { DF_CoreViewRuleKind_Null, DF_CoreViewRuleKind_Array, -DF_CoreViewRuleKind_Slice, DF_CoreViewRuleKind_List, DF_CoreViewRuleKind_ByteSwap, DF_CoreViewRuleKind_BaseDec, @@ -359,6 +358,8 @@ DF_CoreViewRuleKind_Text, DF_CoreViewRuleKind_Disasm, DF_CoreViewRuleKind_Bitmap, DF_CoreViewRuleKind_Geo, +DF_CoreViewRuleKind_Slice, +DF_CoreViewRuleKind_OdinMap, DF_CoreViewRuleKind_COUNT } DF_CoreViewRuleKind; @@ -411,8 +412,9 @@ B32 force_confirm; }; DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 307ee272..985cd4b8 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -352,46 +352,78 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) return eval; } +//////////////////////////////// +//~ bill: utility procedures + +internal void dbg_printf(char const *fmt, ...) +{ + va_list argp; + va_start(argp, fmt); + char buf[4096] = {}; + vsnprintf_s(buf, 4095, fmt, argp); + va_end(argp); + OutputDebugStringA(buf); +} + +internal TG_Member *tg_member_from_name(TG_MemberArray array, String8 name, StringMatchFlags flags) +{ + for (U64 i = 0; i < array.count; i++) + { + TG_Member *member = &array.v[i]; + if (str8_match(member->name, name, flags)) + { + return member; + } + } + return NULL; +} + //////////////////////////////// //~ bill: "slice" + +internal U64 df_evaluate_integer_from_eval(EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, TG_Member *member) +{ + DF_Eval res = zero_struct; + res.mode = EVAL_EvalMode_Addr; + res.offset = eval.offset + member->off; + res.type_key = member->type_key; + res = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, res); + if (res.mode == EVAL_EvalMode_Value) + { + return res.imm_u64; + } + return 0; +} + DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) { TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - if (type_kind == TG_Kind_Struct) { + if (type_kind == TG_Kind_Struct) + { Temp scratch = scratch_begin(&arena, 1); DF_CfgNode *struct_node = val->last; - if (struct_node != &df_g_nil_cfg_node) { + if (struct_node != &df_g_nil_cfg_node) + { TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(arena, parse_ctx->type_graph, parse_ctx->rdbg, type_key); TG_Member *member_ptr = NULL; TG_Member *member_len = NULL; - for (U64 i = 0; i < data_members.count; i++) { - TG_Member *member = &data_members.v[i]; - if (str8_match(member->name, str8_lit("data"), StringMatchFlag_CaseInsensitive) || - str8_match(member->name, str8_lit("str"), StringMatchFlag_CaseInsensitive) || - str8_match(member->name, str8_lit("ptr"), StringMatchFlag_CaseInsensitive)) { - member_ptr = member; - } else if (str8_match(member->name, str8_lit("len"), StringMatchFlag_CaseInsensitive) || - str8_match(member->name, str8_lit("size"), StringMatchFlag_CaseInsensitive)) { - member_len = member; - } - } + member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("data"), StringMatchFlag_CaseInsensitive); + member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("str"), StringMatchFlag_CaseInsensitive); + member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("ptr"), StringMatchFlag_CaseInsensitive); - if (member_ptr && member_len) { - U64 slice_len = 0; + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("len"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("size"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("count"), StringMatchFlag_CaseInsensitive); - DF_Eval len_eval = zero_struct; - len_eval.mode = EVAL_EvalMode_Addr; - len_eval.offset = eval.offset + member_len->off; - len_eval.type_key = member_len->type_key; - len_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, len_eval); - if (len_eval.mode == EVAL_EvalMode_Value) { - slice_len = len_eval.imm_u64; - } + if (member_ptr && member_len) + { + // NOTE(bill): this assumes little-endian format + U64 slice_len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); TG_Key pointee = tg_ptee_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, member_ptr->type_key); TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, slice_len); @@ -410,6 +442,74 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) return eval; } +//////////////////////////////// +//~ bill: "odin_map" + +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) +{ + TG_Key type_key = eval.type_key; + TG_Kind type_kind = tg_kind_from_key(type_key); + + if (type_kind == TG_Kind_Struct) + { + DF_CfgNode *struct_node = val->last; + if (struct_node != &df_g_nil_cfg_node) + { + TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(arena, parse_ctx->type_graph, parse_ctx->rdbg, type_key); + TG_Member *member_data = tg_member_from_name(data_members, str8_lit("data"), 0); + TG_Member *member_len = tg_member_from_name(data_members, str8_lit("len"), 0); + TG_Member *member_metadata = tg_member_from_name(data_members, str8_lit("__metadata"), 0); + + if (member_data && member_len && member_metadata) + { + TG_Key metadata = member_metadata->type_key; + metadata = tg_direct_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, metadata); + metadata = tg_ptee_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, metadata); + Assert(tg_kind_from_key(metadata) == TG_Kind_Struct); + + TG_MemberArray md_members = tg_data_members_from_graph_raddbg_key(arena, parse_ctx->type_graph, parse_ctx->rdbg, metadata); + TG_Member *m_key = tg_member_from_name(md_members, str8_lit("key"), 0); + TG_Member *m_value = tg_member_from_name(md_members, str8_lit("value"), 0); + TG_Member *m_hash = tg_member_from_name(md_members, str8_lit("hash"), 0); + TG_Member *m_key_cell = tg_member_from_name(md_members, str8_lit("key_cell"), 0); + TG_Member *m_value_cell = tg_member_from_name(md_members, str8_lit("value_cell"), 0); + + if (m_key == NULL) { + return eval; + } + Assert(m_key && m_value && m_hash && m_key_cell && m_value_cell); + TG_Key key = m_key->type_key; + TG_Key value = m_value->type_key; + TG_Key hash = m_hash->type_key; + TG_Key key_cell = m_key_cell->type_key; + TG_Key value_cell = m_value_cell->type_key; + + + // NOTE(bill): this assumes little-endian format + U64 len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); + U64 data = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_data); + U64 cap = data & (U64)63; + if (cap) + { + cap = ((U64)1)<type_graph, TG_Kind_Array, key, cap); + + // TODO(bill): How do you make this render with the original name, if possible? + DF_Eval new_eval = zero_struct; + new_eval.mode = EVAL_EvalMode_Value; + new_eval.imm_u64 = data; + new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); + eval = new_eval; + } + } + } + return eval; +} + + ////////////////////////////////