Ejemplo n.º 1
0
        /// <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);
            });
        }
Ejemplo n.º 2
0
        /// <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);
            });
        }