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

This commit is contained in:
Ryan Fleury
2024-08-09 09:27:18 -07:00
parent eda3d6f8b5
commit a541ca50d9
6 changed files with 105 additions and 33 deletions
+87 -12
View File
@@ -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;
}
+1
View File
@@ -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);
+2 -7
View File
@@ -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
{
+10 -10
View File
@@ -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 `:`.");
}
}
+1 -1
View File
@@ -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);
+4 -3
View File
@@ -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)};