Skip to content

Commit f58c13b

Browse files
committed
plug full data member calculation path & padding member visualization back in
1 parent 141dd69 commit f58c13b

File tree

2 files changed

+49
-10
lines changed

2 files changed

+49
-10
lines changed

src/eval/eval_ir.c

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,12 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
152152
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
153153
if(direct_type_kind == E_TypeKind_Struct ||
154154
direct_type_kind == E_TypeKind_Class ||
155-
direct_type_kind == E_TypeKind_Union ||
156-
direct_type_kind == E_TypeKind_Enum)
155+
direct_type_kind == E_TypeKind_Union)
156+
{
157+
E_MemberArray data_members = e_type_data_members_from_key__cached(direct_type_key);
158+
lookup_info.named_expr_count = data_members.count;
159+
}
160+
else if(direct_type_kind == E_TypeKind_Enum)
157161
{
158162
E_Type *direct_type = e_type_from_key__cached(direct_type_key);
159163
lookup_info.named_expr_count = direct_type->count;
@@ -430,7 +434,9 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
430434

431435
//- rjf: pull out specific kinds of types
432436
B32 do_struct_range = 0;
437+
B32 do_enum_range = 0;
433438
B32 do_index_range = 0;
439+
E_TypeKey enum_type_key = zero_struct;
434440
E_TypeKey struct_type_key = zero_struct;
435441
E_TypeKind struct_type_kind = E_TypeKind_Null;
436442
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
@@ -439,27 +445,35 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
439445
if(lhs_type->count == 1 &&
440446
(direct_type_kind == E_TypeKind_Struct ||
441447
direct_type_kind == E_TypeKind_Union ||
442-
direct_type_kind == E_TypeKind_Class ||
443-
direct_type_kind == E_TypeKind_Enum))
448+
direct_type_kind == E_TypeKind_Class))
444449
{
445450
struct_type_key = direct_type_key;
446451
struct_type_kind = direct_type_kind;
447452
do_struct_range = 1;
448453
}
454+
else if(lhs_type->count == 1 && direct_type_kind == E_TypeKind_Enum)
455+
{
456+
do_enum_range = 1;
457+
enum_type_key = direct_type_key;
458+
}
449459
else
450460
{
451461
do_index_range = 1;
452462
}
453463
}
454464
else if(lhs_type_kind == E_TypeKind_Struct ||
455465
lhs_type_kind == E_TypeKind_Union ||
456-
lhs_type_kind == E_TypeKind_Class ||
457-
lhs_type_kind == E_TypeKind_Enum)
466+
lhs_type_kind == E_TypeKind_Class)
458467
{
459468
struct_type_key = lhs_type_key;
460469
struct_type_kind = lhs_type_kind;
461470
do_struct_range = 1;
462471
}
472+
else if(lhs_type_kind == E_TypeKind_Enum)
473+
{
474+
enum_type_key = lhs_type_key;
475+
do_enum_range = 1;
476+
}
463477
else if(lhs_type_kind == E_TypeKind_Set)
464478
{
465479
do_index_range = 1;
@@ -472,15 +486,29 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
472486
//- rjf: struct case -> the lookup-range will return a range of members
473487
if(do_struct_range)
474488
{
475-
E_Type *struct_type = e_type_from_key__cached(struct_type_key);
476-
Rng1U64 legal_idx_range = r1u64(0, struct_type->count);
489+
E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key);
490+
Rng1U64 legal_idx_range = r1u64(0, data_members.count);
491+
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
492+
U64 read_range_count = dim_1u64(read_range);
493+
for(U64 idx = 0; idx < read_range_count; idx += 1)
494+
{
495+
U64 member_idx = idx + read_range.min;
496+
String8 member_name = data_members.v[member_idx].name;
497+
exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name);
498+
}
499+
}
500+
501+
//- rjf: enum case -> the lookup-range will return a range of enum constants
502+
else if(do_enum_range)
503+
{
504+
E_Type *type = e_type_from_key__cached(enum_type_key);
505+
Rng1U64 legal_idx_range = r1u64(0, type->count);
477506
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
478507
U64 read_range_count = dim_1u64(read_range);
479508
for(U64 idx = 0; idx < read_range_count; idx += 1)
480509
{
481510
U64 member_idx = idx + read_range.min;
482-
String8 member_name = (struct_type->members ? struct_type->members[member_idx].name :
483-
struct_type->enum_vals ? struct_type->enum_vals[member_idx].name : str8_lit(""));
511+
String8 member_name = type->enum_vals[member_idx].name;
484512
exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name);
485513
}
486514
}

src/raddbg/raddbg_core.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9282,6 +9282,17 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
92829282
}
92839283
}
92849284

9285+
//- rjf: force no_string, if we are looking at padding members
9286+
if(eval.expr->kind == E_ExprKind_MemberAccess)
9287+
{
9288+
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr->first);
9289+
E_Member member = e_type_member_from_key_name__cached(irtree.type_key, eval.expr->last->string);
9290+
if(member.kind == E_MemberKind_Padding)
9291+
{
9292+
no_string = 1;
9293+
}
9294+
}
9295+
92859296
//- rjf: type evaluations -> display type string
92869297
if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key))
92879298
{

0 commit comments

Comments
 (0)