Skip to content

Commit b20d4df

Browse files
Fix #1231: System.BadImageFormatException: Invalid coded index
1 parent af594e4 commit b20d4df

4 files changed

Lines changed: 26 additions & 11 deletions

File tree

ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,13 +1274,15 @@ public void DisassembleType(PEFile module, TypeDefinitionHandle type)
12741274
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType);
12751275
output.WriteLine();
12761276

1277-
if (!typeDefinition.BaseType.IsNil) {
1277+
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
1278+
if (!baseType.IsNil) {
12781279
output.Indent();
12791280
output.Write("extends ");
1280-
typeDefinition.BaseType.WriteTo(module, output, genericContext, ILNameSyntax.TypeName);
1281+
baseType.WriteTo(module, output, genericContext, ILNameSyntax.TypeName);
12811282
output.WriteLine();
12821283
output.Unindent();
12831284
}
1285+
12841286
var interfaces = typeDefinition.GetInterfaceImplementations();
12851287
if (interfaces.Count > 0) {
12861288
output.Indent();

ICSharpCode.Decompiler/SRMExtensions.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static bool IsValueType(this TypeDefinitionHandle handle, MetadataReader
3131

3232
public static bool IsValueType(this TypeDefinition typeDefinition, MetadataReader reader)
3333
{
34-
var baseType = typeDefinition.BaseType;
34+
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
3535
if (baseType.IsNil)
3636
return false;
3737
if (baseType.IsKnownType(reader, KnownTypeCode.Enum))
@@ -49,9 +49,10 @@ public static bool IsEnum(this TypeDefinitionHandle handle, MetadataReader reade
4949

5050
public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader)
5151
{
52-
if (typeDefinition.BaseType.IsNil)
52+
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
53+
if (baseType.IsNil)
5354
return false;
54-
return typeDefinition.BaseType.IsKnownType(reader, KnownTypeCode.Enum);
55+
return baseType.IsKnownType(reader, KnownTypeCode.Enum);
5556
}
5657

5758
public static bool IsEnum(this TypeDefinitionHandle handle, MetadataReader reader, out PrimitiveTypeCode underlyingType)
@@ -62,9 +63,10 @@ public static bool IsEnum(this TypeDefinitionHandle handle, MetadataReader reade
6263
public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader, out PrimitiveTypeCode underlyingType)
6364
{
6465
underlyingType = 0;
65-
if (typeDefinition.BaseType.IsNil)
66+
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
67+
if (baseType.IsNil)
6668
return false;
67-
if (!typeDefinition.BaseType.IsKnownType(reader, KnownTypeCode.Enum))
69+
if (!baseType.IsKnownType(reader, KnownTypeCode.Enum))
6870
return false;
6971
var field = reader.GetFieldDefinition(typeDefinition.GetFields().First());
7072
var blob = reader.GetBlobReader(field.Signature);
@@ -81,7 +83,7 @@ public static bool IsDelegate(this TypeDefinitionHandle handle, MetadataReader r
8183

8284
public static bool IsDelegate(this TypeDefinition typeDefinition, MetadataReader reader)
8385
{
84-
var baseType = typeDefinition.BaseType;
86+
var baseType = typeDefinition.GetBaseTypeOrNil();
8587
return !baseType.IsNil && baseType.IsKnownType(reader, KnownTypeCode.MulticastDelegate);
8688
}
8789

@@ -411,5 +413,14 @@ public int GetTypeFromSpecification(MetadataReader reader, GenericContext generi
411413
return reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext);
412414
}
413415
}
416+
417+
public static EntityHandle GetBaseTypeOrNil(this TypeDefinition definition)
418+
{
419+
try {
420+
return definition.BaseType;
421+
} catch (BadImageFormatException) {
422+
return default;
423+
}
424+
}
414425
}
415426
}

ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,9 @@ public IEnumerable<IType> DirectBaseTypes {
270270
var context = new GenericContext(TypeParameters);
271271
var interfaceImplCollection = td.GetInterfaceImplementations();
272272
baseTypes = new List<IType>(1 + interfaceImplCollection.Count);
273-
if (!td.BaseType.IsNil) {
274-
baseTypes.Add(module.ResolveType(td.BaseType, context));
273+
EntityHandle baseType = td.GetBaseTypeOrNil();
274+
if (!baseType.IsNil) {
275+
baseTypes.Add(module.ResolveType(baseType, context));
275276
} else if (Kind == TypeKind.Interface) {
276277
// td.BaseType.IsNil is always true for interfaces,
277278
// but the type system expects every interface to derive from System.Object as well.

ILSpy/TreeNodes/DerivedTypesTreeNode.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ internal static IEnumerable<DerivedTypesEntryNode> FindDerivedTypes(AssemblyList
7676
if (IsSameType(metadata, ifaceImpl.Interface, definitionMetadata, metadataToken))
7777
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
7878
}
79-
if (!td.BaseType.IsNil && IsSameType(metadata, td.BaseType, definitionMetadata, metadataToken)) {
79+
SRM.EntityHandle baseType = td.GetBaseTypeOrNil();
80+
if (!baseType.IsNil && IsSameType(metadata, baseType, definitionMetadata, metadataToken)) {
8081
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
8182
}
8283
}

0 commit comments

Comments
 (0)