| 182 | } |
| 183 | |
| 184 | int PointerScanModel::saveChains(const std::string& file) |
| 185 | { |
| 186 | std::ofstream ofs(file, std::ios::binary | std::ios::trunc); |
| 187 | |
| 188 | if (!ofs) return -1; |
| 189 | |
| 190 | /* Save pointer size first, so that we don't read garbage data */ |
| 191 | int ptr_size = sizeof(uintptr_t); |
| 192 | ofs.write(reinterpret_cast<char*>(&ptr_size), sizeof(ptr_size)); |
| 193 | |
| 194 | for (const auto& chain : pointer_chains) { |
| 195 | ofs.write(reinterpret_cast<const char*>(&chain.first), sizeof(chain.first)); |
| 196 | int size = static_cast<int>(chain.second.size()); |
| 197 | ofs.write(reinterpret_cast<char*>(&size), sizeof(size)); |
| 198 | ofs.write(reinterpret_cast<const char*>(chain.second.data()), size*sizeof(int)); |
| 199 | } |
| 200 | |
| 201 | return 0; |
| 202 | } |
| 203 | |
| 204 | int PointerScanModel::loadChains(const std::string& file) |
| 205 | { |