| 498 | |
| 499 | |
| 500 | void PseudoRustFunction::AppendFieldTextTokens(const HighLevelILInstruction& var, uint64_t offset, |
| 501 | size_t memberIndex, size_t size, HighLevelILTokenEmitter& tokens, bool deref) |
| 502 | { |
| 503 | const auto type = GetFieldType(var, deref); |
| 504 | const auto fieldDisplayType = GetFieldDisplayType(type, offset, memberIndex, deref); |
| 505 | switch (fieldDisplayType) |
| 506 | { |
| 507 | case FieldDisplayName: |
| 508 | { |
| 509 | std::optional<size_t> memberIndexHint; |
| 510 | if (memberIndex != BN_INVALID_EXPR) |
| 511 | memberIndexHint = memberIndex; |
| 512 | |
| 513 | if (type->GetStructure()->ResolveMemberOrBaseMember(GetFunction()->GetView(), offset, 0, |
| 514 | [&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset, |
| 515 | uint64_t adjustedOffset, const StructureMember& member) { |
| 516 | tokens.Append(OperationToken, "."); |
| 517 | |
| 518 | vector<string> nameList {member.name}; |
| 519 | HighLevelILTokenEmitter::AddNamesForOuterStructureMembers( |
| 520 | GetFunction()->GetView(), type, var, nameList); |
| 521 | |
| 522 | tokens.Append(FieldNameToken, member.name, structOffset + member.offset, 0, 0, |
| 523 | BN_FULL_CONFIDENCE, nameList); |
| 524 | }), |
| 525 | memberIndexHint) |
| 526 | return; |
| 527 | |
| 528 | // Part of structure but no defined field, use __offset syntax |
| 529 | tokens.Append(OperationToken, "."); |
| 530 | char offsetStr[64]; |
| 531 | snprintf( |
| 532 | offsetStr, sizeof(offsetStr), "__offset(0x%" PRIx64 ")%s", offset, Type::GetSizeSuffix(size).c_str()); |
| 533 | |
| 534 | vector<string> nameList {offsetStr}; |
| 535 | HighLevelILTokenEmitter::AddNamesForOuterStructureMembers(GetFunction()->GetView(), type, var, nameList); |
| 536 | |
| 537 | tokens.Append(StructOffsetToken, offsetStr, offset, size, 0, BN_FULL_CONFIDENCE, nameList); |
| 538 | return; |
| 539 | } |
| 540 | |
| 541 | case FieldDisplayOffset: |
| 542 | { |
| 543 | /* this is handled before the display */ |
| 544 | return; |
| 545 | } |
| 546 | |
| 547 | case FieldDisplayMemberOffset: |
| 548 | { |
| 549 | tokens.AppendOpenBracket(); |
| 550 | tokens.AppendIntegerTextToken(var, offset, size); |
| 551 | tokens.AppendCloseBracket(); |
| 552 | return; |
| 553 | } |
| 554 | |
| 555 | default: break; |
| 556 | } |
| 557 | } |
nothing calls this directly
no test coverage detected