diff --git a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs index cc5dd065dac28b..ebfbab7a8e2c02 100644 --- a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs +++ b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs @@ -255,8 +255,12 @@ private void EmitTypeName(Handle typeHandle, bool namespaceQualified) EmitString(typeHandle.ToGenericParameterHandle(_metadataReader).GetGenericParameter(_metadataReader).Name); break; + case HandleType.FunctionPointerSignature: + EmitFunctionPointerTypeName(); + break; + default: - Debug.Assert(false); + Debug.Assert(false, $"Type handle {typeHandle.HandleType} was not handled"); _outputBuilder.Append("???"); break; } @@ -407,6 +411,14 @@ private void EmitPointerTypeName(PointerSignatureHandle pointerSigHandle) _outputBuilder.Append('*'); } + /// + /// Emit function pointer type. + /// + private void EmitFunctionPointerTypeName() + { + _outputBuilder.Append("IntPtr"); + } + /// /// Emit by-reference type. /// diff --git a/src/libraries/System.Diagnostics.StackTrace/tests/StackTraceTests.cs b/src/libraries/System.Diagnostics.StackTrace/tests/StackTraceTests.cs index 801a328dc8b1bd..604a34dc8cd2a1 100644 --- a/src/libraries/System.Diagnostics.StackTrace/tests/StackTraceTests.cs +++ b/src/libraries/System.Diagnostics.StackTrace/tests/StackTraceTests.cs @@ -312,6 +312,15 @@ public void ToString_NullFrame_ThrowsNullReferenceException() Assert.Equal(Environment.NewLine, stackTrace.ToString()); } + [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/11354", TestRuntimes.Mono)] + public unsafe void ToString_FunctionPointerSignature() + { + // This is sepate from ToString_Invoke_ReturnsExpected since unsafe cannot be used for iterators + var stackTrace = FunctionPointerParameter(null); + Assert.Contains("System.Diagnostics.Tests.StackTraceTests.FunctionPointerParameter(IntPtr x)", stackTrace.ToString()); + } + [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] public void ToString_ShowILOffset() { @@ -384,6 +393,9 @@ public void ToString_ShowILOffset() [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] private static StackTrace TwoParameters(int x, string y) => new StackTrace(); + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + private unsafe static StackTrace FunctionPointerParameter(delegate* x) => new StackTrace(); + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] private static StackTrace Generic() => new StackTrace(); [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] diff --git a/src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csproj b/src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csproj index d6d002664cfef3..aec1d927639468 100644 --- a/src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csproj +++ b/src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csproj @@ -3,6 +3,7 @@ $(NetCoreAppCurrent) true true + true true