Browse Source

Fix bugs with parameters and parameter attributes in MetadataLoader

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
a09ff12a67
  1. 58
      ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs

58
ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs

@ -507,13 +507,15 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -507,13 +507,15 @@ namespace ICSharpCode.Decompiler.TypeSystem
AddSecurityAttributes(methodDefinition.GetDeclarativeSecurityAttributes(), attributes);
if (methodDefinition.GetParameters().Count > 0) {
var retParam = currentMetadata.GetParameter(methodDefinition.GetParameters().First());
var marshallingDesc = retParam.GetMarshallingDescriptor();
if (retParam.SequenceNumber == 0) {
var marshallingDesc = retParam.GetMarshallingDescriptor();
if (!marshallingDesc.IsNil) {
returnTypeAttributes.Add(ConvertMarshalInfo(currentMetadata.GetBlobReader(marshallingDesc)));
}
if (!marshallingDesc.IsNil) {
returnTypeAttributes.Add(ConvertMarshalInfo(currentMetadata.GetBlobReader(marshallingDesc)));
}
AddCustomAttributes(retParam.GetCustomAttributes(), returnTypeAttributes);
AddCustomAttributes(retParam.GetCustomAttributes(), returnTypeAttributes);
}
}
}
#endregion
@ -1232,16 +1234,17 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1232,16 +1234,17 @@ namespace ICSharpCode.Decompiler.TypeSystem
var declaringType = currentMetadata.GetTypeDefinition(method.GetDeclaringType());
var reader = currentMetadata.GetBlobReader(method.Signature);
var signature = method.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default);
var parameters = method.GetParameters();
int parameterOffset = parameters.Count > signature.ParameterTypes.Length ? 1 : 0;
CustomAttributeHandleCollection? returnAttributes = parameterOffset > 0 ? (CustomAttributeHandleCollection?)currentMetadata.GetParameter(parameters.First()).GetCustomAttributes() : null;
m.ReturnType = DynamicAwareTypeReference.Create(signature.ReturnType, returnAttributes, currentMetadata);
var parameters = method.GetParameters();
m.ReturnType = HandleReturnType(parameters.FirstOrDefault(), signature.ReturnType);
int j = 0;
foreach (var par in method.GetParameters().Skip(parameterOffset)) {
m.Parameters.Add(ReadParameter(par, signature.ParameterTypes[j]));
j++;
foreach (var p in parameters) {
var par = currentMetadata.GetParameter(p);
if (par.SequenceNumber > 0) {
m.Parameters.Add(ReadParameter(par, signature.ParameterTypes[j]));
j++;
}
}
if (signature.Header.CallingConvention == SignatureCallingConvention.VarArgs) {
@ -1295,6 +1298,18 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1295,6 +1298,18 @@ namespace ICSharpCode.Decompiler.TypeSystem
return m;
}
ITypeReference HandleReturnType(ParameterHandle parameterHandle, ITypeReference returnType)
{
CustomAttributeHandleCollection? attributes = null;
if (!parameterHandle.IsNil) {
var par = currentMetadata.GetParameter(parameterHandle);
if (par.SequenceNumber == 0) {
attributes = par.GetCustomAttributes();
}
}
return DynamicAwareTypeReference.Create(returnType, attributes, currentMetadata);
}
static bool HasExtensionAttribute(MetadataReader currentModule, CustomAttributeHandleCollection attributes)
{
foreach (var h in attributes) {
@ -1362,11 +1377,8 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1362,11 +1377,8 @@ namespace ICSharpCode.Decompiler.TypeSystem
#endregion
#region Read Parameter
public IUnresolvedParameter ReadParameter(ParameterHandle handle, ITypeReference type)
public IUnresolvedParameter ReadParameter(Parameter parameter, ITypeReference type)
{
if (handle.IsNil)
throw new ArgumentNullException(nameof(handle));
var parameter = currentMetadata.GetParameter(handle);
var p = new DefaultUnresolvedParameter(DynamicAwareTypeReference.Create(type, parameter.GetCustomAttributes(), currentMetadata), interningProvider.Intern(currentMetadata.GetString(parameter.Name)));
if (type is ByReferenceTypeReference) {
@ -1589,8 +1601,6 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1589,8 +1601,6 @@ namespace ICSharpCode.Decompiler.TypeSystem
p.Accessibility = MergePropertyAccessibility(GetAccessibility(currentMetadata.GetMethodDefinition(accessors.Getter).Attributes), GetAccessibility(currentMetadata.GetMethodDefinition(accessors.Setter).Attributes));
var signature = property.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default);
p.ReturnType = DynamicAwareTypeReference.Create(signature.ReturnType, property.GetCustomAttributes(), currentMetadata);
p.Getter = ReadMethod(accessors.Getter, parentType, SymbolKind.Accessor, p);
p.Setter = ReadMethod(accessors.Setter, parentType, SymbolKind.Accessor, p);
@ -1605,11 +1615,15 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1605,11 +1615,15 @@ namespace ICSharpCode.Decompiler.TypeSystem
}
}
p.ReturnType = HandleReturnType(parameterHandles.FirstOrDefault(), signature.ReturnType);
int i = 0;
int parameterOffset = parameterHandles.Count > signature.ParameterTypes.Length ? 1 : 0;
foreach (var par in parameterHandles.Skip(parameterOffset)) {
p.Parameters.Add(ReadParameter(par, signature.ParameterTypes[i]));
i++;
foreach (var h in parameterHandles) {
var par = currentMetadata.GetParameter(h);
if (par.SequenceNumber > 0 && i < signature.ParameterTypes.Length) {
p.Parameters.Add(ReadParameter(par, signature.ParameterTypes[i]));
i++;
}
}
AddAttributes(property, p);

Loading…
Cancel
Save