| 1481 | |
| 1482 | |
| 1483 | void DebuggerController::DefineVariablesRecursive(uint64_t address, Confidence<Ref<Type>> type) |
| 1484 | { |
| 1485 | size_t addressSize = m_liveView->GetAddressSize(); |
| 1486 | if (type->IsPointer()) |
| 1487 | { |
| 1488 | auto reader = BinaryReader(m_liveView); |
| 1489 | reader.Seek(address); |
| 1490 | uint64_t targetAddress = 0; |
| 1491 | bool readOk = false; |
| 1492 | if (addressSize == 8) |
| 1493 | { |
| 1494 | readOk = reader.TryRead64(targetAddress); |
| 1495 | } |
| 1496 | else if (addressSize == 4) |
| 1497 | { |
| 1498 | uint32_t addr; |
| 1499 | readOk = reader.TryRead32(addr); |
| 1500 | if (readOk) |
| 1501 | targetAddress = addr; |
| 1502 | } |
| 1503 | if (readOk) |
| 1504 | { |
| 1505 | // Define a data variable for the child |
| 1506 | ProcessOneVariable(targetAddress, type->GetChildType(), ""); |
| 1507 | // Recurse into the child |
| 1508 | DefineVariablesRecursive(targetAddress, type->GetChildType()); |
| 1509 | } |
| 1510 | } |
| 1511 | else if (type->IsStructure()) |
| 1512 | { |
| 1513 | auto structure = type->GetStructure(); |
| 1514 | auto members = structure->GetMembers(); |
| 1515 | auto memberType = type->GetChildType(); |
| 1516 | for (size_t i = 0; i < members.size(); i++) |
| 1517 | { |
| 1518 | uint64_t memberOffset = address + members[i].offset; |
| 1519 | DefineVariablesRecursive(memberOffset, members[i].type); |
| 1520 | } |
| 1521 | } |
| 1522 | else if (type->IsArray()) |
| 1523 | { |
| 1524 | auto memberType = type->GetChildType(); |
| 1525 | for (size_t i = 0; i < type->GetElementCount(); i++) |
| 1526 | { |
| 1527 | uint64_t memberOffset = address + i * memberType->GetWidth(); |
| 1528 | DefineVariablesRecursive(memberOffset, memberType); |
| 1529 | } |
| 1530 | } |
| 1531 | } |
| 1532 | |
| 1533 | |
| 1534 | void DebuggerController::UpdateStackVariables() |