private GuidStream GetGuidStream(FileChecksumSubsection checksum, PdbStringTable namesStream, PdbFile pdb) { string name = namesStream.Dictionary[checksum.NameIndex]; int guidStreamIndex; if (pdb.InfoStream.NamedStreamMap.Streams.TryGetValue("/src/files/" + name, out guidStreamIndex) || pdb.InfoStream.NamedStreamMap.StreamsUppercase.TryGetValue("/SRC/FILES/" + name.ToUpperInvariant(), out guidStreamIndex)) { return(new GuidStream(pdb.Streams[guidStreamIndex])); } return(null); }
/// <summary> /// Reads debug subsections from references for the specified index. /// </summary> /// <param name="index">Index of the debug subsection.</param> private DebugSubsection GetDebugSubsection(int index) { // Since DictionaryCache is allowing only single thread to call this function, we don't need to lock reader here. DebugSubsectionReference reference = references[index]; Reader.Position = reference.DataOffset; switch (reference.Kind) { case DebugSubsectionKind.Lines: return(LinesSubsection.Read(Reader, reference.Kind, reference.DataLen)); case DebugSubsectionKind.FileChecksums: return(FileChecksumSubsection.Read(Reader, reference.Kind)); default: #if DEBUG throw new NotImplementedException($"Unknown reference kind: {reference.Kind}"); #else return(null); #endif } }
/// <summary> /// Initializes a new instance of the <see cref="PdbSource"/> class. /// </summary> /// <param name="pdbFile">Portable PDB file reader.</param> /// <param name="checksum">File checksum subsection.</param> internal PdbSource(PdbFile pdbFile, FileChecksumSubsection checksum) { PdbFile = pdbFile; Checksum = checksum; hashCache = SimpleCache.CreateStruct(() => GuidStream?.ChecksumReader.ReadAllBytes() ?? Checksum.HashReader.ReadAllBytes()); nameCache = SimpleCache.CreateStruct(() => PdbFile.NamesStream.Dictionary[checksum.NameIndex]); guidStreamCache = SimpleCache.CreateStruct(() => { int guidStreamIndex; if (PdbFile.Reader.InfoStream.NamedStreamMap.Streams.TryGetValue("/src/files/" + Name, out guidStreamIndex) || PdbFile.Reader.InfoStream.NamedStreamMap.StreamsUppercase.TryGetValue("/SRC/FILES/" + Name.ToUpperInvariant(), out guidStreamIndex)) { PdbStream guidStream = PdbFile.Reader.GetStream(guidStreamIndex); if (guidStream != null) { return(new GuidStream(guidStream)); } } return(null); }); }
internal PdbSource this[FileChecksumSubsection checksum] => sourcesCache[checksum];