Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;

Expand Down Expand Up @@ -49,7 +47,6 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
MethodNameFormatter formatter = new MethodNameFormatter(metadataReader, SigTypeContext.FromMethod(metadataReader, enclosingTypeHandle, methodHandle));

Method method = metadataReader.GetMethod(methodHandle);
MethodSignature methodSignature = metadataReader.GetMethodSignature(method.Signature);
formatter.EmitTypeName(enclosingTypeHandle, namespaceQualified: true);
formatter._outputBuilder.Append('.');
formatter.EmitString(method.Name);
Expand All @@ -64,7 +61,7 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
}
else
{
formatter._outputBuilder.Append(", ");
formatter._outputBuilder.Append(',');
}
formatter.EmitTypeName(handle, namespaceQualified: false);
}
Expand All @@ -73,7 +70,7 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
formatter._outputBuilder.Append(']');
}

formatter.EmitMethodParameters(methodSignature);
formatter.EmitMethodParameters(methodHandle);

return formatter._outputBuilder.ToString();
}
Expand Down Expand Up @@ -124,28 +121,30 @@ private void EmitMethodReferenceName(MemberReferenceHandle memberRefHandle)
private void EmitMethodInstantiationName(MethodInstantiationHandle methodInstHandle)
{
MethodInstantiation methodInst = _metadataReader.GetMethodInstantiation(methodInstHandle);
MethodSignature methodSignature;

if (methodInst.Method.HandleType == HandleType.MemberReference)
{
MemberReferenceHandle methodRefHandle = methodInst.Method.ToMemberReferenceHandle(_metadataReader);
MemberReference methodRef = methodRefHandle.GetMemberReference(_metadataReader);
EmitContainingTypeAndMethodName(methodRef, out methodSignature);
EmitContainingTypeAndMethodName(methodRef, out MethodSignature methodSignature);
EmitGenericArguments(methodInst.GenericTypeArguments);
EmitMethodParameters(methodSignature);
}
else
{
QualifiedMethodHandle qualifiedMethodHandle = methodInst.Method.ToQualifiedMethodHandle(_metadataReader);
QualifiedMethod qualifiedMethod = _metadataReader.GetQualifiedMethod(qualifiedMethodHandle);
EmitContainingTypeAndMethodName(qualifiedMethod, out methodSignature);
EmitContainingTypeAndMethodName(qualifiedMethod);
EmitGenericArguments(methodInst.GenericTypeArguments);
EmitMethodParameters(qualifiedMethod.Method);
}
EmitGenericArguments(methodInst.GenericTypeArguments);
EmitMethodParameters(methodSignature);
}

private void EmitMethodDefinitionName(QualifiedMethodHandle qualifiedMethodHandle)
{
QualifiedMethod qualifiedMethod = _metadataReader.GetQualifiedMethod(qualifiedMethodHandle);
EmitContainingTypeAndMethodName(qualifiedMethod, out MethodSignature methodSignature);
EmitMethodParameters(methodSignature);
EmitContainingTypeAndMethodName(qualifiedMethod);
EmitMethodParameters(qualifiedMethod.Method);
}

/// <summary>
Expand All @@ -161,10 +160,9 @@ private void EmitContainingTypeAndMethodName(MemberReference methodRef, out Meth
EmitString(methodRef.Name);
}

private void EmitContainingTypeAndMethodName(QualifiedMethod qualifiedMethod, out MethodSignature methodSignature)
private void EmitContainingTypeAndMethodName(QualifiedMethod qualifiedMethod)
{
Method method = _metadataReader.GetMethod(qualifiedMethod.Method);
methodSignature = _metadataReader.GetMethodSignature(method.Signature);
EmitTypeName(qualifiedMethod.EnclosingType, namespaceQualified: true);
_outputBuilder.Append('.');
EmitString(method.Name);
Expand All @@ -181,6 +179,57 @@ private void EmitMethodParameters(MethodSignature methodSignature)
_outputBuilder.Append(')');
}

/// <summary>
/// Emit parenthesized method argument type list with parameter names.
/// </summary>
/// <param name="methodHandle">Method handle to use for parameter formatting</param>
private void EmitMethodParameters(MethodHandle methodHandle)
{
bool TryGetNextParameter(ref ParameterHandleCollection.Enumerator enumerator, out Parameter parameter)
{
bool hasNext = enumerator.MoveNext();
parameter = hasNext ? enumerator.Current.GetParameter(_metadataReader) : default;
return hasNext;
}

Method method = methodHandle.GetMethod(_metadataReader);
HandleCollection typeVector = method.Signature.GetMethodSignature(_metadataReader).Parameters;
ParameterHandleCollection.Enumerator parameters = method.Parameters.GetEnumerator();

bool hasParameter = TryGetNextParameter(ref parameters, out Parameter parameter);
if (hasParameter && parameter.Sequence == 0)
{
hasParameter = TryGetNextParameter(ref parameters, out parameter);
}

_outputBuilder.Append('(');

uint typeIndex = 0;
foreach (Handle type in typeVector)
{
if (typeIndex != 0)
{
_outputBuilder.Append(", ");
}

EmitTypeName(type, namespaceQualified: false);

if (++typeIndex == parameter.Sequence && hasParameter)
{
string name = parameter.Name.GetConstantStringValue(_metadataReader).Value;
hasParameter = TryGetNextParameter(ref parameters, out parameter);

if (!string.IsNullOrEmpty(name))
{
_outputBuilder.Append(' ');
_outputBuilder.Append(name);
}
}
}

_outputBuilder.Append(')');
}

/// <summary>
/// Emit comma-separated list of type names into the output string builder.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ public class EnvironmentStackTrace
static string s_stackTrace;

[Fact]
[ActiveIssue("https://github.com/dotnet/runtime/issues/73051", typeof(PlatformDetection), nameof(PlatformDetection.IsNativeAot))]
[ActiveIssue("https://github.com/mono/mono/issues/15315", TestRuntimes.Mono)]
public void StackTraceTest()
{
Expand Down