예제 #1
0
        [System.Security.SecurityCritical]  // auto-generated
        private void AddOneArgTypeHelperWorker(Type clsArgument, bool lastWasGenericInst)
        {
            if (clsArgument.IsGenericParameter)
            {
                if (clsArgument.DeclaringMethod != null)
                {
                    AddElementType(CorElementType.MVar);
                }
                else
                {
                    AddElementType(CorElementType.Var);
                }

                AddData(clsArgument.GenericParameterPosition);
            }
            else if (clsArgument.IsGenericType && (!clsArgument.IsGenericTypeDefinition || !lastWasGenericInst))
            {
                AddElementType(CorElementType.GenericInst);

                AddOneArgTypeHelperWorker(clsArgument.GetGenericTypeDefinition(), true);

                Type[] args = clsArgument.GetGenericArguments();

                AddData(args.Length);

                foreach (Type t in args)
                {
                    AddOneArgTypeHelper(t);
                }
            }
            else if (clsArgument is TypeBuilder)
            {
                TypeBuilder clsBuilder = (TypeBuilder)clsArgument;
                TypeToken   tkType;

                if (clsBuilder.Module.Equals(m_module))
                {
                    tkType = clsBuilder.TypeToken;
                }
                else
                {
                    tkType = m_module.GetTypeToken(clsArgument);
                }

                if (clsArgument.IsValueType)
                {
                    InternalAddTypeToken(tkType, CorElementType.ValueType);
                }
                else
                {
                    InternalAddTypeToken(tkType, CorElementType.Class);
                }
            }
            else if (clsArgument is EnumBuilder)
            {
                TypeBuilder clsBuilder = ((EnumBuilder)clsArgument).m_typeBuilder;
                TypeToken   tkType;

                if (clsBuilder.Module.Equals(m_module))
                {
                    tkType = clsBuilder.TypeToken;
                }
                else
                {
                    tkType = m_module.GetTypeToken(clsArgument);
                }

                if (clsArgument.IsValueType)
                {
                    InternalAddTypeToken(tkType, CorElementType.ValueType);
                }
                else
                {
                    InternalAddTypeToken(tkType, CorElementType.Class);
                }
            }
            else if (clsArgument.IsByRef)
            {
                AddElementType(CorElementType.ByRef);
                clsArgument = clsArgument.GetElementType();
                AddOneArgTypeHelper(clsArgument);
            }
            else if (clsArgument.IsPointer)
            {
                AddElementType(CorElementType.Ptr);
                AddOneArgTypeHelper(clsArgument.GetElementType());
            }
            else if (clsArgument.IsArray)
            {
                if (clsArgument.IsSzArray)
                {
                    AddElementType(CorElementType.SzArray);

                    AddOneArgTypeHelper(clsArgument.GetElementType());
                }
                else
                {
                    AddElementType(CorElementType.Array);

                    AddOneArgTypeHelper(clsArgument.GetElementType());

                    // put the rank information
                    int rank = clsArgument.GetArrayRank();
                    AddData(rank);  // rank
                    AddData(0);     // upper bounds
                    AddData(rank);  // lower bound
                    for (int i = 0; i < rank; i++)
                    {
                        AddData(0);
                    }
                }
            }
            else
            {
                CorElementType type = CorElementType.Max;

                if (clsArgument is RuntimeType)
                {
                    type = RuntimeTypeHandle.GetCorElementType((RuntimeType)clsArgument);

                    //GetCorElementType returns CorElementType.Class for both object and string
                    if (type == CorElementType.Class)
                    {
                        if (clsArgument == typeof(object))
                        {
                            type = CorElementType.Object;
                        }
                        else if (clsArgument == typeof(string))
                        {
                            type = CorElementType.String;
                        }
                    }
                }

                if (IsSimpleType(type))
                {
                    AddElementType(type);
                }
                else if (m_module == null)
                {
                    InternalAddRuntimeType(clsArgument);
                }
                else if (clsArgument.IsValueType)
                {
                    InternalAddTypeToken(m_module.GetTypeToken(clsArgument), CorElementType.ValueType);
                }
                else
                {
                    InternalAddTypeToken(m_module.GetTypeToken(clsArgument), CorElementType.Class);
                }
            }
        }
