Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/System.Private.StackTraceMetadata')
-rw-r--r--src/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs66
1 files changed, 62 insertions, 4 deletions
diff --git a/src/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs b/src/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs
index 2a71373f1..f2c65a842 100644
--- a/src/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs
+++ b/src/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs
@@ -54,6 +54,10 @@ namespace Internal.StackTraceMetadata
case HandleType.MethodInstantiation:
EmitMethodInstantiationName(methodHandle.ToMethodInstantiationHandle(_metadataReader));
break;
+
+ case HandleType.QualifiedMethod:
+ EmitMethodDefinitionName(methodHandle.ToQualifiedMethodHandle(_metadataReader));
+ break;
default:
Debug.Assert(false);
@@ -88,6 +92,19 @@ namespace Internal.StackTraceMetadata
EmitGenericArguments(methodInst.GenericTypeArguments);
EmitMethodParameters(methodSignature);
}
+
+ private void EmitMethodDefinitionName(QualifiedMethodHandle qualifiedMethodHandle)
+ {
+ QualifiedMethod qualifiedMethod = _metadataReader.GetQualifiedMethod(qualifiedMethodHandle);
+ Method method = _metadataReader.GetMethod(qualifiedMethod.Method);
+ MethodSignature methodSignature = _metadataReader.GetMethodSignature(method.Signature);
+ EmitTypeName(methodSignature.ReturnType, namespaceQualified: false);
+ _outputBuilder.Append(' ');
+ EmitTypeName(qualifiedMethod.EnclosingType, namespaceQualified: true);
+ _outputBuilder.Append('.');
+ EmitString(method.Name);
+ EmitMethodParameters(methodSignature);
+ }
/// <summary>
/// Emit containing type and method name and extract the method signature from a method reference.
@@ -172,6 +189,10 @@ namespace Internal.StackTraceMetadata
case HandleType.ByReferenceSignature:
EmitByRefTypeName(typeHandle.ToByReferenceSignatureHandle(_metadataReader));
break;
+
+ case HandleType.TypeDefinition:
+ EmitTypeDefinitionName(typeHandle.ToTypeDefinitionHandle(_metadataReader), namespaceQualified);
+ break;
default:
Debug.Assert(false);
@@ -190,12 +211,28 @@ namespace Internal.StackTraceMetadata
if (!namespaceRef.ParentScopeOrNamespace.IsNull(_metadataReader) &&
namespaceRef.ParentScopeOrNamespace.HandleType == HandleType.NamespaceReference)
{
+ int charsWritten = _outputBuilder.Length;
EmitNamespaceReferenceName(namespaceRef.ParentScopeOrNamespace.ToNamespaceReferenceHandle(_metadataReader));
- _outputBuilder.Append('.');
+ if (_outputBuilder.Length - charsWritten > 0)
+ _outputBuilder.Append('.');
}
EmitString(namespaceRef.Name);
}
-
+
+ private void EmitNamespaceDefinitionName(NamespaceDefinitionHandle namespaceDefHandle)
+ {
+ NamespaceDefinition namespaceDef = _metadataReader.GetNamespaceDefinition(namespaceDefHandle);
+ if (!namespaceDef.ParentScopeOrNamespace.IsNull(_metadataReader) &&
+ namespaceDef.ParentScopeOrNamespace.HandleType == HandleType.NamespaceDefinition)
+ {
+ int charsWritten = _outputBuilder.Length;
+ EmitNamespaceDefinitionName(namespaceDef.ParentScopeOrNamespace.ToNamespaceDefinitionHandle(_metadataReader));
+ if (_outputBuilder.Length - charsWritten > 0)
+ _outputBuilder.Append('.');
+ }
+ EmitString(namespaceDef.Name);
+ }
+
/// <summary>
/// Emit type reference.
/// </summary>
@@ -214,13 +251,34 @@ namespace Internal.StackTraceMetadata
}
else if (namespaceQualified)
{
+ int charsWritten = _outputBuilder.Length;
EmitNamespaceReferenceName(typeRef.ParentNamespaceOrType.ToNamespaceReferenceHandle(_metadataReader));
- _outputBuilder.Append('.');
+ if (_outputBuilder.Length - charsWritten > 0)
+ _outputBuilder.Append('.');
}
}
EmitString(typeRef.TypeName);
}
-
+
+ private void EmitTypeDefinitionName(TypeDefinitionHandle typeDefHandle, bool namespaceQualified)
+ {
+ TypeDefinition typeDef = _metadataReader.GetTypeDefinition(typeDefHandle);
+ if (!typeDef.EnclosingType.IsNull(_metadataReader))
+ {
+ // Nested type
+ EmitTypeName(typeDef.EnclosingType, namespaceQualified);
+ _outputBuilder.Append('+');
+ }
+ else if (namespaceQualified)
+ {
+ int charsWritten = _outputBuilder.Length;
+ EmitNamespaceDefinitionName(typeDef.NamespaceDefinition);
+ if (_outputBuilder.Length - charsWritten > 0)
+ _outputBuilder.Append('.');
+ }
+ EmitString(typeDef.Name);
+ }
+
/// <summary>
/// Emit an arbitrary type specification.
/// </summary>