From a541ca50d9141eeedd6bac3855b9bd6bc71f59bc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Aug 2024 09:27:18 -0700 Subject: [PATCH] rdi_from_pdb: robustify to malformed/unexpected pdb characteristics; df: display errors with inline code better; eval: fix incorrect assumption of addr mode being required for member access operators --- src/df/gfx/df_gfx.c | 99 +++++++++++++++++++++++++++++---- src/df/gfx/df_gfx.h | 1 + src/eval/eval_ir.c | 9 +-- src/eval/eval_parse.c | 20 +++---- src/lib_rdi_make/rdi_make.c | 2 +- src/rdi_from_pdb/rdi_from_pdb.c | 7 ++- 6 files changed, 105 insertions(+), 33 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index f7a88cc1..df7c673f 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -12327,18 +12327,28 @@ df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *m mix_t = selected_thread_module->alive_t; } } - if(!mapped_special && token->kind == TXT_TokenKind_Identifier) - { - U64 local_num = e_num_from_string(e_parse_ctx->locals_map, token_string); - if(local_num != 0) - { - mapped_special = 1; - new_color_kind = DF_ThemeColor_CodeLocal; - mix_t = selected_thread_module->alive_t; - } - } break; - } + } + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) + { + U64 local_num = e_num_from_string(e_parse_ctx->locals_map, token_string); + if(local_num != 0) + { + mapped_special = 1; + new_color_kind = DF_ThemeColor_CodeLocal; + mix_t = selected_thread_module->alive_t; + } + } + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) + { + U64 member_num = e_num_from_string(e_parse_ctx->member_map, token_string); + if(member_num != 0) + { + mapped_special = 1; + new_color_kind = DF_ThemeColor_CodeLocal; + mix_t = selected_thread_module->alive_t; + } + } if(!mapped_special) { U64 reg_num = e_num_from_string(e_parse_ctx->regs_map, token_string); @@ -12735,6 +12745,71 @@ df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, Tx //////////////////////////////// //~ rjf: UI Widgets: Fancy Labels + +internal UI_Signal +df_label(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + typedef U32 StringPartFlags; + enum + { + StringPartFlag_Code = (1<<0), + StringPartFlag_Underline = (1<<1), + StringPartFlag_Bright = (1<<2), + }; + typedef struct StringPart StringPart; + struct StringPart + { + StringPart *next; + StringPartFlags flags; + String8 string; + }; + StringPart *first_part = 0; + StringPart *last_part = 0; + U64 active_part_start_idx = 0; + StringPartFlags active_part_flags = 0; + for(U64 idx = 0; idx <= string.size; idx += 1) + { + if(idx == string.size) + { + StringPart *p = push_array(scratch.arena, StringPart, 1); + p->flags = active_part_flags; + p->string = str8_substr(string, r1u64(active_part_start_idx, idx)); + SLLQueuePush(first_part, last_part, p); + } + else if(string.str[idx] == '`') + { + StringPart *p = push_array(scratch.arena, StringPart, 1); + p->flags = active_part_flags; + p->string = str8_substr(string, r1u64(active_part_start_idx, idx)); + SLLQueuePush(first_part, last_part, p); + active_part_start_idx = idx+1; + active_part_flags ^= StringPartFlag_Code; + } + } + D_FancyStringList fstrs = {0}; + for(StringPart *p = first_part; p != 0; p = p->next) + { + D_FancyString fstr = {0}; + { + fstr.font = ui_top_font(); + fstr.string = p->string; + fstr.color = ui_top_palette()->colors[UI_ColorCode_Text]; + fstr.size = ui_top_font_size(); + if(p->flags & StringPartFlag_Code) + { + fstr.font = df_font_from_slot(DF_FontSlot_Code); + fstr.color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); + } + } + d_fancy_string_list_push(scratch.arena, &fstrs, &fstr); + } + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(box, &fstrs); + UI_Signal sig = ui_signal_from_box(box); + scratch_end(scratch); + return sig; +} internal UI_Signal df_error_label(String8 string) @@ -12748,7 +12823,7 @@ df_error_label(String8 string) ui_set_next_text_alignment(UI_TextAlign_Center); ui_set_next_flags(UI_BoxFlag_DrawTextWeak); UI_PrefWidth(ui_em(2.25f, 1.f)) ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); - UI_PrefWidth(ui_text_dim(10, 0)) ui_label(string); + UI_PrefWidth(ui_text_dim(10, 0)) df_label(string); } return sig; } diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 318fcafe..e699fc1c 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -1078,6 +1078,7 @@ internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count //////////////////////////////// //~ rjf: UI Widgets: Fancy Labels +internal UI_Signal df_label(String8 string); internal UI_Signal df_error_label(String8 string); internal B32 df_help_label(String8 string); internal D_FancyStringList df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index a9cc3208..92017269 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -507,7 +507,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) } else if(!r_found) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Could not find a member named '%S'.", exprr->string); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Could not find a member named `%S`.", exprr->string); break; } else if(check_type_kind != E_TypeKind_Struct && @@ -517,11 +517,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot perform member access on this type."); break; } - else if(l.mode != E_Mode_Addr && l.mode != E_Mode_Reg) - { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot access member without a base address or register location."); - break; - } // rjf: generate { @@ -1120,7 +1115,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_Expr *macro_expr = e_expr_from_string(e_ir_ctx->macro_map, expr->string); if(macro_expr == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "\"%S\" could not be found.", expr->string); + e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "`%S` could not be found.", expr->string); } else { diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 03165a2d..1d084e9d 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1040,7 +1040,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing )."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `)`."); } // rjf: consume ) @@ -1106,7 +1106,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing )."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `)`."); } // rjf: consume ) @@ -1144,7 +1144,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit("]"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing ]."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `]`."); } // rjf: consume ) @@ -1466,7 +1466,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to } else { - e_msgf(arena, &result.msgs, E_MsgKind_MissingInfo, token_string.str, "Missing location information for \"%S\".", token_string); + e_msgf(arena, &result.msgs, E_MsgKind_MissingInfo, token_string.str, "Missing location information for `%S`.", token_string); } }break; case RDI_LocationKind_AddrBytecodeStream: @@ -1639,7 +1639,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 member_name_maybe_string = str8_substr(text, member_name_maybe.range); if(member_name_maybe.kind != E_TokenKind_Identifier) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected member name after %S.", token_string); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected member name after `%S`.", token_string); } else { @@ -1697,7 +1697,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 close_brace_maybe_string = str8_substr(text, close_brace_maybe.range); if(close_brace_maybe.kind != E_TokenKind_Symbol || !str8_match(close_brace_maybe_string, str8_lit("]"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Unclosed [."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Unclosed `[`."); } else { @@ -1784,7 +1784,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to it = rhs_expr_parse.last_token; if(rhs == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing right-hand-side of %S.", token_string); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing right-hand-side of `%S`.", token_string); } else { @@ -1810,7 +1810,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs); if(middle_expr_parse.expr == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after ?."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`."); } // rjf: expect : @@ -1822,7 +1822,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 colon_token_maybe_string = str8_substr(text, colon_token_maybe.range); if(colon_token_maybe.kind != E_TokenKind_Symbol || !str8_match(colon_token_maybe_string, str8_lit(":"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected : after ?."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected `:` after `?`."); } else { @@ -1842,7 +1842,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); if(rhs_expr_parse.expr == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after :."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`."); } } diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 5c08e298..a04fa1c1 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -2081,7 +2081,7 @@ rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps { //- rjf: set up map RDIM_BakeIdxRunMap *idx_runs = rdim_push_array(arena, RDIM_BakeIdxRunMap, 1); - idx_runs->slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + idx_runs->slots_count = 64 + params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs->slots_count); rdim_bake_idx_run_map_insert(arena, idx_runs, 0, 0); diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 7057595e..11abf6b2 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3451,7 +3451,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) CV_TypeId *itype_fwd_map = 0; CV_TypeId itype_first = 0; CV_TypeId itype_opl = 0; - if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 1: produce type forward resolution map") + if(tpi_leaf != 0 && in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 1: produce type forward resolution map") { //- rjf: allocate forward resolution map itype_first = tpi_leaf->itype_first; @@ -3492,7 +3492,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // as such, always show up *earlier* in the actually built types. // P2R_TypeIdChain **itype_chains = 0; - if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") + if(tpi_leaf != 0 && in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") { //- rjf: allocate itype chain table itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); @@ -4419,7 +4419,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) ////////////////////////////// //- rjf: kick off string map building tasks // - RDIM_BakeStringMapTopology bake_string_map_topology = {(in_params->procedures.total_count*1 + + RDIM_BakeStringMapTopology bake_string_map_topology = {(64 + + in_params->procedures.total_count*1 + in_params->global_variables.total_count*1 + in_params->thread_variables.total_count*1 + in_params->types.total_count/2)};