22 Expected<std::string> readStreamData(BinaryStream &Stream,
uint64_t Limit) {
25 Result.reserve(DataLength);
26 while (Offset < DataLength) {
27 ArrayRef<uint8_t>
Data;
28 if (
auto E = Stream.readLongestContiguousChunk(Offset, Data))
30 Data =
Data.take_front(DataLength - Offset);
37 class NativeInjectedSource final :
public IPDBInjectedSource {
38 const SrcHeaderBlockEntry &Entry;
39 const PDBStringTable &Strings;
43 NativeInjectedSource(
const SrcHeaderBlockEntry &Entry,
44 PDBFile &File,
const PDBStringTable &Strings)
45 : Entry(Entry), Strings(Strings),
File(
File) {}
47 uint32_t getCrc32()
const override {
return Entry.CRC; }
48 uint64_t getCodeByteSize()
const override {
return Entry.FileSize; }
51 StringRef
Ret =
cantFail(Strings.getStringForID(Entry.FileNI),
52 "InjectedSourceStream should have rejected this");
53 return std::string(
Ret);
56 std::string getObjectFileName()
const override {
57 StringRef
Ret =
cantFail(Strings.getStringForID(Entry.ObjNI),
58 "InjectedSourceStream should have rejected this");
59 return std::string(
Ret);
62 std::string getVirtualFileName()
const override {
63 StringRef
Ret =
cantFail(Strings.getStringForID(Entry.VFileNI),
64 "InjectedSourceStream should have rejected this");
65 return std::string(
Ret);
68 uint32_t getCompression()
const override {
return Entry.Compression; }
70 std::string getCode()
const override {
73 cantFail(Strings.getStringForID(Entry.VFileNI),
74 "InjectedSourceStream should have rejected this");
75 std::string StreamName = (
"/src/files/" + VName).str();
80 auto ExpectedFileStream =
File.safelyCreateNamedStream(StreamName);
81 if (!ExpectedFileStream) {
83 return "(failed to open data stream)";
86 auto Data = readStreamData(**ExpectedFileStream, Entry.FileSize);
89 return "(failed to read data)";
100 : File(File), Stream(IJS), Strings(Strings), Cur(Stream.
begin()) {}
103 return static_cast<uint32_t>(Stream.size());
106 std::unique_ptr<IPDBInjectedSource>
110 return std::make_unique<NativeInjectedSource>(std::next(Stream.begin(),
N)->second,
115 if (Cur == Stream.end())
117 return std::make_unique<NativeInjectedSource>((Cur++)->second, File, Strings);