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 @@ -1235,7 +1235,22 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteReference(module, handle, ".event", true);
output.Write(" ");
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);
output.Write(' ');
output.Write(DisassemblerHelpers.Escape(module.Metadata.GetString(eventDefinition.Name)));

47
ICSharpCode.Decompiler/SRMExtensions.cs

@ -164,7 +164,7 @@ namespace ICSharpCode.Decompiler @@ -164,7 +164,7 @@ namespace ICSharpCode.Decompiler
case HandleKind.TypeSpecification:
return ((TypeSpecificationHandle)handle).GetFullTypeName(reader);
default:
throw new NotSupportedException();
throw new ArgumentOutOfRangeException();
}
}
@ -227,20 +227,6 @@ namespace ICSharpCode.Decompiler @@ -227,20 +227,6 @@ namespace ICSharpCode.Decompiler
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)
{
string name = metadata.GetString(type.Name);
@ -327,7 +313,7 @@ namespace ICSharpCode.Decompiler @@ -327,7 +313,7 @@ namespace ICSharpCode.Decompiler
var mr = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
return mr.Parent;
default:
throw new NotSupportedException();
throw new BadImageFormatException("Unexpected token kind for attribute constructor: " + attribute.Constructor.Kind);
}
}
@ -347,17 +333,24 @@ namespace ICSharpCode.Decompiler @@ -347,17 +333,24 @@ namespace ICSharpCode.Decompiler
}
#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)
return default;
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);
}
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 GetByReferenceType(int elementType) => elementType;
public int GetFunctionPointerType(MethodSignature<int> signature) => IntPtr.Size;
@ -389,9 +382,11 @@ namespace ICSharpCode.Decompiler @@ -389,9 +382,11 @@ namespace ICSharpCode.Decompiler
return 8;
case PrimitiveTypeCode.IntPtr:
case PrimitiveTypeCode.UIntPtr:
// this is the same as Cecil does.
return IntPtr.Size;
default:
throw new NotSupportedException();
// we assume pointer size for object, string and typedref
return IntPtr.Size;
}
}
@ -405,12 +400,22 @@ namespace ICSharpCode.Decompiler @@ -405,12 +400,22 @@ namespace ICSharpCode.Decompiler
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)
{
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