Skip to content

Commit 8dbfa97

Browse files
committed
adjust list lens member picking rules - use default argument, then fall back to next, prev, or the first pointer to an identical type
1 parent a2522c0 commit 8dbfa97

File tree

7 files changed

+90
-18
lines changed

7 files changed

+90
-18
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
# v0.9.23-alpha
2+
3+
## Debugger Changes
4+
5+
- Further improved PDB -> RDI conversion performance & memory usage.
6+
- Adjusted limits for the amount of PDB -> RDI conversion work that the
7+
debugger will kick off, to prevent PDB -> RDI conversion interfering with
8+
debuggee performance.
9+
- Reintroduced the `list` lens, which gathers all nodes in a linked list, and
10+
visualizes them as a flat list of pointers (the same as how an array of
11+
pointers is visualized).
12+
113
# v0.9.22-alpha
214

315
## Debugger Changes

src/ctrl/ctrl_core.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4200,6 +4200,21 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
42004200

42014201
//- rjf: eval helpers
42024202

4203+
internal U64
4204+
ctrl_eval_space_gen(E_Space space)
4205+
{
4206+
U64 result = 0;
4207+
switch(space.kind)
4208+
{
4209+
default:{}break;
4210+
case CTRL_EvalSpaceKind_Entity:
4211+
{
4212+
result = ctrl_mem_gen();
4213+
}break;
4214+
}
4215+
return result;
4216+
}
4217+
42034218
internal B32
42044219
ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range)
42054220
{
@@ -4418,6 +4433,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C
44184433
ctx->primary_module = eval_modules_primary;
44194434

44204435
//- rjf: fill space hooks
4436+
ctx->space_gen = ctrl_eval_space_gen;
44214437
ctx->space_read = ctrl_eval_space_read;
44224438
}
44234439
e_select_base_ctx(&scope->base_ctx);

src/ctrl/ctrl_core.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,8 @@ internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module,
980980
//- rjf: attached process running/event gathering
981981
internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof);
982982

983-
//- rjf: eval helpers
983+
//- rjf: eval helpers
984+
internal U64 ctrl_eval_space_gen(E_Space space);
984985
internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range);
985986

986987
//- rjf: control thread eval scopes

src/eval/eval_ir.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,12 +2422,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
24222422
}
24232423
if(irext != 0 && result.user_data == 0)
24242424
{
2425-
E_IRTreeAndType irtree_stripped = result;
2426-
if(type->kind == E_TypeKind_Lens)
2427-
{
2428-
irtree_stripped.type_key = e_type_key_direct(irtree_stripped.type_key);
2429-
}
2430-
E_IRExt ext = irext(arena, expr, &irtree_stripped);
2425+
E_IRExt ext = irext(arena, expr, &result);
24312426
result.user_data = ext.user_data;
24322427
}
24332428
}

src/eval/eval_types.c

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,13 +2711,54 @@ E_TYPE_IREXT_FUNCTION_DEF(list)
27112711
{
27122712
E_IRExt result = {0};
27132713
E_Type *type = e_type_from_key(irtree->type_key);
2714-
String8 next_link_member_name = str8_lit("next");
2715-
if(type->args != 0 && type->count > 0)
2714+
2715+
//- rjf: get member encoding the link to the next node
2716+
E_Member next_link_member = {0};
27162717
{
2717-
next_link_member_name = type->args[0]->string;
2718+
E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);
2719+
2720+
// rjf: try explicitly-passed name
2721+
if(next_link_member.kind == E_MemberKind_Null && type->args != 0 && type->count > 0 && type->args[0]->kind == E_ExprKind_LeafIdentifier)
2722+
{
2723+
String8 name = type->args[0]->string;
2724+
next_link_member = e_type_member_from_key_name__cached(node_type_key, name);
2725+
}
2726+
2727+
// rjf: try `next`
2728+
if(next_link_member.kind == E_MemberKind_Null)
2729+
{
2730+
next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit("next"));
2731+
}
2732+
2733+
// rjf: try `prev`
2734+
if(next_link_member.kind == E_MemberKind_Null)
2735+
{
2736+
next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit("prev"));
2737+
}
2738+
2739+
// rjf: try any pointer to the same type
2740+
if(next_link_member.kind == E_MemberKind_Null)
2741+
{
2742+
E_Type *node_type = e_type_from_key(node_type_key);
2743+
if(node_type->members != 0)
2744+
{
2745+
for EachIndex(idx, node_type->count)
2746+
{
2747+
E_TypeKey member_type_key = node_type->members[idx].type_key;
2748+
E_TypeKey member_type_key_undecorated = e_type_key_unwrap(member_type_key, E_TypeUnwrapFlag_AllDecorative);
2749+
E_TypeKey member_ptee_type_key = e_type_key_unwrap(member_type_key_undecorated, E_TypeUnwrapFlag_All);
2750+
if(e_type_kind_from_key(member_type_key_undecorated) == E_TypeKind_Ptr &&
2751+
e_type_key_match(member_ptee_type_key, node_type_key))
2752+
{
2753+
next_link_member = node_type->members[idx];
2754+
break;
2755+
}
2756+
}
2757+
}
2758+
}
27182759
}
2719-
E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);
2720-
E_Member next_link_member = e_type_member_from_key_name__cached(node_type_key, next_link_member_name);
2760+
2761+
//- rjf: generate expansion info
27212762
E_TypeExpandInfo info = {0, 0};
27222763
if(next_link_member.kind != E_MemberKind_DataField)
27232764
{
@@ -2765,6 +2806,7 @@ E_TYPE_IREXT_FUNCTION_DEF(list)
27652806
access_close(access);
27662807
scratch_end(scratch);
27672808
}
2809+
27682810
return result;
27692811
}
27702812

src/mule/mule_main.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -572,14 +572,16 @@ type_coverage_eval_tests(void)
572572
struct SLLNode
573573
{
574574
SLLNode *next;
575+
SLLNode *the_real_next_ptr;
575576
int x;
576577
};
577-
SLLNode node6 = {0, 6};
578-
SLLNode node5 = {&node6, 5};
579-
SLLNode node4 = {&node5, 4};
580-
SLLNode node3 = {&node4, 3};
581-
SLLNode node2 = {&node3, 2};
582-
SLLNode node1 = {&node2, 1};
578+
SLLNode node6 = {0, 0, 6};
579+
SLLNode node5 = {0, &node6, 5};
580+
SLLNode node4 = {0, &node5, 4};
581+
SLLNode node3 = {0, &node4, 3};
582+
SLLNode node2 = {0, &node3, 2};
583+
SLLNode node1 = {0, &node2, 1};
584+
raddbg_pin(list(node1, the_real_next_ptr));
583585

584586
Alias1 a1 = has_enums.kind;
585587
Alias2 a2 = has_enums.flags;

src/raddbg/raddbg_core.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,6 +1726,10 @@ rd_eval_space_gen(E_Space space)
17261726
U64 result = 0;
17271727
switch(space.kind)
17281728
{
1729+
default:
1730+
{
1731+
result = ctrl_eval_space_gen(space);
1732+
}break;
17291733
case RD_EvalSpaceKind_MetaCfg:
17301734
case RD_EvalSpaceKind_MetaQuery:
17311735
{

0 commit comments

Comments
 (0)