Browse Source

Fix #1523: Search throws EnumUnderlyingTypeResolverException

pull/1556/head
Siegfried Pammer 6 years ago
parent
commit
5a692610ff
  1. 21
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 2
      ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs
  3. 1
      ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

21
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -1406,27 +1406,6 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1406,27 +1406,6 @@ namespace ICSharpCode.Decompiler.CSharp
return false;
}
internal static bool IsFixedField(MetadataReader metadata, FieldDefinitionHandle handle, out IType type, out int elementCount)
{
type = null;
elementCount = 0;
var field = metadata.GetFieldDefinition(handle);
foreach (var h in field.GetCustomAttributes()) {
var customAttribute = metadata.GetCustomAttribute(h);
if (customAttribute.IsKnownAttribute(metadata, KnownAttribute.FixedBuffer)) {
var value = customAttribute.DecodeValue(MetadataExtensions.minimalCorlibTypeProvider);
if (value.FixedArguments.Length == 2) {
if (value.FixedArguments[0].Value is IType trr && value.FixedArguments[1].Value is int length) {
type = trr;
elementCount = length;
return true;
}
}
}
}
return false;
}
EntityDeclaration DoDecompile(IProperty property, DecompileRun decompileRun, ITypeResolveContext decompilationContext)
{
Debug.Assert(decompilationContext.CurrentMember == property);

2
ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs

@ -137,7 +137,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor @@ -137,7 +137,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
writer.Space();
writer.WriteToken(Roles.Colon, ":");
writer.Space();
if (symbol is IField f && CSharpDecompiler.IsFixedField(f.ParentModule.PEFile.Metadata, (System.Reflection.Metadata.FieldDefinitionHandle)f.MetadataToken, out var type, out int elementCount)) {
if (symbol is IField f && CSharpDecompiler.IsFixedField(f, out var type, out int elementCount)) {
rt = astBuilder.ConvertType(type);
new IndexerExpression(new TypeReferenceExpression(rt), astBuilder.ConvertConstantValue(f.Compilation.FindType(KnownTypeCode.Int32), elementCount))
.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));

1
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

@ -131,7 +131,6 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -131,7 +131,6 @@ namespace ICSharpCode.Decompiler.TypeSystem
public IType GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind)
{
var asmref = handle.GetDeclaringModule(reader);
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));

Loading…
Cancel
Save