Browse Source

Fix #1231: System.BadImageFormatException: Invalid coded index

pull/1218/merge
Siegfried Pammer 8 years ago
parent
commit
b20d4df95b
  1. 6
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 23
      ICSharpCode.Decompiler/SRMExtensions.cs
  3. 5
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs
  4. 3
      ILSpy/TreeNodes/DerivedTypesTreeNode.cs

6
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1274,13 +1274,15 @@ namespace ICSharpCode.Decompiler.Disassembler
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType); output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType);
output.WriteLine(); output.WriteLine();
if (!typeDefinition.BaseType.IsNil) { EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (!baseType.IsNil) {
output.Indent(); output.Indent();
output.Write("extends "); output.Write("extends ");
typeDefinition.BaseType.WriteTo(module, output, genericContext, ILNameSyntax.TypeName); baseType.WriteTo(module, output, genericContext, ILNameSyntax.TypeName);
output.WriteLine(); output.WriteLine();
output.Unindent(); output.Unindent();
} }
var interfaces = typeDefinition.GetInterfaceImplementations(); var interfaces = typeDefinition.GetInterfaceImplementations();
if (interfaces.Count > 0) { if (interfaces.Count > 0) {
output.Indent(); output.Indent();

23
ICSharpCode.Decompiler/SRMExtensions.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler
public static bool IsValueType(this TypeDefinition typeDefinition, MetadataReader reader) public static bool IsValueType(this TypeDefinition typeDefinition, MetadataReader reader)
{ {
var baseType = typeDefinition.BaseType; EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (baseType.IsNil) if (baseType.IsNil)
return false; return false;
if (baseType.IsKnownType(reader, KnownTypeCode.Enum)) if (baseType.IsKnownType(reader, KnownTypeCode.Enum))
@ -49,9 +49,10 @@ namespace ICSharpCode.Decompiler
public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader) public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader)
{ {
if (typeDefinition.BaseType.IsNil) EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (baseType.IsNil)
return false; return false;
return typeDefinition.BaseType.IsKnownType(reader, KnownTypeCode.Enum); return baseType.IsKnownType(reader, KnownTypeCode.Enum);
} }
public static bool IsEnum(this TypeDefinitionHandle handle, MetadataReader reader, out PrimitiveTypeCode underlyingType) public static bool IsEnum(this TypeDefinitionHandle handle, MetadataReader reader, out PrimitiveTypeCode underlyingType)
@ -62,9 +63,10 @@ namespace ICSharpCode.Decompiler
public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader, out PrimitiveTypeCode underlyingType) public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader, out PrimitiveTypeCode underlyingType)
{ {
underlyingType = 0; underlyingType = 0;
if (typeDefinition.BaseType.IsNil) EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (baseType.IsNil)
return false; return false;
if (!typeDefinition.BaseType.IsKnownType(reader, KnownTypeCode.Enum)) if (!baseType.IsKnownType(reader, KnownTypeCode.Enum))
return false; return false;
var field = reader.GetFieldDefinition(typeDefinition.GetFields().First()); var field = reader.GetFieldDefinition(typeDefinition.GetFields().First());
var blob = reader.GetBlobReader(field.Signature); var blob = reader.GetBlobReader(field.Signature);
@ -81,7 +83,7 @@ namespace ICSharpCode.Decompiler
public static bool IsDelegate(this TypeDefinition typeDefinition, MetadataReader reader) public static bool IsDelegate(this TypeDefinition typeDefinition, MetadataReader reader)
{ {
var baseType = typeDefinition.BaseType; var baseType = typeDefinition.GetBaseTypeOrNil();
return !baseType.IsNil && baseType.IsKnownType(reader, KnownTypeCode.MulticastDelegate); return !baseType.IsNil && baseType.IsKnownType(reader, KnownTypeCode.MulticastDelegate);
} }
@ -411,5 +413,14 @@ namespace ICSharpCode.Decompiler
return reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext); return reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext);
} }
} }
public static EntityHandle GetBaseTypeOrNil(this TypeDefinition definition)
{
try {
return definition.BaseType;
} catch (BadImageFormatException) {
return default;
}
}
} }
} }

5
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

@ -270,8 +270,9 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
var context = new GenericContext(TypeParameters); var context = new GenericContext(TypeParameters);
var interfaceImplCollection = td.GetInterfaceImplementations(); var interfaceImplCollection = td.GetInterfaceImplementations();
baseTypes = new List<IType>(1 + interfaceImplCollection.Count); baseTypes = new List<IType>(1 + interfaceImplCollection.Count);
if (!td.BaseType.IsNil) { EntityHandle baseType = td.GetBaseTypeOrNil();
baseTypes.Add(module.ResolveType(td.BaseType, context)); if (!baseType.IsNil) {
baseTypes.Add(module.ResolveType(baseType, context));
} else if (Kind == TypeKind.Interface) { } else if (Kind == TypeKind.Interface) {
// td.BaseType.IsNil is always true for interfaces, // td.BaseType.IsNil is always true for interfaces,
// but the type system expects every interface to derive from System.Object as well. // but the type system expects every interface to derive from System.Object as well.

3
ILSpy/TreeNodes/DerivedTypesTreeNode.cs

@ -76,7 +76,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
if (IsSameType(metadata, ifaceImpl.Interface, definitionMetadata, metadataToken)) if (IsSameType(metadata, ifaceImpl.Interface, definitionMetadata, metadataToken))
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h)); yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
} }
if (!td.BaseType.IsNil && IsSameType(metadata, td.BaseType, definitionMetadata, metadataToken)) { SRM.EntityHandle baseType = td.GetBaseTypeOrNil();
if (!baseType.IsNil && IsSameType(metadata, baseType, definitionMetadata, metadataToken)) {
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h)); yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
} }
} }

Loading…
Cancel
Save