Browse Source

Fix bug with parameters in method and properties that do not have an associated parameter handle.

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

40
ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs

@ -1218,15 +1218,21 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1218,15 +1218,21 @@ namespace ICSharpCode.Decompiler.TypeSystem
var reader = currentMetadata.GetBlobReader(method.Signature);
var signature = method.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default);
var parameters = method.GetParameters();
var parameters = method.GetParameters().ToArray();
m.ReturnType = HandleReturnType(parameters.FirstOrDefault(), signature.ReturnType);
int j = 0;
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.RequiredParameterCount > parameters.Length) {
foreach (var parameterType in signature.ParameterTypes) {
m.Parameters.Add(new DefaultUnresolvedParameter(DynamicAwareTypeReference.Create(parameterType, null, currentMetadata), string.Empty));
}
} else {
foreach (var p in parameters) {
var par = currentMetadata.GetParameter(p);
if (par.SequenceNumber > 0) {
m.Parameters.Add(ReadParameter(par, signature.ParameterTypes[j]));
j++;
}
}
}
@ -1587,25 +1593,31 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -1587,25 +1593,31 @@ namespace ICSharpCode.Decompiler.TypeSystem
p.Getter = ReadMethod(accessors.Getter, parentType, SymbolKind.Accessor, p);
p.Setter = ReadMethod(accessors.Setter, parentType, SymbolKind.Accessor, p);
ParameterHandleCollection parameterHandles = default(ParameterHandleCollection);
var parameterHandles = Empty<ParameterHandle>.Array;
if (!accessors.Getter.IsNil) {
var getter = currentMetadata.GetMethodDefinition(accessors.Getter);
parameterHandles = getter.GetParameters();
parameterHandles = getter.GetParameters().ToArray();
} else {
if (!accessors.Setter.IsNil) {
var setter = currentMetadata.GetMethodDefinition(accessors.Setter);
parameterHandles = setter.GetParameters();
parameterHandles = setter.GetParameters().ToArray();
}
}
p.ReturnType = HandleReturnType(parameterHandles.FirstOrDefault(), signature.ReturnType);
int i = 0;
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++;
if (signature.RequiredParameterCount > parameterHandles.Length) {
foreach (var parameterType in signature.ParameterTypes) {
p.Parameters.Add(new DefaultUnresolvedParameter(DynamicAwareTypeReference.Create(parameterType, null, currentMetadata), string.Empty));
}
} else {
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