예제 #2
0
        private void AddOneArgTypeHelperWorker(Type clsArgument, bool lastWasGenericInst)
        {
            if (clsArgument.IsGenericParameter)
            {
                if (clsArgument.DeclaringMethod != null)
                {
                    AddElementType(CorElementType.ELEMENT_TYPE_MVAR);
                }
                else
                {
                    AddElementType(CorElementType.ELEMENT_TYPE_VAR);
                }

                AddData(clsArgument.GenericParameterPosition);
            }
            else if (clsArgument.IsGenericType && (!clsArgument.IsGenericTypeDefinition || !lastWasGenericInst))
            {
                AddElementType(CorElementType.ELEMENT_TYPE_GENERICINST);

                AddOneArgTypeHelperWorker(clsArgument.GetGenericTypeDefinition(), true);

                Type[] args = clsArgument.GetGenericArguments();

                AddData(args.Length);

                foreach (Type t in args)
                {
                    AddOneArgTypeHelper(t);
                }
            }
            else if (clsArgument is TypeBuilder)
            {
                TypeBuilder clsBuilder = (TypeBuilder)clsArgument;
                TypeToken   tkType;

                if (clsBuilder.Module.Equals(m_module))
                {
                    tkType = clsBuilder.TypeToken;
                }
                else
                {
                    tkType = m_module !.GetTypeToken(clsArgument);
                }

                if (clsArgument.IsValueType)
                {
                    InternalAddTypeToken(tkType, CorElementType.ELEMENT_TYPE_VALUETYPE);
                }
                else
                {
                    InternalAddTypeToken(tkType, CorElementType.ELEMENT_TYPE_CLASS);
                }
            }
            else if (clsArgument is EnumBuilder)
            {
                TypeBuilder clsBuilder = ((EnumBuilder)clsArgument).m_typeBuilder;
                TypeToken   tkType;

                if (clsBuilder.Module.Equals(m_module))
                {
                    tkType = clsBuilder.TypeToken;
                }
                else
                {
                    tkType = m_module !.GetTypeToken(clsArgument);
                }

                if (clsArgument.IsValueType)
                {
                    InternalAddTypeToken(tkType, CorElementType.ELEMENT_TYPE_VALUETYPE);
                }
                else
                {
                    InternalAddTypeToken(tkType, CorElementType.ELEMENT_TYPE_CLASS);
                }
            }
            else if (clsArgument.IsByRef)
            {
                AddElementType(CorElementType.ELEMENT_TYPE_BYREF);
                clsArgument = clsArgument.GetElementType() !;
                AddOneArgTypeHelper(clsArgument);
            }
            else if (clsArgument.IsPointer)
            {
                AddElementType(CorElementType.ELEMENT_TYPE_PTR);
                AddOneArgTypeHelper(clsArgument.GetElementType() !);
            }
            else if (clsArgument.IsArray)
            {
                if (clsArgument.IsSZArray)
                {
                    AddElementType(CorElementType.ELEMENT_TYPE_SZARRAY);

                    AddOneArgTypeHelper(clsArgument.GetElementType() !);
                }
                else
                {
                    AddElementType(CorElementType.ELEMENT_TYPE_ARRAY);

                    AddOneArgTypeHelper(clsArgument.GetElementType() !);

                    // put the rank information
                    int rank = clsArgument.GetArrayRank();
                    AddData(rank);  // rank
                    AddData(0);     // upper bounds
                    AddData(rank);  // lower bound
                    for (int i = 0; i < rank; i++)
                    {
                        AddData(0);
                    }
                }
            }
            else
            {
                CorElementType type = CorElementType.ELEMENT_TYPE_MAX;

                if (clsArgument is RuntimeType)
                {
                    type = RuntimeTypeHandle.GetCorElementType((RuntimeType)clsArgument);

                    //GetCorElementType returns CorElementType.ELEMENT_TYPE_CLASS for both object and string
                    if (type == CorElementType.ELEMENT_TYPE_CLASS)
                    {
                        if (clsArgument == typeof(object))
                        {
                            type = CorElementType.ELEMENT_TYPE_OBJECT;
                        }
                        else if (clsArgument == typeof(string))
                        {
                            type = CorElementType.ELEMENT_TYPE_STRING;
                        }
                    }
                }

                if (IsSimpleType(type))
                {
                    AddElementType(type);
                }
                else if (m_module == null)
                {
                    InternalAddRuntimeType(clsArgument);
                }
                else if (clsArgument.IsValueType)
                {
                    InternalAddTypeToken(m_module.GetTypeToken(clsArgument), CorElementType.ELEMENT_TYPE_VALUETYPE);
                }
                else
                {
                    InternalAddTypeToken(m_module.GetTypeToken(clsArgument), CorElementType.ELEMENT_TYPE_CLASS);
                }
            }
        }
 private void AddOneArgTypeHelperWorker(Type clsArgument, bool lastWasGenericInst)
 {
     if (clsArgument.IsGenericParameter)
     {
         if (clsArgument.DeclaringMethod != null)
         {
             this.AddElementType(CorElementType.MVar);
         }
         else
         {
             this.AddElementType(CorElementType.Var);
         }
         this.AddData(clsArgument.GenericParameterPosition);
     }
     else if (clsArgument.IsGenericType && (!clsArgument.IsGenericTypeDefinition || !lastWasGenericInst))
     {
         this.AddElementType(CorElementType.GenericInst);
         this.AddOneArgTypeHelperWorker(clsArgument.GetGenericTypeDefinition(), true);
         Type[] genericArguments = clsArgument.GetGenericArguments();
         this.AddData(genericArguments.Length);
         foreach (Type type in genericArguments)
         {
             this.AddOneArgTypeHelper(type);
         }
     }
     else if (clsArgument is TypeBuilder)
     {
         TypeToken   typeToken;
         TypeBuilder builder = (TypeBuilder)clsArgument;
         if (builder.Module.Equals(this.m_module))
         {
             typeToken = builder.TypeToken;
         }
         else
         {
             typeToken = this.m_module.GetTypeToken(clsArgument);
         }
         if (clsArgument.IsValueType)
         {
             this.InternalAddTypeToken(typeToken, CorElementType.ValueType);
         }
         else
         {
             this.InternalAddTypeToken(typeToken, CorElementType.Class);
         }
     }
     else if (clsArgument is EnumBuilder)
     {
         TypeToken   token2;
         TypeBuilder typeBuilder = ((EnumBuilder)clsArgument).m_typeBuilder;
         if (typeBuilder.Module.Equals(this.m_module))
         {
             token2 = typeBuilder.TypeToken;
         }
         else
         {
             token2 = this.m_module.GetTypeToken(clsArgument);
         }
         if (clsArgument.IsValueType)
         {
             this.InternalAddTypeToken(token2, CorElementType.ValueType);
         }
         else
         {
             this.InternalAddTypeToken(token2, CorElementType.Class);
         }
     }
     else if (clsArgument.IsByRef)
     {
         this.AddElementType(CorElementType.ByRef);
         clsArgument = clsArgument.GetElementType();
         this.AddOneArgTypeHelper(clsArgument);
     }
     else if (clsArgument.IsPointer)
     {
         this.AddElementType(CorElementType.Ptr);
         this.AddOneArgTypeHelper(clsArgument.GetElementType());
     }
     else if (clsArgument.IsArray)
     {
         if (clsArgument.IsSzArray)
         {
             this.AddElementType(CorElementType.SzArray);
             this.AddOneArgTypeHelper(clsArgument.GetElementType());
         }
         else
         {
             this.AddElementType(CorElementType.Array);
             this.AddOneArgTypeHelper(clsArgument.GetElementType());
             int arrayRank = clsArgument.GetArrayRank();
             this.AddData(arrayRank);
             this.AddData(0);
             this.AddData(arrayRank);
             for (int i = 0; i < arrayRank; i++)
             {
                 this.AddData(0);
             }
         }
     }
     else
     {
         CorElementType max = CorElementType.Max;
         if (clsArgument.IsRuntimeType)
         {
             max = RuntimeTypeHandle.GetCorElementType((RuntimeType)clsArgument);
             if (max == CorElementType.Class)
             {
                 if (clsArgument == typeof(object))
                 {
                     max = CorElementType.Object;
                 }
                 else if (clsArgument == typeof(string))
                 {
                     max = CorElementType.String;
                 }
             }
         }
         if (IsSimpleType(max))
         {
             this.AddElementType(max);
         }
         else if (this.m_module == null)
         {
             this.InternalAddRuntimeType(clsArgument);
         }
         else if (clsArgument.IsValueType)
         {
             this.InternalAddTypeToken(this.m_module.GetTypeToken(clsArgument), CorElementType.ValueType);
         }
         else
         {
             this.InternalAddTypeToken(this.m_module.GetTypeToken(clsArgument), CorElementType.Class);
         }
     }
 }