[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); } } }
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); } } }