#pragma once 
 | 
  
 | 
#include <stdint.h> 
 | 
#include <string> 
 | 
#include <list> 
 | 
#include <vector> 
 | 
#include <algorithm> 
 | 
  
 | 
#include "il2cpp-config.h" 
 | 
#include "il2cpp-class-internals.h" 
 | 
  
 | 
#ifdef major 
 | 
# undef major 
 | 
# undef minor 
 | 
#endif 
 | 
  
 | 
struct FieldInfo; 
 | 
struct Il2CppType; 
 | 
struct Il2CppClass; 
 | 
struct Il2CppGenericParameter; 
 | 
struct Il2CppString; 
 | 
  
 | 
namespace il2cpp 
 | 
{ 
 | 
namespace vm 
 | 
{ 
 | 
    static const int32_t kPublicKeyTokenLength = 17; 
 | 
  
 | 
    class TypeNameParseInfo 
 | 
    { 
 | 
    public: 
 | 
        struct AssemblyName 
 | 
        { 
 | 
            std::string name; 
 | 
            std::string culture; 
 | 
            std::string public_key; 
 | 
            char public_key_token[kPublicKeyTokenLength]; 
 | 
            uint32_t hash_alg; 
 | 
            uint32_t hash_len; 
 | 
            uint32_t flags; 
 | 
            uint16_t major; 
 | 
            uint16_t minor; 
 | 
            uint16_t build; 
 | 
            uint16_t revision; 
 | 
  
 | 
            AssemblyName() : 
 | 
                hash_alg(0), 
 | 
                hash_len(0), 
 | 
                flags(0), 
 | 
                major(0), 
 | 
                minor(0), 
 | 
                build(0), 
 | 
                revision(0) 
 | 
            { 
 | 
                memset(public_key_token, 0, kPublicKeyTokenLength); 
 | 
            } 
 | 
        }; 
 | 
  
 | 
        TypeNameParseInfo(); 
 | 
        ~TypeNameParseInfo(); 
 | 
  
 | 
        inline const std::string &ns() const 
 | 
        { 
 | 
            return _namespace; 
 | 
        } 
 | 
  
 | 
        inline const std::string &name() const 
 | 
        { 
 | 
            return _name; 
 | 
        } 
 | 
  
 | 
        inline const AssemblyName &assembly_name() const 
 | 
        { 
 | 
            return _assembly_name; 
 | 
        } 
 | 
  
 | 
        inline const std::vector<int> &modifiers() const 
 | 
        { 
 | 
            return _modifiers; 
 | 
        } 
 | 
  
 | 
        inline const std::vector<TypeNameParseInfo> &type_arguments() const 
 | 
        { 
 | 
            return _type_arguments; 
 | 
        } 
 | 
  
 | 
        inline const std::vector<std::string> &nested() const 
 | 
        { 
 | 
            return _nested; 
 | 
        } 
 | 
  
 | 
        inline bool is_byref() const 
 | 
        { 
 | 
            return std::find(_modifiers.begin(), _modifiers.end(), 0) != _modifiers.end(); 
 | 
        } 
 | 
  
 | 
        inline bool has_generic_arguments() const 
 | 
        { 
 | 
            return _type_arguments.size() > 0; 
 | 
        } 
 | 
  
 | 
        inline bool is_pointer() const 
 | 
        { 
 | 
            return std::find(_modifiers.begin(), _modifiers.end(), -1) != _modifiers.end(); 
 | 
        } 
 | 
  
 | 
        inline bool is_bounded() const 
 | 
        { 
 | 
            return std::find(_modifiers.begin(), _modifiers.end(), -2) != _modifiers.end(); 
 | 
        } 
 | 
  
 | 
        inline bool is_array() const 
 | 
        { 
 | 
            std::vector<int32_t>::const_iterator it = _modifiers.begin(); 
 | 
            while (it != _modifiers.end()) 
 | 
            { 
 | 
                if (*it > 0) 
 | 
                    return true; 
 | 
  
 | 
                ++it; 
 | 
            } 
 | 
  
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        void SetAssemblyName(const AssemblyName& assemblyName) 
 | 
        { 
 | 
            _assembly_name = assemblyName; 
 | 
        } 
 | 
  
 | 
    private: 
 | 
  
 | 
        std::string _namespace; 
 | 
        std::string _name; 
 | 
        AssemblyName _assembly_name; 
 | 
        std::vector<int32_t> _modifiers; 
 | 
        std::vector<TypeNameParseInfo> _type_arguments; 
 | 
        std::vector<std::string> _nested; 
 | 
  
 | 
        friend class TypeNameParser; 
 | 
    }; 
 | 
  
 | 
    class TypeNameParser 
 | 
    { 
 | 
    public: 
 | 
  
 | 
        TypeNameParser(const std::string &name, TypeNameParseInfo &info, bool is_nested); 
 | 
        TypeNameParser(std::string::const_iterator &begin, std::string::const_iterator &end, TypeNameParseInfo &info, bool is_nested); 
 | 
  
 | 
        bool Parse(bool acceptAssemblyName = true); 
 | 
        bool ParseAssembly(); 
 | 
  
 | 
    private: 
 | 
  
 | 
        inline bool IsEOL() const 
 | 
        { 
 | 
            return _p >= _end; 
 | 
        } 
 | 
  
 | 
        inline bool CurrentIs(char v) const 
 | 
        { 
 | 
            if (IsEOL()) 
 | 
                return false; 
 | 
  
 | 
            return *_p == v; 
 | 
        } 
 | 
  
 | 
        inline bool Next(bool skipWhites = false) 
 | 
        { 
 | 
            ++_p; 
 | 
  
 | 
            if (skipWhites) 
 | 
                SkipWhites(); 
 | 
  
 | 
            return !IsEOL(); 
 | 
        } 
 | 
  
 | 
        bool NextWillBe(char v, bool skipWhites = false) const; 
 | 
  
 | 
        void InitializeParser(); 
 | 
        void SkipWhites(); 
 | 
        void ConsumeIdentifier(); 
 | 
        void ConsumeAssemblyIdentifier(); 
 | 
        void ConsumePropertyIdentifier(); 
 | 
        void ConsumePropertyValue(); 
 | 
        bool ConsumeNumber(int32_t &value); 
 | 
        bool ParseTypeName(int32_t &arity); 
 | 
        bool ParseNestedTypeOptional(int32_t &arity); 
 | 
        bool ParseTypeArgumentsOptional(int32_t &arity); 
 | 
        bool ParseAssemblyNameOptional(); 
 | 
        bool ParseAssemblyName(); 
 | 
        bool ParsePropertiesOptional(); 
 | 
        bool ParseArrayModifierOptional(); 
 | 
        bool ParsePointerModifiersOptional(); 
 | 
        bool ParseByRefModifiersOptional(); 
 | 
  
 | 
        static bool ParseVersion(const std::string& version, uint16_t& major, uint16_t& minor, uint16_t& build, uint16_t& revision); 
 | 
  
 | 
        TypeNameParseInfo &_info; 
 | 
  
 | 
        bool _is_nested; 
 | 
        bool _accept_assembly_name; 
 | 
        std::string::const_iterator _p; 
 | 
        std::string::const_iterator _end; 
 | 
    }; 
 | 
  
 | 
    class LIBIL2CPP_CODEGEN_API Type 
 | 
    { 
 | 
    public: 
 | 
        // exported 
 | 
        static void GetNameChunkedRecurse(const Il2CppType * type, Il2CppTypeNameFormat format, void(*reportFunc)(void *data, void *userData), void * userData); 
 | 
        static std::string GetName(const Il2CppType *type, Il2CppTypeNameFormat format); 
 | 
        static int GetType(const Il2CppType *type); 
 | 
        static Il2CppClass* GetClassOrElementClass(const Il2CppType *type); 
 | 
        static const Il2CppType* GetUnderlyingType(const Il2CppType *type); 
 | 
        static uint32_t GetToken(const Il2CppType *type); 
 | 
        static bool IsGenericInstance(const Il2CppType *type); 
 | 
        static Il2CppReflectionType* GetDeclaringType(const Il2CppType* type); 
 | 
        static Il2CppArray* GetGenericArgumentsInternal(Il2CppReflectionType* type, bool runtimeArray); 
 | 
        static bool IsEqualToType(const Il2CppType *type, const Il2CppType *otherType); 
 | 
        static Il2CppReflectionType* GetTypeFromHandle(intptr_t handle); 
 | 
  
 | 
    public: 
 | 
        // internal 
 | 
        static void GetNameChunkedRecurseInternal(const Il2CppType * type, Il2CppTypeNameFormat format, bool is_nested, void(*reportFunc)(void *data, void *userData), void * userData); 
 | 
        static void GetNameInternal(std::string &oss, const Il2CppType *type, Il2CppTypeNameFormat format, bool is_nested); 
 | 
        static bool IsReference(const Il2CppType* type); 
 | 
        static bool IsStruct(const Il2CppType* type); 
 | 
        static bool GenericInstIsValuetype(const Il2CppType* type); 
 | 
  
 | 
        static bool IsEnum(const Il2CppType *type); 
 | 
        static bool IsValueType(const Il2CppType *type); 
 | 
        static bool IsEmptyType(const Il2CppType *type); 
 | 
  
 | 
        static bool IsSystemDBNull(const Il2CppType *type); 
 | 
        static bool IsSystemDateTime(const Il2CppType *type); 
 | 
        static bool IsSystemDecimal(const Il2CppType *type); 
 | 
  
 | 
        static Il2CppClass* GetClass(const Il2CppType *type); 
 | 
        static const Il2CppGenericParameter* GetGenericParameter(const Il2CppType *type); 
 | 
        static const Il2CppType* GetGenericTypeDefintion(const Il2CppType* type); 
 | 
  
 | 
        static void ConstructDelegate(Il2CppDelegate* delegate, Il2CppObject* target, Il2CppMethodPointer addr, const MethodInfo* method); 
 | 
  
 | 
        static Il2CppString* AppendAssemblyNameIfNecessary(Il2CppString* typeName, const char* assemblyName); 
 | 
    }; 
 | 
} /* namespace vm */ 
 | 
} /* namespace il2cpp */ 
 |