From 8342cfbd531d210c7ca5f6f35a6212f59767eb9b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 30 Mar 2024 10:46:51 +0000 Subject: [PATCH] Add `slice` view --- src/df/core/df_core.mdesk | 1 + src/df/core/generated/df_core.meta.c | 3 +- src/df/core/generated/df_core.meta.h | 2 + src/df/gfx/df_view_rule_hooks.c | 76 ++++++++++++++++++++++++++++ src/font_cache/font_cache.c | 6 ++- 5 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 354798a6..1eb541bc 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -485,6 +485,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 aeab2adb..53e70812 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -419,10 +419,11 @@ DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[206] = { str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, }; -DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[16] = +DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[17] = { {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 c0c52a0b..5340e74a 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -335,6 +335,7 @@ typedef enum DF_CoreViewRuleKind { DF_CoreViewRuleKind_Null, DF_CoreViewRuleKind_Array, +DF_CoreViewRuleKind_Slice, DF_CoreViewRuleKind_List, DF_CoreViewRuleKind_ByteSwap, DF_CoreViewRuleKind_BaseDec, @@ -401,6 +402,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 898af62f..3fa52f1c 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -382,6 +382,82 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) return eval; } +//////////////////////////////// +//~ bill: "slice" + + +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; +} + +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->rdi, 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) + { + 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_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); + TG_Member *member_ptr = NULL; + TG_Member *member_len = NULL; + 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); + + 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("length"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("count"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("size"), StringMatchFlag_CaseInsensitive); + + if (member_ptr && member_len) + { + U64 slice_len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); + + TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, 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" diff --git a/src/font_cache/font_cache.c b/src/font_cache/font_cache.c index b3b8eaa2..ced8a853 100644 --- a/src/font_cache/font_cache.c +++ b/src/font_cache/font_cache.c @@ -10,6 +10,10 @@ #include "third_party/blake2/blake2b.c" #endif +#ifndef F_TAB_STRING +#define F_TAB_STRING " " +#endif + internal F_Hash f_hash_from_string(String8 string) { @@ -617,7 +621,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(F_TAB_STRING); } //- rjf: piece substring -> raster cache info