mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 13:58:40 +00:00
adjust list lens member picking rules - use default argument, then fall back to next, prev, or the first pointer to an identical type
This commit is contained in:
@@ -1,3 +1,15 @@
|
|||||||
|
# v0.9.23-alpha
|
||||||
|
|
||||||
|
## Debugger Changes
|
||||||
|
|
||||||
|
- Further improved PDB -> RDI conversion performance & memory usage.
|
||||||
|
- Adjusted limits for the amount of PDB -> RDI conversion work that the
|
||||||
|
debugger will kick off, to prevent PDB -> RDI conversion interfering with
|
||||||
|
debuggee performance.
|
||||||
|
- Reintroduced the `list` lens, which gathers all nodes in a linked list, and
|
||||||
|
visualizes them as a flat list of pointers (the same as how an array of
|
||||||
|
pointers is visualized).
|
||||||
|
|
||||||
# v0.9.22-alpha
|
# v0.9.22-alpha
|
||||||
|
|
||||||
## Debugger Changes
|
## Debugger Changes
|
||||||
|
|||||||
@@ -4200,6 +4200,21 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
|
|||||||
|
|
||||||
//- rjf: eval helpers
|
//- rjf: eval helpers
|
||||||
|
|
||||||
|
internal U64
|
||||||
|
ctrl_eval_space_gen(E_Space space)
|
||||||
|
{
|
||||||
|
U64 result = 0;
|
||||||
|
switch(space.kind)
|
||||||
|
{
|
||||||
|
default:{}break;
|
||||||
|
case CTRL_EvalSpaceKind_Entity:
|
||||||
|
{
|
||||||
|
result = ctrl_mem_gen();
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
internal B32
|
internal B32
|
||||||
ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range)
|
ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range)
|
||||||
{
|
{
|
||||||
@@ -4418,6 +4433,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C
|
|||||||
ctx->primary_module = eval_modules_primary;
|
ctx->primary_module = eval_modules_primary;
|
||||||
|
|
||||||
//- rjf: fill space hooks
|
//- rjf: fill space hooks
|
||||||
|
ctx->space_gen = ctrl_eval_space_gen;
|
||||||
ctx->space_read = ctrl_eval_space_read;
|
ctx->space_read = ctrl_eval_space_read;
|
||||||
}
|
}
|
||||||
e_select_base_ctx(&scope->base_ctx);
|
e_select_base_ctx(&scope->base_ctx);
|
||||||
|
|||||||
@@ -980,7 +980,8 @@ internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module,
|
|||||||
//- rjf: attached process running/event gathering
|
//- rjf: attached process running/event gathering
|
||||||
internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof);
|
internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof);
|
||||||
|
|
||||||
//- rjf: eval helpers
|
//- rjf: eval helpers
|
||||||
|
internal U64 ctrl_eval_space_gen(E_Space space);
|
||||||
internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range);
|
internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range);
|
||||||
|
|
||||||
//- rjf: control thread eval scopes
|
//- rjf: control thread eval scopes
|
||||||
|
|||||||
+1
-6
@@ -2422,12 +2422,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
|||||||
}
|
}
|
||||||
if(irext != 0 && result.user_data == 0)
|
if(irext != 0 && result.user_data == 0)
|
||||||
{
|
{
|
||||||
E_IRTreeAndType irtree_stripped = result;
|
E_IRExt ext = irext(arena, expr, &result);
|
||||||
if(type->kind == E_TypeKind_Lens)
|
|
||||||
{
|
|
||||||
irtree_stripped.type_key = e_type_key_direct(irtree_stripped.type_key);
|
|
||||||
}
|
|
||||||
E_IRExt ext = irext(arena, expr, &irtree_stripped);
|
|
||||||
result.user_data = ext.user_data;
|
result.user_data = ext.user_data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+47
-5
@@ -2711,13 +2711,54 @@ E_TYPE_IREXT_FUNCTION_DEF(list)
|
|||||||
{
|
{
|
||||||
E_IRExt result = {0};
|
E_IRExt result = {0};
|
||||||
E_Type *type = e_type_from_key(irtree->type_key);
|
E_Type *type = e_type_from_key(irtree->type_key);
|
||||||
String8 next_link_member_name = str8_lit("next");
|
|
||||||
if(type->args != 0 && type->count > 0)
|
//- rjf: get member encoding the link to the next node
|
||||||
|
E_Member next_link_member = {0};
|
||||||
{
|
{
|
||||||
next_link_member_name = type->args[0]->string;
|
E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);
|
||||||
|
|
||||||
|
// rjf: try explicitly-passed name
|
||||||
|
if(next_link_member.kind == E_MemberKind_Null && type->args != 0 && type->count > 0 && type->args[0]->kind == E_ExprKind_LeafIdentifier)
|
||||||
|
{
|
||||||
|
String8 name = type->args[0]->string;
|
||||||
|
next_link_member = e_type_member_from_key_name__cached(node_type_key, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// rjf: try `next`
|
||||||
|
if(next_link_member.kind == E_MemberKind_Null)
|
||||||
|
{
|
||||||
|
next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit("next"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// rjf: try `prev`
|
||||||
|
if(next_link_member.kind == E_MemberKind_Null)
|
||||||
|
{
|
||||||
|
next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit("prev"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// rjf: try any pointer to the same type
|
||||||
|
if(next_link_member.kind == E_MemberKind_Null)
|
||||||
|
{
|
||||||
|
E_Type *node_type = e_type_from_key(node_type_key);
|
||||||
|
if(node_type->members != 0)
|
||||||
|
{
|
||||||
|
for EachIndex(idx, node_type->count)
|
||||||
|
{
|
||||||
|
E_TypeKey member_type_key = node_type->members[idx].type_key;
|
||||||
|
E_TypeKey member_type_key_undecorated = e_type_key_unwrap(member_type_key, E_TypeUnwrapFlag_AllDecorative);
|
||||||
|
E_TypeKey member_ptee_type_key = e_type_key_unwrap(member_type_key_undecorated, E_TypeUnwrapFlag_All);
|
||||||
|
if(e_type_kind_from_key(member_type_key_undecorated) == E_TypeKind_Ptr &&
|
||||||
|
e_type_key_match(member_ptee_type_key, node_type_key))
|
||||||
|
{
|
||||||
|
next_link_member = node_type->members[idx];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);
|
|
||||||
E_Member next_link_member = e_type_member_from_key_name__cached(node_type_key, next_link_member_name);
|
//- rjf: generate expansion info
|
||||||
E_TypeExpandInfo info = {0, 0};
|
E_TypeExpandInfo info = {0, 0};
|
||||||
if(next_link_member.kind != E_MemberKind_DataField)
|
if(next_link_member.kind != E_MemberKind_DataField)
|
||||||
{
|
{
|
||||||
@@ -2765,6 +2806,7 @@ E_TYPE_IREXT_FUNCTION_DEF(list)
|
|||||||
access_close(access);
|
access_close(access);
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -572,14 +572,16 @@ type_coverage_eval_tests(void)
|
|||||||
struct SLLNode
|
struct SLLNode
|
||||||
{
|
{
|
||||||
SLLNode *next;
|
SLLNode *next;
|
||||||
|
SLLNode *the_real_next_ptr;
|
||||||
int x;
|
int x;
|
||||||
};
|
};
|
||||||
SLLNode node6 = {0, 6};
|
SLLNode node6 = {0, 0, 6};
|
||||||
SLLNode node5 = {&node6, 5};
|
SLLNode node5 = {0, &node6, 5};
|
||||||
SLLNode node4 = {&node5, 4};
|
SLLNode node4 = {0, &node5, 4};
|
||||||
SLLNode node3 = {&node4, 3};
|
SLLNode node3 = {0, &node4, 3};
|
||||||
SLLNode node2 = {&node3, 2};
|
SLLNode node2 = {0, &node3, 2};
|
||||||
SLLNode node1 = {&node2, 1};
|
SLLNode node1 = {0, &node2, 1};
|
||||||
|
raddbg_pin(list(node1, the_real_next_ptr));
|
||||||
|
|
||||||
Alias1 a1 = has_enums.kind;
|
Alias1 a1 = has_enums.kind;
|
||||||
Alias2 a2 = has_enums.flags;
|
Alias2 a2 = has_enums.flags;
|
||||||
|
|||||||
@@ -1726,6 +1726,10 @@ rd_eval_space_gen(E_Space space)
|
|||||||
U64 result = 0;
|
U64 result = 0;
|
||||||
switch(space.kind)
|
switch(space.kind)
|
||||||
{
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
result = ctrl_eval_space_gen(space);
|
||||||
|
}break;
|
||||||
case RD_EvalSpaceKind_MetaCfg:
|
case RD_EvalSpaceKind_MetaCfg:
|
||||||
case RD_EvalSpaceKind_MetaQuery:
|
case RD_EvalSpaceKind_MetaQuery:
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user