Browse Source

Avoid constructing a GetClassTypeReference instance in TypeProvider.GetTypeFromReference.

pull/2113/head
Daniel Grunwald 5 years ago
parent
commit
1751c9922c
  1. 7
      ICSharpCode.Decompiler/TypeSystem/Implementation/GetClassTypeReference.cs
  2. 13
      ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

7
ICSharpCode.Decompiler/TypeSystem/Implementation/GetClassTypeReference.cs

@ -84,9 +84,8 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -84,9 +84,8 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
/// </summary>
public FullTypeName FullTypeName { get { return fullTypeName; } }
IType ResolveInAllAssemblies(ITypeResolveContext context)
internal static IType ResolveInAllAssemblies(ICompilation compilation, in FullTypeName fullTypeName)
{
var compilation = context.Compilation;
foreach (var asm in compilation.Modules) {
IType type = asm.GetTypeDefinition(fullTypeName);
if (type != null)
@ -107,7 +106,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -107,7 +106,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
type = context.CurrentModule.GetTypeDefinition(fullTypeName);
}
if (type == null) {
type = ResolveInAllAssemblies(context);
type = ResolveInAllAssemblies(context.Compilation, in fullTypeName);
}
} else {
// Assembly specified: only look in the specified assembly.
@ -118,7 +117,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -118,7 +117,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
if (asm != null) {
type = asm.GetTypeDefinition(fullTypeName);
} else {
type = ResolveInAllAssemblies(context);
type = ResolveInAllAssemblies(context.Compilation, in fullTypeName);
}
}
return type ?? new UnknownType(fullTypeName, isReferenceType);

13
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

@ -131,9 +131,16 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -131,9 +131,16 @@ namespace ICSharpCode.Decompiler.TypeSystem
public IType GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind)
{
bool? isReferenceType = IsReferenceType(reader, handle, rawTypeKind);
var gctr = new GetClassTypeReference(handle.GetFullTypeName(reader), handle.GetDeclaringModule(reader), isReferenceType);
return gctr.Resolve(module != null ? new SimpleTypeResolveContext(module) : new SimpleTypeResolveContext(compilation));
IModuleReference moduleReference = handle.GetDeclaringModule(reader);
IModule resolvedModule = moduleReference.Resolve(module != null ? new SimpleTypeResolveContext(module) : new SimpleTypeResolveContext(compilation));
var fullTypeName = handle.GetFullTypeName(reader);
IType type;
if (resolvedModule != null) {
type = resolvedModule.GetTypeDefinition(fullTypeName);
} else {
type = GetClassTypeReference.ResolveInAllAssemblies(compilation, in fullTypeName);
}
return type ?? new UnknownType(fullTypeName, IsReferenceType(reader, handle, rawTypeKind));
}
public IType GetTypeFromSerializedName(string name)

Loading…
Cancel
Save