Browse Source

Remove EventDefinition.DecodeSignature

pull/1030/head
Siegfried Pammer 7 years ago
parent
commit
f40743994b
  1. 17
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 47
      ICSharpCode.Decompiler/SRMExtensions.cs

17
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1235,7 +1235,22 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteReference(module, handle, ".event", true); output.WriteReference(module, handle, ".event", true);
output.Write(" "); output.Write(" ");
WriteFlags(eventDefinition.Attributes, eventAttributes); WriteFlags(eventDefinition.Attributes, eventAttributes);
var signature = eventDefinition.DecodeSignature(module.Metadata, new DisassemblerSignatureProvider(module, output), new GenericContext(declaringType, module)); var provider = new DisassemblerSignatureProvider(module, output);
Action<ILNameSyntax> signature;
switch (eventDefinition.Type.Kind) {
case HandleKind.TypeDefinition:
signature = provider.GetTypeFromDefinition(module.Metadata, (TypeDefinitionHandle)eventDefinition.Type, 0);
break;
case HandleKind.TypeReference:
signature = provider.GetTypeFromReference(module.Metadata, (TypeReferenceHandle)eventDefinition.Type, 0);
break;
case HandleKind.TypeSpecification:
signature = provider.GetTypeFromSpecification(module.Metadata, new GenericContext(declaringType, module),
(TypeSpecificationHandle)eventDefinition.Type, 0);
break;
default:
throw new ArgumentOutOfRangeException("Expected a TypeDef, TypeRef or TypeSpec handle!");
}
signature(ILNameSyntax.TypeName); signature(ILNameSyntax.TypeName);
output.Write(' '); output.Write(' ');
output.Write(DisassemblerHelpers.Escape(module.Metadata.GetString(eventDefinition.Name))); output.Write(DisassemblerHelpers.Escape(module.Metadata.GetString(eventDefinition.Name)));

47
ICSharpCode.Decompiler/SRMExtensions.cs

@ -164,7 +164,7 @@ namespace ICSharpCode.Decompiler
case HandleKind.TypeSpecification: case HandleKind.TypeSpecification:
return ((TypeSpecificationHandle)handle).GetFullTypeName(reader); return ((TypeSpecificationHandle)handle).GetFullTypeName(reader);
default: default:
throw new NotSupportedException(); throw new ArgumentOutOfRangeException();
} }
} }
@ -227,20 +227,6 @@ namespace ICSharpCode.Decompiler
return new TopLevelTypeName(ns, name, typeParameterCount); return new TopLevelTypeName(ns, name, typeParameterCount);
} }
public static TType DecodeSignature<TType, TGenericContext>(this EventDefinition ev, MetadataReader reader, ISignatureTypeProvider<TType, TGenericContext> provider, TGenericContext genericContext)
{
switch (ev.Type.Kind) {
case HandleKind.TypeDefinition:
return provider.GetTypeFromDefinition(reader, (TypeDefinitionHandle)ev.Type, 0);
case HandleKind.TypeReference:
return provider.GetTypeFromReference(reader, (TypeReferenceHandle)ev.Type, 0);
case HandleKind.TypeSpecification:
return provider.GetTypeFromSpecification(reader, genericContext, (TypeSpecificationHandle)ev.Type, 0);
default:
throw new NotSupportedException();
}
}
public static bool IsAnonymousType(this TypeDefinition type, MetadataReader metadata) public static bool IsAnonymousType(this TypeDefinition type, MetadataReader metadata)
{ {
string name = metadata.GetString(type.Name); string name = metadata.GetString(type.Name);
@ -327,7 +313,7 @@ namespace ICSharpCode.Decompiler
var mr = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor); var mr = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
return mr.Parent; return mr.Parent;
default: default:
throw new NotSupportedException(); throw new BadImageFormatException("Unexpected token kind for attribute constructor: " + attribute.Constructor.Kind);
} }
} }
@ -347,17 +333,24 @@ namespace ICSharpCode.Decompiler
} }
#endregion #endregion
public static unsafe SRM.BlobReader GetInitialValue(this FieldDefinition field, PEReader pefile) public static unsafe SRM.BlobReader GetInitialValue(this FieldDefinition field, PEReader pefile, IDecompilerTypeSystem typeSystem)
{ {
if (!field.HasFlag(FieldAttributes.HasFieldRVA) || field.GetRelativeVirtualAddress() == 0) if (!field.HasFlag(FieldAttributes.HasFieldRVA) || field.GetRelativeVirtualAddress() == 0)
return default; return default;
int rva = field.GetRelativeVirtualAddress(); int rva = field.GetRelativeVirtualAddress();
int size = field.DecodeSignature(new FieldValueSizeDecoder(), default); int size = field.DecodeSignature(new FieldValueSizeDecoder(resolver), default);
return pefile.GetSectionData(rva).GetReader(0, size); return pefile.GetSectionData(rva).GetReader(0, size);
} }
class FieldValueSizeDecoder : ISignatureTypeProvider<int, Unit> class FieldValueSizeDecoder : ISignatureTypeProvider<int, Unit>
{ {
IDecompilerTypeSystem typeSystem;
public FieldValueSizeDecoder(IDecompilerTypeSystem typeSystem)
{
this.typeSystem = typeSystem ?? throw new ArgumentNullException(nameof(typeSystem));
}
public int GetArrayType(int elementType, ArrayShape shape) => elementType; public int GetArrayType(int elementType, ArrayShape shape) => elementType;
public int GetByReferenceType(int elementType) => elementType; public int GetByReferenceType(int elementType) => elementType;
public int GetFunctionPointerType(MethodSignature<int> signature) => IntPtr.Size; public int GetFunctionPointerType(MethodSignature<int> signature) => IntPtr.Size;
@ -389,9 +382,11 @@ namespace ICSharpCode.Decompiler
return 8; return 8;
case PrimitiveTypeCode.IntPtr: case PrimitiveTypeCode.IntPtr:
case PrimitiveTypeCode.UIntPtr: case PrimitiveTypeCode.UIntPtr:
// this is the same as Cecil does.
return IntPtr.Size; return IntPtr.Size;
default: default:
throw new NotSupportedException(); // we assume pointer size for object, string and typedref
return IntPtr.Size;
} }
} }
@ -405,12 +400,22 @@ namespace ICSharpCode.Decompiler
public int GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) public int GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
{ {
return 0; var typeDef = typeSystem.ResolveAsType(handle).GetDefinition();
if (typeDef == null || typeDef.MetadataToken.IsNil)
return 0;
reader = typeDef.ParentAssembly.PEFile.Metadata;
var td = reader.GetTypeDefinition((TypeDefinitionHandle)typeDef.MetadataToken);
return td.GetLayout().Size;
} }
public int GetTypeFromSpecification(MetadataReader reader, Unit genericContext, TypeSpecificationHandle handle, byte rawTypeKind) public int GetTypeFromSpecification(MetadataReader reader, Unit genericContext, TypeSpecificationHandle handle, byte rawTypeKind)
{ {
return 0; var typeDef = typeSystem.ResolveAsType(handle).GetDefinition();
if (typeDef == null || typeDef.MetadataToken.IsNil)
return 0;
reader = typeDef.ParentAssembly.PEFile.Metadata;
var td = reader.GetTypeDefinition((TypeDefinitionHandle)typeDef.MetadataToken);
return td.GetLayout().Size;
} }
} }
} }

Loading…
Cancel
Save