internal static ImmutableArray <SymUnmanagedSequencePoint> GetSequencePoints(this ISymUnmanagedMethod method)
        {
            // NB: method.GetSequencePoints(0, out numAvailable, ...) always returns 0.
            int numAvailable;
            int hr = method.GetSequencePointCount(out numAvailable);

            SymUnmanagedReaderExtensions.ThrowExceptionForHR(hr);
            if (numAvailable == 0)
            {
                return(ImmutableArray <SymUnmanagedSequencePoint> .Empty);
            }

            int[] offsets = new int[numAvailable];
            ISymUnmanagedDocument[] documents = new ISymUnmanagedDocument[numAvailable];
            int[] startLines   = new int[numAvailable];
            int[] startColumns = new int[numAvailable];
            int[] endLines     = new int[numAvailable];
            int[] endColumns   = new int[numAvailable];

            int numRead;

            hr = method.GetSequencePoints(numAvailable, out numRead, offsets, documents, startLines, startColumns, endLines, endColumns);
            SymUnmanagedReaderExtensions.ThrowExceptionForHR(hr);
            if (numRead != numAvailable)
            {
                throw new InvalidOperationException($"Read only {numRead} of {numAvailable} sequence points.");
            }

            var builder = ArrayBuilder <SymUnmanagedSequencePoint> .GetInstance(numRead);

            for (int i = 0; i < numRead; i++)
            {
                builder.Add(new SymUnmanagedSequencePoint(
                                offsets[i],
                                documents[i],
                                startLines[i],
                                startColumns[i],
                                endLines[i],
                                endColumns[i]));
            }

            return(builder.ToImmutableAndFree());
        }
Ejemplo n.º 2
0
        public static ISymUnmanagedReader CreateReader(Stream pdbStream, object metadataImporter)
        {
            pdbStream.Position = 0;
            bool isPortable = pdbStream.ReadByte() == 'B' && pdbStream.ReadByte() == 'S' && pdbStream.ReadByte() == 'J' && pdbStream.ReadByte() == 'B';

            pdbStream.Position = 0;

            if (isPortable)
            {
                return(new PortablePdb.SymReader(new PortablePdb.PortablePdbReader(pdbStream, metadataImporter)));
            }
            else
            {
                // NOTE: The product uses a different GUID (Microsoft.CodeAnalysis.ExpressionEvaluator.DkmUtilities.s_symUnmanagedReaderClassId).
                Guid corSymReaderSxS = new Guid("0A3976C5-4529-4ef8-B0B0-42EED37082CD");
                var  reader          = (ISymUnmanagedReader)Activator.CreateInstance(Type.GetTypeFromCLSID(corSymReaderSxS));
                int  hr = reader.Initialize(metadataImporter, null, null, new ComStreamWrapper(pdbStream));
                SymUnmanagedReaderExtensions.ThrowExceptionForHR(hr);
                return(reader);
            }
        }