Esempio n. 1
0
 // 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;
     }
 }
Esempio n. 2
0
        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();
            }
        }
Esempio n. 3
0
        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);
        }