Beispiel #1
0
        internal static TypeSignatureDescriptor ExtractType(byte[] sig, ref int index, MetadataOnlyModule resolver, GenericContext context, bool fAllowPinned)
        {
            TypeSignatureDescriptor typeSignatureDescriptor = new TypeSignatureDescriptor()
            {
                IsPinned = false
            };

            System.Reflection.Adds.CorElementType corElementType = SignatureUtil.ExtractElementType(sig, ref index);
            switch (corElementType)
            {
            case System.Reflection.Adds.CorElementType.End:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar | System.Reflection.Adds.CorElementType.GenericInstantiation:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long:
            case System.Reflection.Adds.CorElementType.Internal:
            case System.Reflection.Adds.CorElementType.Max:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte:
            case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Max:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int:
            case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Float:
            case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.String:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Pointer | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.String | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt:
            case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Max:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.GenericInstantiation:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.TypedByRef:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar | System.Reflection.Adds.CorElementType.GenericInstantiation:
            case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int:
            case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.FnPtr | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Float:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.SzArray | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.GenericInstantiation:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.String | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.MethodVar:
            case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.CModReqd | System.Reflection.Adds.CorElementType.FnPtr | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Pointer | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.String | System.Reflection.Adds.CorElementType.SzArray | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar | System.Reflection.Adds.CorElementType.MethodVar | System.Reflection.Adds.CorElementType.GenericInstantiation:
            case System.Reflection.Adds.CorElementType.Modifier:
            case System.Reflection.Adds.CorElementType.Sentinel:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Modifier:
            case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Modifier | System.Reflection.Adds.CorElementType.Sentinel | System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Modifier:
            {
                throw new ArgumentException(MetadataStringTable.IncorrectElementTypeValue);
            }

            case System.Reflection.Adds.CorElementType.Void:
            case System.Reflection.Adds.CorElementType.Bool:
            case System.Reflection.Adds.CorElementType.Char:
            case System.Reflection.Adds.CorElementType.SByte:
            case System.Reflection.Adds.CorElementType.Byte:
            case System.Reflection.Adds.CorElementType.Short:
            case System.Reflection.Adds.CorElementType.UShort:
            case System.Reflection.Adds.CorElementType.Int:
            case System.Reflection.Adds.CorElementType.UInt:
            case System.Reflection.Adds.CorElementType.Long:
            case System.Reflection.Adds.CorElementType.ULong:
            case System.Reflection.Adds.CorElementType.Float:
            case System.Reflection.Adds.CorElementType.Double:
            case System.Reflection.Adds.CorElementType.String:
            case System.Reflection.Adds.CorElementType.IntPtr:
            case System.Reflection.Adds.CorElementType.UIntPtr:
            case System.Reflection.Adds.CorElementType.Object:
            {
                typeSignatureDescriptor.Type = resolver.AssemblyResolver.GetBuiltInType(corElementType);
                break;
            }

            case System.Reflection.Adds.CorElementType.Pointer:
            {
                typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context).MakePointerType();
                break;
            }

            case System.Reflection.Adds.CorElementType.Byref:
            {
                typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context).MakeByRefType();
                break;
            }

            case System.Reflection.Adds.CorElementType.ValueType:
            case System.Reflection.Adds.CorElementType.Class:
            {
                Token token = SignatureUtil.ExtractToken(sig, ref index);
                typeSignatureDescriptor.Type = resolver.ResolveTypeTokenInternal(token, context);
                break;
            }

            case System.Reflection.Adds.CorElementType.TypeVar:
            {
                int num = SignatureUtil.ExtractInt(sig, ref index);
                if (GenericContext.IsNullOrEmptyTypeArgs(context))
                {
                    throw new ArgumentException(MetadataStringTable.TypeArgumentCannotBeResolved);
                }
                typeSignatureDescriptor.Type = context.TypeArgs[num];
                break;
            }

            case System.Reflection.Adds.CorElementType.Array:
            {
                Type type = SignatureUtil.ExtractType(sig, ref index, resolver, context);
                int  num1 = SignatureUtil.ExtractInt(sig, ref index);
                int  num2 = SignatureUtil.ExtractInt(sig, ref index);
                for (int i = 0; i < num2; i++)
                {
                    SignatureUtil.ExtractInt(sig, ref index);
                }
                int num3 = SignatureUtil.ExtractInt(sig, ref index);
                for (int j = 0; j < num3; j++)
                {
                    SignatureUtil.ExtractInt(sig, ref index);
                }
                typeSignatureDescriptor.Type = type.MakeArrayType(num1);
                break;
            }

            case System.Reflection.Adds.CorElementType.GenericInstantiation:
            {
                Type   type1     = SignatureUtil.ExtractType(sig, ref index, resolver, null);
                Type[] typeArray = new Type[SignatureUtil.ExtractInt(sig, ref index)];
                for (int k = 0; k < (int)typeArray.Length; k++)
                {
                    typeArray[k] = SignatureUtil.ExtractType(sig, ref index, resolver, context);
                }
                typeSignatureDescriptor.Type = type1.MakeGenericType(typeArray);
                break;
            }

            case System.Reflection.Adds.CorElementType.TypedByRef:
            {
                typeSignatureDescriptor.Type = resolver.AssemblyResolver.GetTypeXFromName("System.TypedReference");
                break;
            }

            case System.Reflection.Adds.CorElementType.FnPtr:
            {
                SignatureUtil.ExtractCallingConvention(sig, ref index);
                int num4 = SignatureUtil.ExtractInt(sig, ref index);
                SignatureUtil.ExtractType(sig, ref index, resolver, context);
                for (int l = 0; l < num4; l++)
                {
                    SignatureUtil.ExtractType(sig, ref index, resolver, context);
                }
                typeSignatureDescriptor.Type = resolver.AssemblyResolver.GetBuiltInType(System.Reflection.Adds.CorElementType.IntPtr);
                break;
            }

            case System.Reflection.Adds.CorElementType.SzArray:
            {
                typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context).MakeArrayType();
                break;
            }

            case System.Reflection.Adds.CorElementType.MethodVar:
            {
                int num5 = SignatureUtil.ExtractInt(sig, ref index);
                if (GenericContext.IsNullOrEmptyMethodArgs(context))
                {
                    throw new ArgumentException(MetadataStringTable.TypeArgumentCannotBeResolved);
                }
                typeSignatureDescriptor.Type = context.MethodArgs[num5];
                break;
            }

            case System.Reflection.Adds.CorElementType.CModReqd:
            {
                Token token1 = SignatureUtil.ExtractToken(sig, ref index);
                resolver.ResolveTypeTokenInternal(token1, context);
                typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context);
                break;
            }

            case System.Reflection.Adds.CorElementType.CModOpt:
            {
                Token token2 = SignatureUtil.ExtractToken(sig, ref index);
                resolver.ResolveTypeTokenInternal(token2, context);
                typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context);
                break;
            }

            case System.Reflection.Adds.CorElementType.Pinned:
            {
                typeSignatureDescriptor.IsPinned = true;
                typeSignatureDescriptor.Type     = SignatureUtil.ExtractType(sig, ref index, resolver, context);
                break;
            }

            default:
            {
                throw new ArgumentException(MetadataStringTable.IncorrectElementTypeValue);
            }
            }
            return(typeSignatureDescriptor);
        }
Beispiel #2
0
        internal static Type ExtractType(byte[] sig, ref int index, MetadataOnlyModule resolver, GenericContext context)
        {
            TypeSignatureDescriptor typeSignatureDescriptor = SignatureUtil.ExtractType(sig, ref index, resolver, context, false);

            return(typeSignatureDescriptor.Type);
        }