/// <summary> /// Initializes a new instance of the <see cref="PdbFunction"/> class. /// </summary> /// <param name="pdbFile">Portable PDB file reader.</param> /// <param name="procedure">Managed procedure symbol from PDB.</param> /// <param name="dbiModule">DBI module descriptor from PDB.</param> internal PdbFunction(PdbFile pdbFile, ManagedProcedureSymbol procedure, DbiModuleDescriptor dbiModule) { PdbFile = pdbFile; Procedure = procedure; DbiModule = dbiModule; localScopesCache = SimpleCache.CreateStruct(() => { IEnumerable <BlockSymbol> blocks = Procedure.Children.OfType <BlockSymbol>(); int count = blocks.Count(); IPdbLocalScope[] scopes = new IPdbLocalScope[count]; int i = 0; foreach (BlockSymbol block in blocks) { scopes[i++] = new PdbLocalScope(this, block); } return(scopes); }); sequencePointsCache = SimpleCache.CreateStruct(() => { var checksums = DbiModule.DebugSubsectionStream[DebugSubsectionKind.FileChecksums]; var linesSubsections = dbiModule.DebugSubsectionStream[DebugSubsectionKind.Lines]; List <IPdbSequencePoint> sequencePoints = new List <IPdbSequencePoint>(); foreach (LinesSubsection linesSubsection in linesSubsections) { foreach (var file in linesSubsection.Files) { var checksum = (FileChecksumSubsection)checksums[file.Index]; var source = PdbFile[checksum]; foreach (var line in file.Lines) { sequencePoints.Add(new PdbSequencePoint(this, source, line)); } } } return(sequencePoints); }); }
/// <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); }); }