| File: Extensions\SymUnmanagedExtensions.Method.cs | Web Access |
| Project: src\symreader\src\Microsoft.DiaSymReader\Microsoft.DiaSymReader.csproj (Microsoft.DiaSymReader) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the License.txt file in the project root for more information. using System; using System.Collections.Generic; namespace Microsoft.DiaSymReader { using static InteropUtilities; partial class SymUnmanagedExtensions { public static ISymUnmanagedDocument[] GetDocumentsForMethod(this ISymUnmanagedMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } return NullToEmpty(GetItems((ISymEncUnmanagedMethod)method, (ISymEncUnmanagedMethod a, out int b) => a.GetDocumentsForMethodCount(out b), (ISymEncUnmanagedMethod a, int b, out int c, ISymUnmanagedDocument[] d) => a.GetDocumentsForMethod(b, out c, d))); } public static void GetSourceExtentInDocument(this ISymEncUnmanagedMethod method, ISymUnmanagedDocument document, out int startLine, out int endLine) { if (method == null) { throw new ArgumentNullException(nameof(method)); } ThrowExceptionForHR(method.GetSourceExtentInDocument(document, out startLine, out endLine)); } public static int GetToken(this ISymUnmanagedMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } ThrowExceptionForHR(method.GetToken(out int token)); return token; } public static int GetLocalSignatureToken(this ISymUnmanagedMethod2 method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } ThrowExceptionForHR(method.GetLocalSignatureToken(out int token)); return token; } public static ISymUnmanagedScope GetRootScope(this ISymUnmanagedMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } ThrowExceptionForHR(method.GetRootScope(out var scope)); return scope; } public static IEnumerable<SymUnmanagedSequencePoint> GetSequencePoints(this ISymUnmanagedMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } // NB: method.GetSequencePoints(0, out numAvailable, ...) always returns 0. int numAvailable; ThrowExceptionForHR(method.GetSequencePointCount(out numAvailable)); if (numAvailable == 0) { yield break; } 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; ThrowExceptionForHR(method.GetSequencePoints(numAvailable, out numRead, offsets, documents, startLines, startColumns, endLines, endColumns)); ValidateItems(numRead, offsets.Length); for (int i = 0; i < numRead; i++) { yield return new SymUnmanagedSequencePoint( offsets[i], documents[i], startLines[i], startColumns[i], endLines[i], endColumns[i]); } } public static ISymUnmanagedAsyncMethod AsAsyncMethod(this ISymUnmanagedMethod method) { var asyncMethod = method as ISymUnmanagedAsyncMethod; if (asyncMethod == null) { return null; } bool isAsyncMethod; ThrowExceptionForHR(asyncMethod.IsAsyncMethod(out isAsyncMethod)); if (!isAsyncMethod) { return null; } return asyncMethod; } public static int GetCatchHandlerILOffset(this ISymUnmanagedAsyncMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } bool hasCatchHandler; ThrowExceptionForHR(method.HasCatchHandlerILOffset(out hasCatchHandler)); if (!hasCatchHandler) { return -1; } int result; ThrowExceptionForHR(method.GetCatchHandlerILOffset(out result)); return result; } public static int GetKickoffMethod(this ISymUnmanagedAsyncMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } int result; ThrowExceptionForHR(method.GetKickoffMethod(out result)); return result; } public static IEnumerable<SymUnmanagedAsyncStepInfo> GetAsyncStepInfos(this ISymUnmanagedAsyncMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } int count; ThrowExceptionForHR(method.GetAsyncStepInfoCount(out count)); if (count == 0) { yield break; } var yieldOffsets = new int[count]; var breakpointOffsets = new int[count]; var breakpointMethods = new int[count]; ThrowExceptionForHR(method.GetAsyncStepInfo(count, out count, yieldOffsets, breakpointOffsets, breakpointMethods)); ValidateItems(count, yieldOffsets.Length); ValidateItems(count, breakpointOffsets.Length); ValidateItems(count, breakpointMethods.Length); for (int i = 0; i < count; i++) { yield return new SymUnmanagedAsyncStepInfo(yieldOffsets[i], breakpointOffsets[i], breakpointMethods[i]); } } } }