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

Loading…
Cancel
Save