// Get generic arguments from either a type or method instanceIndex from a MethodSpec public TypeInfo[] ResolveGenericArguments(Il2CppGenericInst inst) { // Get list of pointers to type parameters (both unresolved and concrete) var genericTypeArguments = Package.BinaryImage.ReadMappedWordArray(inst.type_argv, (int)inst.type_argc); return(genericTypeArguments.Select(a => GetTypeFromVirtualAddress((ulong)a)).ToArray()); }
private static string GetGenericTypeParams(Il2CppGenericInst genericInst) { var typeNames = new List <string>(); var pointers = il2cpp.GetPointers(genericInst.type_argv, (long)genericInst.type_argc); for (uint i = 0; i < genericInst.type_argc; ++i) { var oriType = il2cpp.GetIl2CppType(pointers[i]); typeNames.Add(GetTypeName(oriType)); } return($"<{string.Join(", ", typeNames)}>"); }
internal static Il2CppTypeReflectionData[]? GetGenericTypeParams(Il2CppGenericInst genericInst) { if (LibCpp2IlMain.ThePe == null || LibCpp2IlMain.TheMetadata == null) { return(null); } var types = new List <Il2CppTypeReflectionData>(); var pointers = LibCpp2IlMain.ThePe.ReadClassArrayAtVirtualAddress <ulong>(genericInst.pointerStart, (long)genericInst.pointerCount); for (uint i = 0; i < genericInst.pointerCount; ++i) { var oriType = LibCpp2IlMain.ThePe.GetIl2CppTypeFromPointer(pointers[i]); types.Add(GetTypeReflectionData(oriType) !); } return(types.ToArray()); }
internal static string GetGenericTypeParams(Il2CppMetadata metadata, PE.PE cppAssembly, Il2CppGenericInst genericInst) { var typeNames = new List <string>(); var pointers = cppAssembly.ReadClassArrayAtVirtualAddress <ulong>(genericInst.type_argv, (long)genericInst.type_argc); for (uint i = 0; i < genericInst.type_argc; ++i) { var oriType = cppAssembly.GetIl2CppType(pointers[i]); typeNames.Add(GetTypeName(metadata, cppAssembly, oriType)); } return($"<{String.Join(", ", typeNames)}>"); }