Add non-generic methods in generic types to GenericMethods

GenericMethods should contain all MethodSpec-referenced methods,
including those which are non-generic methods inside generic types. This
patch adds those methods, and also implements parameter substitution for
type arguments in parameters & return types.
This commit is contained in:
Robert Xiao
2020-04-11 17:57:46 -07:00
committed by Katy
parent 50ea6dac36
commit c73aad08b8
4 changed files with 32 additions and 32 deletions

View File

@@ -152,16 +152,19 @@ namespace Il2CppInspector.Reflection
Name = methodDef.Name;
Attributes = methodDef.Attributes;
IsGenericMethod = true;
genericArguments = model.ResolveGenericArguments(model.Package.GenericInstances[spec.methodIndexIndex]);
if (spec.methodIndexIndex >= 0) {
IsGenericMethod = true;
genericArguments = model.ResolveGenericArguments(model.Package.GenericInstances[spec.methodIndexIndex]);
} else {
IsGenericMethod = methodDef.IsGenericMethod;
genericArguments = methodDef.GetGenericArguments();
}
var genericTypeArguments = declaringType.GetGenericArguments();
// Substitute matching generic type parameters with concrete type arguments
foreach (var p in methodDef.DeclaredParameters) {
if (!p.ParameterType.IsGenericMethodParameter)
DeclaredParameters.Add(p);
else
DeclaredParameters.Add(new ParameterInfo(model, p, genericArguments[p.ParameterType.GenericParameterPosition]));
}
DeclaredParameters = methodDef.DeclaredParameters
.Select(p => p.SubstituteGenericArguments(genericTypeArguments, genericArguments))
.ToList();
VirtualAddress = model.Package.GetGenericMethodPointer(spec);
}