public string GetGenericInstParams(Il2CppGenericInst genericInst) { var genericParameterNames = new List <string>(); var pointers = il2Cpp.MapVATR <ulong>(genericInst.type_argv, genericInst.type_argc); for (int i = 0; i < genericInst.type_argc; i++) { var il2CppType = il2Cpp.GetIl2CppType(pointers[i]); genericParameterNames.Add(Il2CppDecompiler.deobfu(GetTypeName(il2CppType, true, false, false))); } return($"<{string.Join(", ", genericParameterNames)}>"); }
public string GetTypeDefName(Il2CppTypeDefinition typeDef, bool addNamespace, bool genericParameter, bool generic_decl = false) { var prefix = string.Empty; if (typeDef.declaringTypeIndex != -1) { prefix = GetTypeName(il2Cpp.types[typeDef.declaringTypeIndex], addNamespace, true) + "_"; } else if (addNamespace) { var @namespace = metadata.GetStringFromIndex(typeDef.namespaceIndex); @namespace = @namespace.Replace(".", "::"); if (@namespace != "") { prefix = @namespace + "::"; } } var typeName = metadata.GetStringFromIndex(typeDef.nameIndex); if (typeDef.genericContainerIndex >= 0) { var index = typeName.IndexOf("`"); if (index != -1) { typeName = typeName.Substring(0, index); typeName = typeName.Replace("<", "_"); typeName = typeName.Replace(">", "_"); } if (genericParameter) { var genericContainer = metadata.genericContainers[typeDef.genericContainerIndex]; typeName += GetGenericContainerParams(genericContainer, generic_decl); if (generic_decl) { return("template " + GetGenericContainerParams(genericContainer, generic_decl)); } } } else { typeName = typeName.Replace("<", "_"); typeName = typeName.Replace(">", "_"); } //typeName = Il2CppDecompiler.deobfu(typeName); return(Il2CppDecompiler.deobfu(prefix + typeName)); }
public string GetTypeName(Il2CppType il2CppType, bool addNamespace, bool is_nested, bool is_pointer = true) { /* * if (il2CppType.data.klassIndex) * var typeDef = metadata.typeDefs[typeDefIndex]; * var typeName = executor.GetTypeDefName(typeDef, false, true);*/ switch (il2CppType.type) { case Il2CppTypeEnum.IL2CPP_TYPE_ARRAY: { var arrayType = il2Cpp.MapVATR <Il2CppArrayType>(il2CppType.data.array); var elementType = il2Cpp.GetIl2CppType(arrayType.etype); return($"{GetTypeName(elementType, addNamespace, false)}[{new string(',', arrayType.rank - 1)}]"); } case Il2CppTypeEnum.IL2CPP_TYPE_SZARRAY: { var elementType = il2Cpp.GetIl2CppType(il2CppType.data.type); return($"cs::array<{GetTypeName(elementType, addNamespace, false, false)}>*"); } case Il2CppTypeEnum.IL2CPP_TYPE_PTR: { var oriType = il2Cpp.GetIl2CppType(il2CppType.data.type); return($"{GetTypeName(oriType, addNamespace, false)}*"); } case Il2CppTypeEnum.IL2CPP_TYPE_VAR: case Il2CppTypeEnum.IL2CPP_TYPE_MVAR: { var param = GetGenericParameteFromIl2CppType(il2CppType); return(metadata.GetStringFromIndex(param.nameIndex)); } case Il2CppTypeEnum.IL2CPP_TYPE_CLASS: case Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE: case Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST: { string str = string.Empty; string str_params = string.Empty; string str_pointer = "*"; if (!is_pointer) { str_pointer = ""; } Il2CppTypeDefinition typeDef; Il2CppGenericClass genericClass = null; if (il2CppType.type == Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST) { genericClass = il2Cpp.MapVATR <Il2CppGenericClass>(il2CppType.data.generic_class); typeDef = GetGenericClassTypeDefinition(genericClass); } else { typeDef = GetTypeDefinitionFromIl2CppType(il2CppType); } if (typeDef.declaringTypeIndex != -1) { // nested str += GetTypeName(il2Cpp.types[typeDef.declaringTypeIndex], addNamespace, true, true); str += "_"; } else if (addNamespace) { var @namespace = metadata.GetStringFromIndex(typeDef.namespaceIndex); if (@namespace != "") { @namespace = @namespace.Replace(".", "::"); str += @namespace + "::"; } } var typeName = metadata.GetStringFromIndex(typeDef.nameIndex); var index = typeName.IndexOf("`"); if (index != -1) { str += typeName.Substring(0, index); } else { str += typeName; } if (is_nested) { return(str); } if (genericClass != null) { var genericInst = il2Cpp.MapVATR <Il2CppGenericInst>(genericClass.context.class_inst); str_params += GetGenericInstParams(genericInst); } else if (typeDef.genericContainerIndex >= 0) { var genericContainer = metadata.genericContainers[typeDef.genericContainerIndex]; str_params += GetGenericContainerParams(genericContainer); } if (il2CppType.type == Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE) { str_pointer = ""; } str = str.Replace("<", "_"); str = str.Replace(">", "_"); str = Il2CppDecompiler.deobfu(str); return(str + str_params + str_pointer); } default: return(TypeString[(int)il2CppType.type]); } }