From d2cb63dc9534c0c5e64ed368785c99e2982d8a52 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Sun, 2 Feb 2020 03:56:50 +0100 Subject: [PATCH] Model: Add basic concrete generic method definitions from MethodSpecs --- Il2CppInspector/Reflection/Il2CppModel.cs | 5 +---- Il2CppInspector/Reflection/MethodBase.cs | 15 +++++++++++++++ Il2CppInspector/Reflection/MethodInfo.cs | 8 ++++++++ Il2CppInspector/Reflection/ParameterInfo.cs | 5 +++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Il2CppInspector/Reflection/Il2CppModel.cs b/Il2CppInspector/Reflection/Il2CppModel.cs index 0d55449..4a60f05 100644 --- a/Il2CppInspector/Reflection/Il2CppModel.cs +++ b/Il2CppInspector/Reflection/Il2CppModel.cs @@ -91,10 +91,7 @@ namespace Il2CppInspector.Reflection if (!GenericMethods.ContainsKey(declaringType)) GenericMethods.Add(declaringType, new List()); - // TODO: Add generic method resolver here - - // Get list of pointers to type parameters (both unresolved and concrete) - var genericTypeArguments = ResolveGenericArguments(spec.methodIndexIndex); + GenericMethods[declaringType].Add(new MethodInfo(this, spec, declaringType)); } } } diff --git a/Il2CppInspector/Reflection/MethodBase.cs b/Il2CppInspector/Reflection/MethodBase.cs index af7a53e..966c9c9 100644 --- a/Il2CppInspector/Reflection/MethodBase.cs +++ b/Il2CppInspector/Reflection/MethodBase.cs @@ -83,6 +83,7 @@ namespace Il2CppInspector.Reflection // Regular method : Name; + // Initialize a method from a method definition (MethodDef) protected MethodBase(Il2CppInspector pkg, int methodIndex, TypeInfo declaringType) : base(declaringType) { Definition = pkg.Methods[methodIndex]; Index = methodIndex; @@ -141,6 +142,20 @@ namespace Il2CppInspector.Reflection DeclaredParameters.Add(new ParameterInfo(pkg, p, this)); } + // Initialize a method from a concrete generic method (MethodSpec) + protected MethodBase(Il2CppModel model, Il2CppMethodSpec spec, TypeInfo declaringType) : base(declaringType) { + var methodDef = model.MethodsByDefinitionIndex[spec.methodDefinitionIndex]; + + Name = methodDef.Name; + Attributes = methodDef.Attributes; + + IsGenericMethod = true; + genericArguments = model.ResolveGenericArguments(spec.methodIndexIndex); + + // TODO: Substitute generic type arguments for concrete type arguments + // TODO: Populate VirtualAddress via Il2CppGenericMethodFunctionsDefinitions + } + public string GetAccessModifierString() => this switch { // Static constructors can not have an access level modifier { IsConstructor: true, IsStatic: true } => "", diff --git a/Il2CppInspector/Reflection/MethodInfo.cs b/Il2CppInspector/Reflection/MethodInfo.cs index 584d1be..e3ed429 100644 --- a/Il2CppInspector/Reflection/MethodInfo.cs +++ b/Il2CppInspector/Reflection/MethodInfo.cs @@ -30,6 +30,14 @@ namespace Il2CppInspector.Reflection ReturnParameter = new ParameterInfo(pkg, -1, this); } + public MethodInfo(Il2CppModel model, Il2CppMethodSpec spec, TypeInfo declaringType) : base(model, spec, declaringType) { + var methodDef = model.MethodsByDefinitionIndex[spec.methodDefinitionIndex]; + + // Add return parameter + returnTypeReference = methodDef.Definition.returnType; + ReturnParameter = ((MethodInfo) methodDef).ReturnParameter; + } + public override string ToString() => ReturnType.Name + " " + Name + GetFullTypeParametersString() + "(" + string.Join(", ", DeclaredParameters.Select(x => x.ParameterType.IsByRef? x.ParameterType.Name.TrimEnd('&') + " ByRef" : x.ParameterType.Name)) + ")"; diff --git a/Il2CppInspector/Reflection/ParameterInfo.cs b/Il2CppInspector/Reflection/ParameterInfo.cs index 70ba153..1c00750 100644 --- a/Il2CppInspector/Reflection/ParameterInfo.cs +++ b/Il2CppInspector/Reflection/ParameterInfo.cs @@ -95,6 +95,11 @@ namespace Il2CppInspector.Reflection } } + // Create a concrete type parameter from a generic type parameter + public ParameterInfo(Il2CppModel model, ParameterInfo generic, TypeInfo concrete) { + // TODO: Implement generic parameter substitution + } + // ref will be handled as part of the type name public string GetModifierString() => (IsIn ? "in " : "")