| 782 | } |
| 783 | |
| 784 | void ObjCProcessor::ReadListOfMethodLists(ObjCReader* reader, ClassBase& cls, std::string_view name, view_ptr_t start) |
| 785 | { |
| 786 | reader->Seek(start); |
| 787 | method_list_t head; |
| 788 | head.entsizeAndFlags = reader->Read32(); |
| 789 | head.count = reader->Read32(); |
| 790 | |
| 791 | if (head.count > 0x1000) |
| 792 | { |
| 793 | m_logger->LogError("List of method lists at 0x%llx has an invalid count of 0x%x", start, head.count); |
| 794 | return; |
| 795 | } |
| 796 | |
| 797 | for (size_t i = 0; i < head.count; ++i) { |
| 798 | relative_list_list_entry_t list_entry; |
| 799 | reader->Read(&list_entry, sizeof(list_entry)); |
| 800 | |
| 801 | ReadMethodList(reader, cls, name, reader->GetOffset() - sizeof(list_entry) + list_entry.listOffset); |
| 802 | // Reset the cursor to immediately past the list entry. |
| 803 | reader->Seek(start + sizeof(method_list_t) + ((i + 1) * sizeof(relative_list_list_entry_t))); |
| 804 | } |
| 805 | } |
| 806 | |
| 807 | void ObjCProcessor::ReadMethodList(ObjCReader* reader, ClassBase& cls, std::string_view name, view_ptr_t start) |
| 808 | { |