mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 05:48:40 +00:00
fix incorrect skip-to-end in new pdb -> raddbgi converter member parsing, in some cases (particularly noticeable in C++ structs with vtable members)
This commit is contained in:
@@ -1257,7 +1257,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point)
|
|||||||
CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr;
|
CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr;
|
||||||
U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind);
|
U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind);
|
||||||
U8 *field_leaf_first = read_ptr+2;
|
U8 *field_leaf_first = read_ptr+2;
|
||||||
U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2;
|
U8 *field_leaf_opl = field_list_opl;
|
||||||
next_read_ptr = field_leaf_opl;
|
next_read_ptr = field_leaf_opl;
|
||||||
|
|
||||||
// rjf: skip out-of-bounds fields
|
// rjf: skip out-of-bounds fields
|
||||||
@@ -1282,6 +1282,9 @@ internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point)
|
|||||||
CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first;
|
CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first;
|
||||||
CV_TypeId new_itype = lf->itype;
|
CV_TypeId new_itype = lf->itype;
|
||||||
|
|
||||||
|
// rjf: bump next read pointer past header
|
||||||
|
next_read_ptr = (U8 *)(lf+1);
|
||||||
|
|
||||||
// rjf: determine if index itype is new
|
// rjf: determine if index itype is new
|
||||||
B32 is_new = 1;
|
B32 is_new = 1;
|
||||||
for(FieldListTask *t = fl_done_stack; t != 0; t = t->next)
|
for(FieldListTask *t = fl_done_stack; t != 0; t = t->next)
|
||||||
@@ -1573,6 +1576,9 @@ internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point)
|
|||||||
U8 *num2_ptr = num1_ptr + num1.encoded_size;
|
U8 *num2_ptr = num1_ptr + num1.encoded_size;
|
||||||
CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl);
|
CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl);
|
||||||
|
|
||||||
|
// rjf: bump next read pointer past header
|
||||||
|
next_read_ptr = (U8 *)(lf+1);
|
||||||
|
|
||||||
// rjf: emit member
|
// rjf: emit member
|
||||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||||
mem->kind = RDI_MemberKind_VirtualBase;
|
mem->kind = RDI_MemberKind_VirtualBase;
|
||||||
@@ -1583,6 +1589,10 @@ internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point)
|
|||||||
case CV_LeafKind_VFUNCTAB:
|
case CV_LeafKind_VFUNCTAB:
|
||||||
{
|
{
|
||||||
CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first;
|
CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first;
|
||||||
|
|
||||||
|
// rjf: bump next read pointer past header
|
||||||
|
next_read_ptr = (U8 *)(lf+1);
|
||||||
|
|
||||||
// NOTE(rjf): currently no-op this case
|
// NOTE(rjf): currently no-op this case
|
||||||
(void)lf;
|
(void)lf;
|
||||||
}break;
|
}break;
|
||||||
|
|||||||
Reference in New Issue
Block a user