// requires TypeMetadata private void IndexGenerics() { // build type -> generic instance lookup foreach (var il2CppType in il2Cpp.types.Where(x => x.type == Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST)) { var genericClass = il2Cpp.MapVATR <Il2CppGenericClass>(il2CppType.data.generic_class); var baseTypeDef = executor.GetGenericClassTypeDefinition(genericClass); if (baseTypeDef == null) { continue; } TypeDefinitionMetadata baseTypeMetadata = TypeMetadata[baseTypeDef]; var typeBaseName = TypeMetadata[baseTypeDef].UniqueName; var typeToReplaceName = executor.GetTypeDefName(baseTypeDef, true, true); var typeReplaceName = executor.GetTypeName(il2CppType, true, false); var typeStructName = typeBaseName.Replace(typeToReplaceName, typeReplaceName); genericClassList.Add(il2CppType.data.generic_class); lookupGenericType[typeStructName] = il2CppType; lookupGenericClassName[il2CppType.data.generic_class] = typeStructName; } }
private TypeReference GetTypeReference(MemberReference memberReference, Il2CppType il2CppType) { var moduleDefinition = memberReference.Module; switch (il2CppType.type) { case Il2CppTypeEnum.IL2CPP_TYPE_OBJECT: return(moduleDefinition.ImportReference(typeof(object))); case Il2CppTypeEnum.IL2CPP_TYPE_VOID: return(moduleDefinition.ImportReference(typeof(void))); case Il2CppTypeEnum.IL2CPP_TYPE_BOOLEAN: return(moduleDefinition.ImportReference(typeof(bool))); case Il2CppTypeEnum.IL2CPP_TYPE_CHAR: return(moduleDefinition.ImportReference(typeof(char))); case Il2CppTypeEnum.IL2CPP_TYPE_I1: return(moduleDefinition.ImportReference(typeof(sbyte))); case Il2CppTypeEnum.IL2CPP_TYPE_U1: return(moduleDefinition.ImportReference(typeof(byte))); case Il2CppTypeEnum.IL2CPP_TYPE_I2: return(moduleDefinition.ImportReference(typeof(short))); case Il2CppTypeEnum.IL2CPP_TYPE_U2: return(moduleDefinition.ImportReference(typeof(ushort))); case Il2CppTypeEnum.IL2CPP_TYPE_I4: return(moduleDefinition.ImportReference(typeof(int))); case Il2CppTypeEnum.IL2CPP_TYPE_U4: return(moduleDefinition.ImportReference(typeof(uint))); case Il2CppTypeEnum.IL2CPP_TYPE_I: return(moduleDefinition.ImportReference(typeof(IntPtr))); case Il2CppTypeEnum.IL2CPP_TYPE_U: return(moduleDefinition.ImportReference(typeof(UIntPtr))); case Il2CppTypeEnum.IL2CPP_TYPE_I8: return(moduleDefinition.ImportReference(typeof(long))); case Il2CppTypeEnum.IL2CPP_TYPE_U8: return(moduleDefinition.ImportReference(typeof(ulong))); case Il2CppTypeEnum.IL2CPP_TYPE_R4: return(moduleDefinition.ImportReference(typeof(float))); case Il2CppTypeEnum.IL2CPP_TYPE_R8: return(moduleDefinition.ImportReference(typeof(double))); case Il2CppTypeEnum.IL2CPP_TYPE_STRING: return(moduleDefinition.ImportReference(typeof(string))); case Il2CppTypeEnum.IL2CPP_TYPE_TYPEDBYREF: return(moduleDefinition.ImportReference(typeof(TypedReference))); case Il2CppTypeEnum.IL2CPP_TYPE_CLASS: case Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE: { var typeDef = executor.GetTypeDefinitionFromIl2CppType(il2CppType); var typeDefinition = typeDefinitionDic[typeDef]; return(moduleDefinition.ImportReference(typeDefinition)); } case Il2CppTypeEnum.IL2CPP_TYPE_ARRAY: { var arrayType = il2Cpp.MapVATR <Il2CppArrayType>(il2CppType.data.array); var oriType = il2Cpp.GetIl2CppType(arrayType.etype); return(new ArrayType(GetTypeReference(memberReference, oriType), arrayType.rank)); } case Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST: { var genericClass = il2Cpp.MapVATR <Il2CppGenericClass>(il2CppType.data.generic_class); var typeDef = executor.GetGenericClassTypeDefinition(genericClass); var typeDefinition = typeDefinitionDic[typeDef]; var genericInstanceType = new GenericInstanceType(moduleDefinition.ImportReference(typeDefinition)); var genericInst = il2Cpp.MapVATR <Il2CppGenericInst>(genericClass.context.class_inst); var pointers = il2Cpp.MapVATR <ulong>(genericInst.type_argv, genericInst.type_argc); foreach (var pointer in pointers) { var oriType = il2Cpp.GetIl2CppType(pointer); genericInstanceType.GenericArguments.Add(GetTypeReference(memberReference, oriType)); } return(genericInstanceType); } case Il2CppTypeEnum.IL2CPP_TYPE_SZARRAY: { var oriType = il2Cpp.GetIl2CppType(il2CppType.data.type); return(new ArrayType(GetTypeReference(memberReference, oriType))); } case Il2CppTypeEnum.IL2CPP_TYPE_VAR: { if (memberReference is MethodDefinition methodDefinition) { return(CreateGenericParameter(executor.GetGenericParameteFromIl2CppType(il2CppType), methodDefinition.DeclaringType)); } var typeDefinition = (TypeDefinition)memberReference; return(CreateGenericParameter(executor.GetGenericParameteFromIl2CppType(il2CppType), typeDefinition)); } case Il2CppTypeEnum.IL2CPP_TYPE_MVAR: { var methodDefinition = (MethodDefinition)memberReference; return(CreateGenericParameter(executor.GetGenericParameteFromIl2CppType(il2CppType), methodDefinition)); } case Il2CppTypeEnum.IL2CPP_TYPE_PTR: { var oriType = il2Cpp.GetIl2CppType(il2CppType.data.type); return(new PointerType(GetTypeReference(memberReference, oriType))); } default: throw new ArgumentOutOfRangeException(); } }
private string header_include(Il2CppType type) { string output; string type_name = ""; string namespaze = ""; string template_decl = ""; switch (type.type) { case Il2CppTypeEnum.IL2CPP_TYPE_ARRAY: case Il2CppTypeEnum.IL2CPP_TYPE_SZARRAY: { return("#include <cs/array.hpp>"); } case Il2CppTypeEnum.IL2CPP_TYPE_MVAR: return(""); case Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE: return($"#include <{include_path(type)}.hpp>"); case Il2CppTypeEnum.IL2CPP_TYPE_STRING: { return("#include <cs/string.hpp>"); } case Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST: { Il2CppTypeDefinition typeDef; Il2CppGenericClass genericClass = il2Cpp.MapVATR <Il2CppGenericClass>(type.data.generic_class); typeDef = executor.GetGenericClassTypeDefinition(genericClass); var @namespace = metadata.GetStringFromIndex(typeDef.namespaceIndex); if (@namespace != "") { type_name += @namespace + "."; } type_name += metadata.GetStringFromIndex(typeDef.nameIndex); var index = type_name.IndexOf("`"); if (index != -1) { type_name = type_name.Substring(0, index); } template_decl = "template <class...> "; //Il2CppExecutor.GetGenericContainerParams(genericContainer, generic_decl) break; } default: { if (type.type > Il2CppTypeEnum.IL2CPP_TYPE_R8) { type_name = executor.GetTypeName(type, true, false); } else { return(""); } break; } } type_name = type_name.Replace(".", "::"); type_name = type_name.Replace("*", ""); var nsindex = type_name.LastIndexOf("::"); if (nsindex > 0) { namespaze = type_name.Substring(0, nsindex); type_name = type_name.Substring(nsindex + 2); output = "namespace " + namespaze + "{ " + template_decl + "struct " + deobfu(type_name) + "; }"; } else { output = "struct " + deobfu(type_name) + ";"; } return(output); }