コード例 #1
0
        public      LocalVariableDefinition[] ParseLocalsSignature()
        {
            if (_reader.ReadSignatureHeader().Kind != SignatureKind.LocalVariables)
            {
                throw new BadImageFormatException();
            }

            int count = _reader.ReadCompressedInteger();

            LocalVariableDefinition[] locals;

            if (count > 0)
            {
                locals = new LocalVariableDefinition[count];
                for (int i = 0; i < count; i++)
                {
                    bool isPinned = false;

                    SignatureTypeCode typeCode = ParseTypeCode();
                    if (typeCode == SignatureTypeCode.Pinned)
                    {
                        isPinned = true;
                        typeCode = ParseTypeCode();
                    }

                    locals[i] = new LocalVariableDefinition(ParseType(typeCode), isPinned);
                }
            }
            else
            {
                locals = Array.Empty <LocalVariableDefinition>();
            }
            return(locals);
        }
コード例 #2
0
        public      LocalVariableDefinition[] ParseLocalsSignature()
        {
            if ((_reader.ReadByte() & 0xF) != 7) // IMAGE_CEE_CS_CALLCONV_LOCAL_SIG - add it to SignatureCallingConvention?
            {
                throw new BadImageFormatException();
            }

            int count = _reader.ReadCompressedInteger();

            LocalVariableDefinition[] locals;

            if (count > 0)
            {
                locals = new LocalVariableDefinition[count];
                for (int i = 0; i < count; i++)
                {
                    bool isPinned = false;

                    SignatureTypeCode typeCode = ParseTypeCode();
                    if (typeCode == SignatureTypeCode.Pinned)
                    {
                        isPinned = true;
                        typeCode = ParseTypeCode();
                    }

                    locals[i] = new LocalVariableDefinition(ParseType(typeCode), isPinned);
                }
            }
            else
            {
                locals = Array.Empty <LocalVariableDefinition>();
            }
            return(locals);
        }
コード例 #3
0
ファイル: TypeSignature.cs プロジェクト: jfd16/Mariana
        private TypeSignature _addTypeCodePrefix(SignatureTypeCode code)
        {
            if (isByRef())
            {
                throw new InvalidOperationException("Cannot use a by-ref type as the element type of an array, pointer or by-ref type.");
            }

            int compactLength = (int)(m_compact >> 56);

            if (compactLength < 7)
            {
                return(new TypeSignature((long)(compactLength + 1) << 56 | m_compact << 8 | (byte)code));
            }

            var builder = TypeSignatureBuilder.getInstance();

            try {
                builder.appendByte((byte)code);
                builder.appendSignature(this);
                return(builder.makeSignature());
            }
            finally {
                builder.clear();
            }
        }
コード例 #4
0
        // Decodes a fixed argument type of a custom attribute from its constructor signature.
        //
        // Note that we do not decode the full constructor signature using DecodeMethodSignature
        // but instead decode one parameter at a time as we read the value blob. This is both
        // better perf-wise, but even more important is that we can't actually reason about
        // a method signature with opaque TType values without adding some unnecessary chatter
        // with the provider.
        private ArgumentTypeInfo DecodeFixedArgumentType(ref BlobReader signatureReader, bool isElementType = false)
        {
            SignatureTypeCode signatureTypeCode = signatureReader.ReadSignatureTypeCode();

            var info = new ArgumentTypeInfo
            {
                TypeCode = (SerializationTypeCode)signatureTypeCode,
            };

            switch (signatureTypeCode)
            {
            case SignatureTypeCode.Boolean:
            case SignatureTypeCode.Byte:
            case SignatureTypeCode.Char:
            case SignatureTypeCode.Double:
            case SignatureTypeCode.Int16:
            case SignatureTypeCode.Int32:
            case SignatureTypeCode.Int64:
            case SignatureTypeCode.SByte:
            case SignatureTypeCode.Single:
            case SignatureTypeCode.String:
            case SignatureTypeCode.UInt16:
            case SignatureTypeCode.UInt32:
            case SignatureTypeCode.UInt64:
                info.Type = _provider.GetPrimitiveType((PrimitiveTypeCode)signatureTypeCode);
                break;

            case SignatureTypeCode.Object:
                info.TypeCode = SerializationTypeCode.TaggedObject;
                info.Type     = _provider.GetPrimitiveType(PrimitiveTypeCode.Object);
                break;

            case SignatureTypeCode.TypeHandle:
                // Parameter is type def or ref and is only allowed to be System.Type or Enum.
                EntityHandle handle = signatureReader.ReadTypeHandle();
                info.Type     = GetTypeFromHandle(handle);
                info.TypeCode = _provider.IsSystemType(info.Type) ? SerializationTypeCode.Type : (SerializationTypeCode)_provider.GetUnderlyingEnumType(info.Type);
                break;

            case SignatureTypeCode.SZArray:
                if (isElementType)
                {
                    // jagged arrays are not allowed.
                    throw new BadImageFormatException();
                }

                var elementInfo = DecodeFixedArgumentType(ref signatureReader, isElementType: true);
                info.ElementType     = elementInfo.Type;
                info.ElementTypeCode = elementInfo.TypeCode;
                info.Type            = _provider.GetSZArrayType(info.ElementType);
                break;

            default:
                throw new BadImageFormatException();
            }

            return(info);
        }
コード例 #5
0
        private void InspectFields(FieldDefinitionHandleCollection fields)
        {
            foreach (var fieldHandle in fields)
            {
                var inspectorField = new InspectorField();

                var fieldDef = metaReader.GetFieldDefinition(fieldHandle);

                var customAttr = fieldDef.GetCustomAttributes();

                foreach (var caHandle in customAttr)
                {
                    // Look for InspectorAttribute
                    if (DecodeCustomAttribute(caHandle, inspectorField))
                    {
                        BlobReader      sigReader = metaReader.GetBlobReader(fieldDef.Signature);
                        SignatureHeader header    = sigReader.ReadSignatureHeader();

                        if (header.Kind != SignatureKind.Field)
                        {
                            continue;
                        }

                        var typeCode = sigReader.ReadSignatureTypeCode();

                        string typeName = typeCode.ToString();

                        if (typeCode == SignatureTypeCode.SZArray)
                        {
                            inspectorField.IsArray = true;
                            SignatureTypeCode code = sigReader.ReadSignatureTypeCode();

                            if (code == SignatureTypeCode.TypeHandle)
                            {
                                bool isEnum;
                                DecodeTypeHandleTypeName(sigReader, out typeName, out isEnum);
                            }
                            else
                            {
                                typeName = code.ToString();
                            }
                        }
                        else if (typeCode == SignatureTypeCode.TypeHandle)
                        {
                            bool isEnum;
                            DecodeTypeHandleTypeName(sigReader, out typeName, out isEnum);
                            inspectorField.IsEnum = isEnum;
                        }

                        inspectorField.TypeName = typeName;
                        inspectorField.Name     = metaReader.GetString(fieldDef.Name);
                        _inspectorComponent.Fields[inspectorField.Name] = inspectorField;

                        break;
                    }
                }
            }
        }
コード例 #6
0
        private TypeSignature DecodeType(ref BlobReader signatureReader, SignatureTypeCode typeCode)
        {
            switch (typeCode)
            {
            case SignatureTypeCode.TypeHandle:
            {
                int typeArgumentOffset = 0;
                return(DecodeType(signatureReader.ReadTypeHandle(), ImmutableArray <TypeSignature> .Empty, ref typeArgumentOffset));
            }

            case SignatureTypeCode.Array:
            {
                var elementType = DecodeModifiersAndType(ref signatureReader);
                int rank;
                int sizes;
                signatureReader.TryReadCompressedInteger(out rank);
                signatureReader.TryReadCompressedInteger(out sizes);
                if (sizes != 0)
                {
                    throw UnhandledMetadata();
                }
                return(new ArrayTypeSignature(elementType, rank));
            }

            case SignatureTypeCode.SZArray:
            {
                var elementType = DecodeModifiersAndType(ref signatureReader);
                return(new ArrayTypeSignature(elementType, 1));
            }

            case SignatureTypeCode.GenericTypeInstance:
                return(DecodeGenericTypeInstance(ref signatureReader));

            case SignatureTypeCode.Pointer:
            {
                var pointedAtType = DecodeModifiersAndType(ref signatureReader);
                return(new PointerTypeSignature(pointedAtType));
            }

            case SignatureTypeCode.GenericTypeParameter:
                return(DecodeGenericTypeParameter(ref signatureReader, _allTypeParameters, _containingArity));

            case SignatureTypeCode.GenericMethodParameter:
                return(DecodeGenericTypeParameter(ref signatureReader, _methodTypeParameters, 0));

            default:
            {
                var signature = typeCode.ToSpecialType().GetTypeSignature();
                if (signature == null)
                {
                    throw UnhandledMetadata();
                }
                return(signature);
            }
            }
        }
コード例 #7
0
        public CustomAttributeValue <TType> DecodeValue(EntityHandle constructor, BlobHandle value)
        {
            BlobHandle signature;

            switch (constructor.Kind)
            {
            case HandleKind.MethodDefinition:
                MethodDefinition definition = _reader.GetMethodDefinition((MethodDefinitionHandle)constructor);
                signature = definition.Signature;
                break;

            case HandleKind.MemberReference:
                MemberReference reference = _reader.GetMemberReference((MemberReferenceHandle)constructor);
                signature = reference.Signature;
                break;

            default:
                throw new BadImageFormatException();
            }

            BlobReader signatureReader = _reader.GetBlobReader(signature);
            BlobReader valueReader     = _reader.GetBlobReader(value);

            ushort prolog = valueReader.ReadUInt16();

            if (prolog != 1)
            {
                throw new BadImageFormatException();
            }

            SignatureHeader header = signatureReader.ReadSignatureHeader();

            if (header.Kind != SignatureKind.Method || header.IsGeneric)
            {
                throw new BadImageFormatException();
            }

            int parameterCount           = signatureReader.ReadCompressedInteger();
            SignatureTypeCode returnType = signatureReader.ReadSignatureTypeCode();

            if (returnType != SignatureTypeCode.Void)
            {
                throw new BadImageFormatException();
            }

            ImmutableArray <CustomAttributeTypedArgument <TType> > fixedArguments = DecodeFixedArguments(ref signatureReader, ref valueReader, parameterCount);
            ImmutableArray <CustomAttributeNamedArgument <TType> > namedArguments = DecodeNamedArguments(ref valueReader);

            return(new CustomAttributeValue <TType>(fixedArguments, namedArguments));
        }
コード例 #8
0
ファイル: SignatureComparer.cs プロジェクト: belav/roslyn
        private static bool IsByRef(ImmutableArray <byte> signature, ref int position)
        {
            SignatureTypeCode typeCode = (SignatureTypeCode)signature[position];

            if (typeCode == SignatureTypeCode.ByReference)
            {
                position++;
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #9
0
ファイル: MetadataDecoder.cs プロジェクト: XieShuquan/roslyn
 // cf. MetadataDecoder<>.DecodeTypeOrThrow.
 private TypeSignature DecodeType(ref BlobReader signatureReader, SignatureTypeCode typeCode)
 {
     switch (typeCode)
     {
         case SignatureTypeCode.TypeHandle:
             {
                 int typeArgumentOffset = 0;
                 return DecodeType(signatureReader.ReadTypeHandle(), ImmutableArray<TypeSignature>.Empty, ref typeArgumentOffset);
             }
         case SignatureTypeCode.Array:
             {
                 var elementType = DecodeModifiersAndType(ref signatureReader);
                 int rank;
                 int sizes;
                 signatureReader.TryReadCompressedInteger(out rank);
                 signatureReader.TryReadCompressedInteger(out sizes);
                 if (sizes != 0)
                 {
                     throw UnhandledMetadata();
                 }
                 return new ArrayTypeSignature(elementType, rank);
             }
         case SignatureTypeCode.SZArray:
             {
                 var elementType = DecodeModifiersAndType(ref signatureReader);
                 return new ArrayTypeSignature(elementType, 1);
             }
         case SignatureTypeCode.GenericTypeInstance:
             return DecodeGenericTypeInstance(ref signatureReader);
         case SignatureTypeCode.Pointer:
             {
                 var pointedAtType = DecodeModifiersAndType(ref signatureReader);
                 return new PointerTypeSignature(pointedAtType);
             }
         case SignatureTypeCode.GenericTypeParameter:
             return DecodeGenericTypeParameter(ref signatureReader, _allTypeParameters, _containingArity);
         case SignatureTypeCode.GenericMethodParameter:
             return DecodeGenericTypeParameter(ref signatureReader, _methodTypeParameters, 0);
         default:
             {
                 var signature = typeCode.ToSpecialType().GetTypeSignature();
                 if (signature == null)
                 {
                     throw UnhandledMetadata();
                 }
                 return signature;
             }
     }
 }
コード例 #10
0
        private static string GetTypeName(SignatureTypeCode typeCode)
        {
            switch (typeCode)
            {
            case SignatureTypeCode.Boolean: return("[bool]");

            case SignatureTypeCode.Int32: return("[int]");

            case SignatureTypeCode.String: return("[string]");

            case SignatureTypeCode.Object: return("[object]");

            default: return(null);
            }
        }
コード例 #11
0
        private TypeDesc ParseType(SignatureTypeCode typeCode)
        {
            if (_indexStack != null)
            {
                int was = _indexStack.Pop();
                _indexStack.Push(was + 1);
                _indexStack.Push(0);
            }
            TypeDesc result = ParseTypeImpl(typeCode);

            if (_indexStack != null)
            {
                _indexStack.Pop();
            }
            return(result);
        }
コード例 #12
0
        private SignatureTypeCode ParseTypeCode(bool skipPinned = true)
        {
            if (_indexStack != null)
            {
                int was = _indexStack.Pop();
                _indexStack.Push(was + 1);
                _indexStack.Push(0);
            }
            SignatureTypeCode result = ParseTypeCodeImpl(skipPinned);

            if (_indexStack != null)
            {
                _indexStack.Pop();
            }
            return(result);
        }
コード例 #13
0
        private SignatureTypeCode ParseTypeCode()
        {
            for (;;)
            {
                SignatureTypeCode typeCode = _reader.ReadSignatureTypeCode();

                if (typeCode != SignatureTypeCode.RequiredModifier && typeCode != SignatureTypeCode.OptionalModifier)
                {
                    return(typeCode);
                }

                _reader.ReadTypeHandle();

                // _hasModifiers = true;
            }
        }
コード例 #14
0
        private CilEntity GetTypeEntity()
        {
            BlobReader        blobReader = _readers.MdReader.GetBlobReader(_typeSpecification.Signature);
            SignatureTypeCode typeCode   = blobReader.ReadSignatureTypeCode();

            while (typeCode == SignatureTypeCode.GenericTypeInstance)
            {
                typeCode = blobReader.ReadSignatureTypeCode();
            }

            if (typeCode == SignatureTypeCode.TypeHandle)
            {
                Handle handle = blobReader.ReadTypeHandle();
                return(CilDecoder.DecodeEntityHandle((EntityHandle)handle, ref _readers));
            }


            return(new CilEntity(null, EntityKind.TypeSpecification));
        }
コード例 #15
0
        private static void ParseType(ImmutableArray <byte> .Builder builder, Stream stream, bool allowByRef = false)
        {
            while (true)
            {
                SignatureTypeCode typeCode = (SignatureTypeCode)stream.ReadByte();
                builder.Add((byte)typeCode);

                switch (typeCode)
                {
                default:
                    throw ExceptionUtilities.UnexpectedValue(typeCode);

                case SignatureTypeCode.TypeHandle:
                    ParseTypeHandle(builder, stream);
                    return;

                case SignatureTypeCode.GenericTypeParameter:
                case SignatureTypeCode.GenericMethodParameter:
                    builder.Add((byte)stream.ReadByte());
                    return;

                case SignatureTypeCode.ByReference:
                    if (!allowByRef)
                    {
                        goto default;
                    }
                    break;

                case SignatureTypeCode.SZArray:
                    break;

                case SignatureTypeCode.Pointer:
                    break;

                case SignatureTypeCode.GenericTypeInstance:
                    ParseGenericTypeInstance(builder, stream);
                    return;
                }

                allowByRef = false;
            }
        }
コード例 #16
0
        private SignatureTypeCode ParseTypeCodeImpl(bool skipPinned = true)
        {
            for (; ;)
            {
                SignatureTypeCode typeCode = _reader.ReadSignatureTypeCode();

                if (typeCode == SignatureTypeCode.RequiredModifier)
                {
                    EntityHandle typeHandle = _reader.ReadTypeHandle();
                    if (_embeddedSignatureDataList != null)
                    {
                        _embeddedSignatureDataList.Add(new EmbeddedSignatureData {
                            index = string.Join(".", _indexStack), kind = EmbeddedSignatureDataKind.RequiredCustomModifier, type = ResolveHandle(typeHandle)
                        });
                    }
                    continue;
                }

                if (typeCode == SignatureTypeCode.OptionalModifier)
                {
                    EntityHandle typeHandle = _reader.ReadTypeHandle();
                    if (_embeddedSignatureDataList != null)
                    {
                        _embeddedSignatureDataList.Add(new EmbeddedSignatureData {
                            index = string.Join(".", _indexStack), kind = EmbeddedSignatureDataKind.OptionalCustomModifier, type = ResolveHandle(typeHandle)
                        });
                    }
                    continue;
                }

                // TODO: treat PINNED in the signature same as modopts (it matters
                // in signature matching - you can actually define overloads on this)
                if (skipPinned && typeCode == SignatureTypeCode.Pinned)
                {
                    continue;
                }

                return(typeCode);
            }
        }
コード例 #17
0
        private bool MatchParameter(ParameterSymbol parameter, ImmutableArray <byte> signature, ref int position)
        {
            SignatureTypeCode typeCode = (SignatureTypeCode)signature[position];
            bool isByRef;

            if (typeCode == SignatureTypeCode.ByReference)
            {
                isByRef = true;
                position++;
            }
            else
            {
                isByRef = false;
            }

            if (IsByRefParam(parameter) != isByRef)
            {
                return(false);
            }

            return(MatchType(GetParamType(parameter), signature, ref position));
        }
コード例 #18
0
        public SignatureType(ref BlobReader signatureReader, MetadataReader mdReader, GenericParameterHandleCollection genericParams)
        {
            SignatureTypeCode signatureTypeCode = signatureReader.ReadSignatureTypeCode();

            Flags = 0;
            if (signatureTypeCode == SignatureTypeCode.SZArray)
            {
                Flags            |= SignatureTypeFlags.ARRAY;
                signatureTypeCode = signatureReader.ReadSignatureTypeCode();
            }

            TypeName = signatureTypeCode.ToString();
            if (signatureTypeCode == SignatureTypeCode.TypeHandle || signatureTypeCode == SignatureTypeCode.ByReference)
            {
                if (signatureTypeCode == SignatureTypeCode.ByReference)
                {
                    Flags |= SignatureTypeFlags.REFERENCE;
                }

                EntityHandle handle = signatureReader.ReadTypeHandle();
                if (handle.Kind == HandleKind.TypeDefinition)
                {
                    TypeDefinition typeDef = mdReader.GetTypeDefinition((TypeDefinitionHandle)handle);
                    TypeName = mdReader.GetString(typeDef.Name);
                }
                else if (handle.Kind == HandleKind.TypeReference)
                {
                    TypeReference typeRef = mdReader.GetTypeReference((TypeReferenceHandle)handle);
                    TypeName = mdReader.GetString(typeRef.Name);
                }
            }
            else if (signatureTypeCode == SignatureTypeCode.GenericMethodParameter)
            {
                int index = signatureReader.ReadCompressedInteger();
                GenericParameter generic = mdReader.GetGenericParameter(genericParams[index]);
                TypeName = mdReader.GetString(generic.Name);
                Flags   |= SignatureTypeFlags.GENERIC;
            }
        }
コード例 #19
0
ファイル: R2RMethod.cs プロジェクト: joymallyac/coreclr
 public SignatureType(ref BlobReader signatureReader, ref MetadataReader mdReader)
 {
     SignatureTypeCode = signatureReader.ReadSignatureTypeCode();
     IsArray           = (SignatureTypeCode == SignatureTypeCode.SZArray);
     if (IsArray)
     {
         SignatureTypeCode = signatureReader.ReadSignatureTypeCode();
     }
     ClassName = SignatureTypeCode.ToString();
     if (SignatureTypeCode == SignatureTypeCode.TypeHandle || SignatureTypeCode == SignatureTypeCode.ByReference)
     {
         EntityHandle handle = signatureReader.ReadTypeHandle();
         if (handle.Kind == HandleKind.TypeDefinition)
         {
             var typeDef = mdReader.GetTypeDefinition((TypeDefinitionHandle)handle);
             ClassName = mdReader.GetString(typeDef.Name);
         }
         else if (handle.Kind == HandleKind.TypeReference)
         {
             var typeRef = mdReader.GetTypeReference((TypeReferenceHandle)handle);
             ClassName = mdReader.GetString(typeRef.Name);
         }
     }
 }
コード例 #20
0
        private SignatureTypeCode ParseTypeCode(bool skipPinned = true)
        {
            for (;;)
            {
                SignatureTypeCode typeCode = _reader.ReadSignatureTypeCode();

                // TODO: actually consume modopts
                if (typeCode == SignatureTypeCode.RequiredModifier ||
                    typeCode == SignatureTypeCode.OptionalModifier)
                {
                    _reader.ReadTypeHandle();
                    continue;
                }

                // TODO: treat PINNED in the signature same as modopts (it matters
                // in signature matching - you can actually define overloads on this)
                if (skipPinned && typeCode == SignatureTypeCode.Pinned)
                {
                    continue;
                }

                return(typeCode);
            }
        }
コード例 #21
0
        /// <summary>
        /// Does pretty much the same thing as MetadataDecoder.DecodeType only instead of
        /// producing a type symbol it compares encoded type to the target.
        ///
        /// Signature should be in format described in MemberDescriptor.
        /// </summary>
        private bool MatchType(TypeSymbol type, ImmutableArray <byte> signature, ref int position)
        {
            if (type == null)
            {
                return(false);
            }

            int paramPosition;

            // Get the type.
            SignatureTypeCode typeCode = (SignatureTypeCode)signature[position++];

            // Switch on the type.
            switch (typeCode)
            {
            case SignatureTypeCode.TypeHandle:
                // Ecma-335 spec:
                // 23.1.16 Element types used in signatures
                // ...
                // ELEMENT_TYPE_VALUETYPE 0x11 Followed by TypeDef or TypeRef token
                // ELEMENT_TYPE_CLASS 0x12 Followed by TypeDef or TypeRef token

                return(MatchTypeToTypeId(type, signature[position++]));

            case SignatureTypeCode.Array:
                if (!MatchType(GetArrayElementType(type), signature, ref position))
                {
                    return(false);
                }

                int countOfDimensions = signature[position++];

                return(MatchArrayRank(type, countOfDimensions));

            case SignatureTypeCode.SZArray:
                return(MatchType(GetSZArrayElementType(type), signature, ref position));

            case SignatureTypeCode.Pointer:
                return(MatchType(GetPointedToType(type), signature, ref position));

            case SignatureTypeCode.GenericTypeParameter:
                paramPosition = signature[position++];
                return(IsGenericTypeParam(type, paramPosition));

            case SignatureTypeCode.GenericMethodParameter:
                paramPosition = signature[position++];
                return(IsGenericMethodTypeParam(type, paramPosition));

            case SignatureTypeCode.GenericTypeInstance:
                if (!MatchType(GetGenericTypeDefinition(type), signature, ref position))
                {
                    return(false);
                }

                int argumentCount = signature[position++];

                for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++)
                {
                    if (!MatchType(GetGenericTypeArgument(type, argumentIndex), signature, ref position))
                    {
                        return(false);
                    }
                }

                return(true);

            default:
                throw ExceptionUtilities.UnexpectedValue(typeCode);
            }
        }
コード例 #22
0
        private void EncodeType(BlobBuilder blobBuilder, TypeDesc type)
        {
            if (type.IsPrimitive)
            {
                SignatureTypeCode primitiveCode;
                switch (type.Category)
                {
                case TypeFlags.Void:
                    primitiveCode = SignatureTypeCode.Void;
                    break;

                case TypeFlags.Boolean:
                    primitiveCode = SignatureTypeCode.Boolean;
                    break;

                case TypeFlags.Char:
                    primitiveCode = SignatureTypeCode.Char;
                    break;

                case TypeFlags.SByte:
                    primitiveCode = SignatureTypeCode.SByte;
                    break;

                case TypeFlags.Byte:
                    primitiveCode = SignatureTypeCode.Byte;
                    break;

                case TypeFlags.Int16:
                    primitiveCode = SignatureTypeCode.Int16;
                    break;

                case TypeFlags.UInt16:
                    primitiveCode = SignatureTypeCode.UInt16;
                    break;

                case TypeFlags.Int32:
                    primitiveCode = SignatureTypeCode.Int32;
                    break;

                case TypeFlags.UInt32:
                    primitiveCode = SignatureTypeCode.UInt32;
                    break;

                case TypeFlags.Int64:
                    primitiveCode = SignatureTypeCode.Int64;
                    break;

                case TypeFlags.UInt64:
                    primitiveCode = SignatureTypeCode.UInt64;
                    break;

                case TypeFlags.IntPtr:
                    primitiveCode = SignatureTypeCode.IntPtr;
                    break;

                case TypeFlags.UIntPtr:
                    primitiveCode = SignatureTypeCode.UIntPtr;
                    break;

                case TypeFlags.Single:
                    primitiveCode = SignatureTypeCode.Single;
                    break;

                case TypeFlags.Double:
                    primitiveCode = SignatureTypeCode.Double;
                    break;

                default:
                    throw new Exception("Unknown primitive type");
                }

                blobBuilder.WriteByte((byte)primitiveCode);
            }
            else if (type.IsSzArray)
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.SZArray);
                EncodeType(blobBuilder, type.GetParameterType());
            }
            else if (type.IsArray)
            {
                var arrayType = (ArrayType)type;
                blobBuilder.WriteByte((byte)SignatureTypeCode.Array);
                EncodeType(blobBuilder, type.GetParameterType());
                var shapeEncoder = new ArrayShapeEncoder(blobBuilder);
                // TODO Add support for non-standard array shapes
                shapeEncoder.Shape(arrayType.Rank, default(ImmutableArray <int>), default(ImmutableArray <int>));
            }
            else if (type.IsPointer)
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.Pointer);
                EncodeType(blobBuilder, type.GetParameterType());
            }
            else if (type.IsFunctionPointer)
            {
                FunctionPointerType fnptrType = (FunctionPointerType)type;
                EncodeMethodSignature(blobBuilder, fnptrType.Signature);
            }
            else if (type.IsByRef)
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.ByReference);
                EncodeType(blobBuilder, type.GetParameterType());
            }
            else if (type.IsObject)
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.Object);
            }
            else if (type.IsString)
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.String);
            }
            else if (type.IsWellKnownType(WellKnownType.TypedReference))
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.TypedReference);
            }
            else if (type.IsWellKnownType(WellKnownType.Void))
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.Void);
            }
            else if (type is SignatureVariable)
            {
                SignatureVariable sigVar = (SignatureVariable)type;
                SignatureTypeCode code   = sigVar.IsMethodSignatureVariable ? SignatureTypeCode.GenericMethodParameter : SignatureTypeCode.GenericTypeParameter;
                blobBuilder.WriteByte((byte)code);
                blobBuilder.WriteCompressedInteger(sigVar.Index);
            }
            else if (type is InstantiatedType)
            {
                blobBuilder.WriteByte((byte)SignatureTypeCode.GenericTypeInstance);
                EncodeType(blobBuilder, type.GetTypeDefinition());
                blobBuilder.WriteCompressedInteger(type.Instantiation.Length);
                foreach (var instantiationArg in type.Instantiation)
                {
                    EncodeType(blobBuilder, instantiationArg);
                }
            }
            else if (type is MetadataType)
            {
                var metadataType = (MetadataType)type;
                // Must be class or valuetype
                blobBuilder.WriteByte(type.IsValueType ? (byte)SignatureTypeKind.ValueType : (byte)SignatureTypeKind.Class);
                int codedIndex = CodedIndex.TypeDefOrRef(GetTypeRef(metadataType));
                blobBuilder.WriteCompressedInteger(codedIndex);
            }
            else
            {
                throw new Exception("Unexpected type");
            }
        }
コード例 #23
0
        private bool DecodeCustomAttribute(CustomAttributeHandle caHandle, InspectorField inspectorField)
        {
            // GetCustomAttribute: https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/Portable/MetadataReader/MetadataDecoder.cs#L1370

            // Custom Attribute
            var ca = metaReader.GetCustomAttribute(caHandle);

            // MethodDefinitionHandle or MemberReferenceHandle
            if (ca.Constructor.Kind != HandleKind.MemberReference)
            {
                Console.WriteLine("ca.Constructor.Kind != HandleKind.MemberReference");
                return(false);
            }

            // constructor of the custom attr which contains the signature
            var memberRef = metaReader.GetMemberReference((MemberReferenceHandle)ca.Constructor);

            // parent of the constructor is the TypeReference
            var parent = memberRef.Parent;

            if (parent.Kind != HandleKind.TypeReference)
            {
                Console.WriteLine("parent.Kind != HandleKind.TypeReference");
                return(false);
            }

            var parentTypeRef = metaReader.GetTypeReference((TypeReferenceHandle)parent);

            // check whether we have an InspectorAttribute
            if (metaReader.GetString(parentTypeRef.Name) != "InspectorAttribute")
            {
                //Console.WriteLine("parentTypeRef != InspectorAttribute");
                return(false);
            }

            // args
            var argsReader = metaReader.GetBlobReader((BlobHandle)ca.Value);

            uint prolog = argsReader.ReadUInt16();

            if (prolog != 1)
            {
                Console.WriteLine("prolog != 1");
                return(false);
            }

            // sig reader is on constructor
            BlobReader      sigReader = metaReader.GetBlobReader(memberRef.Signature);
            SignatureHeader header    = sigReader.ReadSignatureHeader();

            // Get the type parameter count.
            if (header.IsGeneric && sigReader.ReadCompressedInteger() != 0)
            {
                Console.WriteLine("header.IsGeneric && sigReader.ReadCompressedInteger() != 0");
                return(false);
            }

            // Get the parameter count
            int paramCount = sigReader.ReadCompressedInteger();

            // Get the type return type.
            var returnTypeCode = sigReader.ReadSignatureTypeCode();

            if (returnTypeCode != SignatureTypeCode.Void)
            {
                Console.WriteLine("returnTypeCode != SignatureTypeCode.Void");
                return(false);
            }

            List <SignatureTypeCode> sigTypeCodes = new List <SignatureTypeCode>();

            // position args
            for (int i = 0; i < paramCount; i++)
            {
                SignatureTypeCode paramTypeCode = sigReader.ReadSignatureTypeCode();

                // support string custom attr for now to simplify things
                if (paramTypeCode != SignatureTypeCode.String)
                {
                    return(false);
                }

                string value;

                if (CrackStringInAttributeValue(out value, ref argsReader))
                {
                    inspectorField.CustomAttrPositionalArgs.Add(value);
                }

                sigTypeCodes.Add(paramTypeCode);
            }

            // named args

            short namedParamCount = argsReader.ReadInt16();

            for (short i = 0; i < namedParamCount; i++)
            {
                // Ecma-335 23.3 - A NamedArg is simply a FixedArg preceded by information to identify which field or
                // property it represents. [Note: Recall that the CLI allows fields and properties to have the same name; so
                // we require a means to disambiguate such situations. end note] FIELD is the single byte 0x53. PROPERTY is
                // the single byte 0x54.

                // https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/Portable/MetadataReader/MetadataDecoder.cs#L1305

                var kind = (CustomAttributeNamedArgumentKind)argsReader.ReadCompressedInteger();

                if (kind != CustomAttributeNamedArgumentKind.Field && kind != CustomAttributeNamedArgumentKind.Property)
                {
                    return(false);
                }

                var typeCode = argsReader.ReadSerializationTypeCode();

                // support string/int custom attr for now to simplify things
                if (typeCode != SerializationTypeCode.String && typeCode != SerializationTypeCode.Int32)
                {
                    return(false);
                }

                string name;

                if (!CrackStringInAttributeValue(out name, ref argsReader))
                {
                    return(false);
                }

                if (typeCode == SerializationTypeCode.Int32)
                {
                    int value;
                    value = argsReader.ReadInt32();
                    inspectorField.CustomAttrNamedArgs[name] = value.ToString();
                }
                else
                {
                    string value;

                    if (!CrackStringInAttributeValue(out value, ref argsReader))
                    {
                        return(false);
                    }

                    inspectorField.CustomAttrNamedArgs[name] = value;
                }
            }

            return(true);
        }
コード例 #24
0
 private T WriteTypeCode(SignatureTypeCode value)
 {
     Builder.WriteByte((byte)value);
     return(_continuation);
 }
コード例 #25
0
        internal static SpecialType ToSpecialType(this SignatureTypeCode typeCode)
        {
            switch (typeCode)
            {
            case SignatureTypeCode.TypedReference:
                return(SpecialType.System_TypedReference);

            case SignatureTypeCode.Void:
                return(SpecialType.System_Void);

            case SignatureTypeCode.Boolean:
                return(SpecialType.System_Boolean);

            case SignatureTypeCode.SByte:
                return(SpecialType.System_SByte);

            case SignatureTypeCode.Byte:
                return(SpecialType.System_Byte);

            case SignatureTypeCode.Int16:
                return(SpecialType.System_Int16);

            case SignatureTypeCode.UInt16:
                return(SpecialType.System_UInt16);

            case SignatureTypeCode.Int32:
                return(SpecialType.System_Int32);

            case SignatureTypeCode.UInt32:
                return(SpecialType.System_UInt32);

            case SignatureTypeCode.Int64:
                return(SpecialType.System_Int64);

            case SignatureTypeCode.UInt64:
                return(SpecialType.System_UInt64);

            case SignatureTypeCode.Single:
                return(SpecialType.System_Single);

            case SignatureTypeCode.Double:
                return(SpecialType.System_Double);

            case SignatureTypeCode.Char:
                return(SpecialType.System_Char);

            case SignatureTypeCode.String:
                return(SpecialType.System_String);

            case SignatureTypeCode.IntPtr:
                return(SpecialType.System_IntPtr);

            case SignatureTypeCode.UIntPtr:
                return(SpecialType.System_UIntPtr);

            case SignatureTypeCode.Object:
                return(SpecialType.System_Object);

            default:
                throw ExceptionUtilities.UnexpectedValue(typeCode);
            }
        }
コード例 #26
0
        public CustomAttributeValue <TType> DecodeValue(EntityHandle constructor, BlobHandle value)
        {
            BlobHandle signature;
            BlobHandle attributeOwningTypeSpec = default;

            switch (constructor.Kind)
            {
            case HandleKind.MethodDefinition:
                MethodDefinition definition = _reader.GetMethodDefinition((MethodDefinitionHandle)constructor);
                signature = definition.Signature;
                break;

            case HandleKind.MemberReference:
                MemberReference reference = _reader.GetMemberReference((MemberReferenceHandle)constructor);
                signature = reference.Signature;

                // If this is a generic attribute, we'll need its instantiation to decode the signatures
                if (reference.Parent.Kind == HandleKind.TypeSpecification)
                {
                    TypeSpecification genericOwner = _reader.GetTypeSpecification((TypeSpecificationHandle)reference.Parent);
                    attributeOwningTypeSpec = genericOwner.Signature;
                }
                break;

            default:
                throw new BadImageFormatException();
            }

            BlobReader signatureReader = _reader.GetBlobReader(signature);
            BlobReader valueReader     = _reader.GetBlobReader(value);

            ushort prolog = valueReader.ReadUInt16();

            if (prolog != 1)
            {
                throw new BadImageFormatException();
            }

            SignatureHeader header = signatureReader.ReadSignatureHeader();

            if (header.Kind != SignatureKind.Method || header.IsGeneric)
            {
                throw new BadImageFormatException();
            }

            int parameterCount           = signatureReader.ReadCompressedInteger();
            SignatureTypeCode returnType = signatureReader.ReadSignatureTypeCode();

            if (returnType != SignatureTypeCode.Void)
            {
                throw new BadImageFormatException();
            }

            BlobReader genericContextReader = default;

            if (!attributeOwningTypeSpec.IsNil)
            {
                // If this is a generic attribute, grab the instantiation arguments so that we can
                // interpret the constructor signature, should it refer to the generic context.
                genericContextReader = _reader.GetBlobReader(attributeOwningTypeSpec);
                if (genericContextReader.ReadSignatureTypeCode() == SignatureTypeCode.GenericTypeInstance)
                {
                    int kind = genericContextReader.ReadCompressedInteger();
                    if (kind != (int)SignatureTypeKind.Class && kind != (int)SignatureTypeKind.ValueType)
                    {
                        throw new BadImageFormatException();
                    }

                    genericContextReader.ReadTypeHandle();

                    // At this point, the reader points to the "GenArgCount Type Type*" part of the signature.
                }
                else
                {
                    // Some other invalid TypeSpec. Don't accidentally allow resolving generic parameters
                    // from the constructor signature into a broken blob.
                    genericContextReader = default;
                }
            }

            ImmutableArray <CustomAttributeTypedArgument <TType> > fixedArguments = DecodeFixedArguments(ref signatureReader, ref valueReader, parameterCount, genericContextReader);
            ImmutableArray <CustomAttributeNamedArgument <TType> > namedArguments = DecodeNamedArguments(ref valueReader);

            return(new CustomAttributeValue <TType>(fixedArguments, namedArguments));
        }
コード例 #27
0
        private TypeDesc ParseTypeImpl(SignatureTypeCode typeCode)
        {
            // Switch on the type.
            switch (typeCode)
            {
            case SignatureTypeCode.Void:
                return(GetWellKnownType(WellKnownType.Void));

            case SignatureTypeCode.Boolean:
                return(GetWellKnownType(WellKnownType.Boolean));

            case SignatureTypeCode.SByte:
                return(GetWellKnownType(WellKnownType.SByte));

            case SignatureTypeCode.Byte:
                return(GetWellKnownType(WellKnownType.Byte));

            case SignatureTypeCode.Int16:
                return(GetWellKnownType(WellKnownType.Int16));

            case SignatureTypeCode.UInt16:
                return(GetWellKnownType(WellKnownType.UInt16));

            case SignatureTypeCode.Int32:
                return(GetWellKnownType(WellKnownType.Int32));

            case SignatureTypeCode.UInt32:
                return(GetWellKnownType(WellKnownType.UInt32));

            case SignatureTypeCode.Int64:
                return(GetWellKnownType(WellKnownType.Int64));

            case SignatureTypeCode.UInt64:
                return(GetWellKnownType(WellKnownType.UInt64));

            case SignatureTypeCode.Single:
                return(GetWellKnownType(WellKnownType.Single));

            case SignatureTypeCode.Double:
                return(GetWellKnownType(WellKnownType.Double));

            case SignatureTypeCode.Char:
                return(GetWellKnownType(WellKnownType.Char));

            case SignatureTypeCode.String:
                return(GetWellKnownType(WellKnownType.String));

            case SignatureTypeCode.IntPtr:
                return(GetWellKnownType(WellKnownType.IntPtr));

            case SignatureTypeCode.UIntPtr:
                return(GetWellKnownType(WellKnownType.UIntPtr));

            case SignatureTypeCode.Object:
                return(GetWellKnownType(WellKnownType.Object));

            case SignatureTypeCode.TypeHandle:
                return(ResolveHandle(_reader.ReadTypeHandle()));

            case SignatureTypeCode.SZArray:
            {
                var elementType = ParseType();
                if (elementType == null)
                {
                    return(null);
                }
                return(_tsc.GetArrayType(elementType));
            }

            case SignatureTypeCode.Array:
            {
                var elementType = ParseType();
                var rank        = _reader.ReadCompressedInteger();

                // TODO: Bounds for multi-dimmensional arrays
                var boundsCount = _reader.ReadCompressedInteger();
                for (int i = 0; i < boundsCount; i++)
                {
                    _reader.ReadCompressedInteger();
                }
                var lowerBoundsCount = _reader.ReadCompressedInteger();
                for (int j = 0; j < lowerBoundsCount; j++)
                {
                    _reader.ReadCompressedInteger();
                }

                if (elementType != null)
                {
                    return(_tsc.GetArrayType(elementType, rank));
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.ByReference:
            {
                TypeDesc byRefedType = ParseType();
                if (byRefedType != null)
                {
                    return(byRefedType.MakeByRefType());
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.Pointer:
            {
                TypeDesc pointedAtType = ParseType();
                if (pointedAtType != null)
                {
                    return(_tsc.GetPointerType(pointedAtType));
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.GenericTypeParameter:
                return(_tsc.GetSignatureVariable(_reader.ReadCompressedInteger(), false));

            case SignatureTypeCode.GenericMethodParameter:
                return(_tsc.GetSignatureVariable(_reader.ReadCompressedInteger(), true));

            case SignatureTypeCode.GenericTypeInstance:
            {
                TypeDesc     typeDef         = ParseType();
                MetadataType metadataTypeDef = null;

                if (typeDef != null)
                {
                    metadataTypeDef = typeDef as MetadataType;
                    if (metadataTypeDef == null)
                    {
                        throw new BadImageFormatException();
                    }
                }

                TypeDesc[] instance = new TypeDesc[_reader.ReadCompressedInteger()];
                for (int i = 0; i < instance.Length; i++)
                {
                    instance[i] = ParseType();
                    if (instance[i] == null)
                    {
                        metadataTypeDef = null;
                    }
                }

                if (metadataTypeDef != null)
                {
                    return(_tsc.GetInstantiatedType(metadataTypeDef, new Instantiation(instance)));
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.TypedReference:
                return(GetWellKnownType(WellKnownType.TypedReference));

            case SignatureTypeCode.FunctionPointer:
                MethodSignature sig = ParseMethodSignatureInternal(skipEmbeddedSignatureData: true);
                if (sig != null)
                {
                    return(_tsc.GetFunctionPointerType(sig));
                }
                else
                {
                    return(null);
                }

            default:
                throw new BadImageFormatException();
            }
        }
コード例 #28
0
        private TypeDesc ParseType(SignatureTypeCode typeCode)
        {
            // Switch on the type.
            switch (typeCode)
            {
            case SignatureTypeCode.Void:
                return(GetWellKnownType(WellKnownType.Void));

            case SignatureTypeCode.Boolean:
                return(GetWellKnownType(WellKnownType.Boolean));

            case SignatureTypeCode.SByte:
                return(GetWellKnownType(WellKnownType.SByte));

            case SignatureTypeCode.Byte:
                return(GetWellKnownType(WellKnownType.Byte));

            case SignatureTypeCode.Int16:
                return(GetWellKnownType(WellKnownType.Int16));

            case SignatureTypeCode.UInt16:
                return(GetWellKnownType(WellKnownType.UInt16));

            case SignatureTypeCode.Int32:
                return(GetWellKnownType(WellKnownType.Int32));

            case SignatureTypeCode.UInt32:
                return(GetWellKnownType(WellKnownType.UInt32));

            case SignatureTypeCode.Int64:
                return(GetWellKnownType(WellKnownType.Int64));

            case SignatureTypeCode.UInt64:
                return(GetWellKnownType(WellKnownType.UInt64));

            case SignatureTypeCode.Single:
                return(GetWellKnownType(WellKnownType.Single));

            case SignatureTypeCode.Double:
                return(GetWellKnownType(WellKnownType.Double));

            case SignatureTypeCode.Char:
                return(GetWellKnownType(WellKnownType.Char));

            case SignatureTypeCode.String:
                return(GetWellKnownType(WellKnownType.String));

            case SignatureTypeCode.IntPtr:
                return(GetWellKnownType(WellKnownType.IntPtr));

            case SignatureTypeCode.UIntPtr:
                return(GetWellKnownType(WellKnownType.UIntPtr));

            case SignatureTypeCode.Object:
                return(GetWellKnownType(WellKnownType.Object));

            case SignatureTypeCode.TypeHandle:
                return(_module.GetType(_reader.ReadTypeHandle()));

            case SignatureTypeCode.SZArray:
                return(_module.Context.GetArrayType(ParseType()));

            case SignatureTypeCode.Array:
            {
                var elementType = ParseType();
                var rank        = _reader.ReadCompressedInteger();

                // TODO: Bounds for multi-dimmensional arrays
                var boundsCount = _reader.ReadCompressedInteger();
                for (int i = 0; i < boundsCount; i++)
                {
                    _reader.ReadCompressedInteger();
                }
                var lowerBoundsCount = _reader.ReadCompressedInteger();
                for (int j = 0; j < lowerBoundsCount; j++)
                {
                    _reader.ReadCompressedInteger();
                }

                return(_module.Context.GetArrayType(elementType, rank));
            }

            case SignatureTypeCode.ByReference:
                return(ParseType().MakeByRefType());

            case SignatureTypeCode.Pointer:
                return(_module.Context.GetPointerType(ParseType()));

            case SignatureTypeCode.GenericTypeParameter:
                return(_module.Context.GetSignatureVariable(_reader.ReadCompressedInteger(), false));

            case SignatureTypeCode.GenericMethodParameter:
                return(_module.Context.GetSignatureVariable(_reader.ReadCompressedInteger(), true));

            case SignatureTypeCode.GenericTypeInstance:
            {
                TypeDesc     typeDef         = ParseType();
                MetadataType metadataTypeDef = typeDef as MetadataType;
                if (metadataTypeDef == null)
                {
                    throw new BadImageFormatException();
                }

                TypeDesc[] instance = new TypeDesc[_reader.ReadCompressedInteger()];
                for (int i = 0; i < instance.Length; i++)
                {
                    instance[i] = ParseType();
                }
                return(_module.Context.GetInstantiatedType(metadataTypeDef, new Instantiation(instance)));
            }

            case SignatureTypeCode.TypedReference:
                throw new PlatformNotSupportedException("TypedReference not supported in .NET Core");

            case SignatureTypeCode.FunctionPointer:
                throw new PlatformNotSupportedException("Function pointer types are not supported in .NET Core");

            default:
                throw new BadImageFormatException();
            }
        }
コード例 #29
0
        private TypeDesc ParseTypeImpl(SignatureTypeCode typeCode)
        {
            // Switch on the type.
            switch (typeCode)
            {
            case SignatureTypeCode.Void:
                return(GetWellKnownType(WellKnownType.Void));

            case SignatureTypeCode.Boolean:
                return(GetWellKnownType(WellKnownType.Boolean));

            case SignatureTypeCode.SByte:
                return(GetWellKnownType(WellKnownType.SByte));

            case SignatureTypeCode.Byte:
                return(GetWellKnownType(WellKnownType.Byte));

            case SignatureTypeCode.Int16:
                return(GetWellKnownType(WellKnownType.Int16));

            case SignatureTypeCode.UInt16:
                return(GetWellKnownType(WellKnownType.UInt16));

            case SignatureTypeCode.Int32:
                return(GetWellKnownType(WellKnownType.Int32));

            case SignatureTypeCode.UInt32:
                return(GetWellKnownType(WellKnownType.UInt32));

            case SignatureTypeCode.Int64:
                return(GetWellKnownType(WellKnownType.Int64));

            case SignatureTypeCode.UInt64:
                return(GetWellKnownType(WellKnownType.UInt64));

            case SignatureTypeCode.Single:
                return(GetWellKnownType(WellKnownType.Single));

            case SignatureTypeCode.Double:
                return(GetWellKnownType(WellKnownType.Double));

            case SignatureTypeCode.Char:
                return(GetWellKnownType(WellKnownType.Char));

            case SignatureTypeCode.String:
                return(GetWellKnownType(WellKnownType.String));

            case SignatureTypeCode.IntPtr:
                return(GetWellKnownType(WellKnownType.IntPtr));

            case SignatureTypeCode.UIntPtr:
                return(GetWellKnownType(WellKnownType.UIntPtr));

            case SignatureTypeCode.Object:
                return(GetWellKnownType(WellKnownType.Object));

            case SignatureTypeCode.TypeHandle:
                return(ResolveHandle(_reader.ReadTypeHandle()));

            case SignatureTypeCode.SZArray:
            {
                var elementType = ParseType();
                if (elementType == null)
                {
                    return(null);
                }
                return(_tsc.GetArrayType(elementType));
            }

            case SignatureTypeCode.Array:
            {
                var elementType = ParseType();
                var rank        = _reader.ReadCompressedInteger();

                if (_embeddedSignatureDataList != null)
                {
                    var    boundsCount = _reader.ReadCompressedInteger();
                    int [] bounds      = boundsCount > 0 ? new int[boundsCount] : Array.Empty <int>();
                    for (int i = 0; i < boundsCount; i++)
                    {
                        bounds[i] = _reader.ReadCompressedInteger();
                    }

                    var    lowerBoundsCount   = _reader.ReadCompressedInteger();
                    int [] lowerBounds        = lowerBoundsCount > 0 ? new int[lowerBoundsCount] : Array.Empty <int>();
                    bool   nonZeroLowerBounds = false;
                    for (int j = 0; j < lowerBoundsCount; j++)
                    {
                        int loBound = _reader.ReadCompressedSignedInteger();
                        if (loBound != 0)
                        {
                            nonZeroLowerBounds = true;
                        }
                        lowerBounds[j] = loBound;
                    }

                    if (boundsCount != 0 || lowerBoundsCount != rank || nonZeroLowerBounds)
                    {
                        StringBuilder arrayShapeString = new StringBuilder();
                        arrayShapeString.Append(string.Join(",", bounds));
                        arrayShapeString.Append('|');
                        arrayShapeString.Append(string.Join(",", lowerBounds));
                        _embeddedSignatureDataList.Add(new EmbeddedSignatureData {
                                index = string.Join(".", _indexStack) + "|" + arrayShapeString.ToString(), kind = EmbeddedSignatureDataKind.ArrayShape, type = null
                            });
                    }
                }
                else
                {
                    var boundsCount = _reader.ReadCompressedInteger();
                    for (int i = 0; i < boundsCount; i++)
                    {
                        _reader.ReadCompressedInteger();
                    }
                    var lowerBoundsCount = _reader.ReadCompressedInteger();
                    for (int j = 0; j < lowerBoundsCount; j++)
                    {
                        _reader.ReadCompressedSignedInteger();
                    }
                }

                if (elementType != null)
                {
                    return(_tsc.GetArrayType(elementType, rank));
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.ByReference:
            {
                TypeDesc byRefedType = ParseType();
                if (byRefedType != null)
                {
                    return(byRefedType.MakeByRefType());
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.Pointer:
            {
                TypeDesc pointedAtType = ParseType();
                if (pointedAtType != null)
                {
                    return(_tsc.GetPointerType(pointedAtType));
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.GenericTypeParameter:
                return(_tsc.GetSignatureVariable(_reader.ReadCompressedInteger(), false));

            case SignatureTypeCode.GenericMethodParameter:
                return(_tsc.GetSignatureVariable(_reader.ReadCompressedInteger(), true));

            case SignatureTypeCode.GenericTypeInstance:
            {
                TypeDesc     typeDef         = ParseType();
                MetadataType metadataTypeDef = null;

                if (typeDef != null)
                {
                    metadataTypeDef = typeDef as MetadataType;
                    if (metadataTypeDef == null)
                    {
                        throw new BadImageFormatException();
                    }
                }

                TypeDesc[] instance = new TypeDesc[_reader.ReadCompressedInteger()];
                for (int i = 0; i < instance.Length; i++)
                {
                    instance[i] = ParseType();
                    if (instance[i] == null)
                    {
                        metadataTypeDef = null;
                    }
                }

                if (metadataTypeDef != null)
                {
                    return(_tsc.GetInstantiatedType(metadataTypeDef, new Instantiation(instance)));
                }
                else
                {
                    return(null);
                }
            }

            case SignatureTypeCode.TypedReference:
                return(GetWellKnownType(WellKnownType.TypedReference));

            case SignatureTypeCode.FunctionPointer:
                MethodSignature sig = ParseMethodSignatureInternal(skipEmbeddedSignatureData: true);
                if (sig != null)
                {
                    return(_tsc.GetFunctionPointerType(sig));
                }
                else
                {
                    return(null);
                }

            default:
                throw new BadImageFormatException();
            }
        }
コード例 #30
0
ファイル: BlobEncoders.cs プロジェクト: er0dr1guez/corefx
 private void WriteTypeCode(SignatureTypeCode value)
 {
     Builder.WriteByte((byte)value);
 }
コード例 #31
0
 private void WriteTypeCode(SignatureTypeCode value)
 {
     Builder.WriteByte((byte)value);
 }
コード例 #32
0
        private TypeDesc ParseType(SignatureTypeCode typeCode)
        {
            // Switch on the type.
            switch (typeCode)
            {
                case SignatureTypeCode.Void:
                    return GetWellKnownType(WellKnownType.Void);
                case SignatureTypeCode.Boolean:
                    return GetWellKnownType(WellKnownType.Boolean);
                case SignatureTypeCode.SByte:
                    return GetWellKnownType(WellKnownType.SByte);
                case SignatureTypeCode.Byte:
                    return GetWellKnownType(WellKnownType.Byte);
                case SignatureTypeCode.Int16:
                    return GetWellKnownType(WellKnownType.Int16);
                case SignatureTypeCode.UInt16:
                    return GetWellKnownType(WellKnownType.UInt16);
                case SignatureTypeCode.Int32:
                    return GetWellKnownType(WellKnownType.Int32);
                case SignatureTypeCode.UInt32:
                    return GetWellKnownType(WellKnownType.UInt32);
                case SignatureTypeCode.Int64:
                    return GetWellKnownType(WellKnownType.Int64);
                case SignatureTypeCode.UInt64:
                    return GetWellKnownType(WellKnownType.UInt64);
                case SignatureTypeCode.Single:
                    return GetWellKnownType(WellKnownType.Single);
                case SignatureTypeCode.Double:
                    return GetWellKnownType(WellKnownType.Double);
                case SignatureTypeCode.Char:
                    return GetWellKnownType(WellKnownType.Char);
                case SignatureTypeCode.String:
                    return GetWellKnownType(WellKnownType.String);
                case SignatureTypeCode.IntPtr:
                    return GetWellKnownType(WellKnownType.IntPtr);
                case SignatureTypeCode.UIntPtr:
                    return GetWellKnownType(WellKnownType.UIntPtr);
                case SignatureTypeCode.Object:
                    return GetWellKnownType(WellKnownType.Object);
                case SignatureTypeCode.TypeHandle:
                    return _module.GetType(_reader.ReadTypeHandle());
                case SignatureTypeCode.SZArray:
                    return _module.Context.GetArrayType(ParseType());
                case SignatureTypeCode.Array:
                    {
                        var elementType = ParseType();
                        var rank = _reader.ReadCompressedInteger();

                        // TODO: Bounds for multi-dimmensional arrays
                        var boundsCount = _reader.ReadCompressedInteger();
                        for (int i = 0; i < boundsCount; i++)
                            _reader.ReadCompressedInteger();
                        var lowerBoundsCount = _reader.ReadCompressedInteger();
                        for (int j = 0; j < lowerBoundsCount; j++)
                            _reader.ReadCompressedInteger();

                        return _module.Context.GetArrayType(elementType, rank);
                    }
                case SignatureTypeCode.ByReference:
                    return ParseType().MakeByRefType();
                case SignatureTypeCode.Pointer:
                    return _module.Context.GetPointerType(ParseType());
                case SignatureTypeCode.GenericTypeParameter:
                    return _module.Context.GetSignatureVariable(_reader.ReadCompressedInteger(), false);
                case SignatureTypeCode.GenericMethodParameter:
                    return _module.Context.GetSignatureVariable(_reader.ReadCompressedInteger(), true);
                case SignatureTypeCode.GenericTypeInstance:
                    {
                        TypeDesc typeDef = ParseType();
                        MetadataType metadataTypeDef = typeDef as MetadataType;
                        if (metadataTypeDef == null)
                            throw new BadImageFormatException();

                        TypeDesc[] instance = new TypeDesc[_reader.ReadCompressedInteger()];
                        for (int i = 0; i < instance.Length; i++)
                            instance[i] = ParseType();
                        return _module.Context.GetInstantiatedType(metadataTypeDef, new Instantiation(instance));
                    }
                case SignatureTypeCode.TypedReference:
                    throw new PlatformNotSupportedException("TypedReference not supported in .NET Core");
                case SignatureTypeCode.FunctionPointer:
                    throw new PlatformNotSupportedException("Function pointer types are not supported in .NET Core");
                default:
                    throw new BadImageFormatException();
            }
        }
コード例 #33
0
        public BlobReader Skip()
        {
            BlobReader        reader   = _reader;
            SignatureTypeCode typeCode = reader.ReadSignatureTypeCode();

            switch (typeCode)
            {
            case SignatureTypeCode.Boolean:
            case SignatureTypeCode.Char:
            case SignatureTypeCode.SByte:
            case SignatureTypeCode.Byte:
            case SignatureTypeCode.Int16:
            case SignatureTypeCode.UInt16:
            case SignatureTypeCode.Int32:
            case SignatureTypeCode.UInt32:
            case SignatureTypeCode.Int64:
            case SignatureTypeCode.UInt64:
            case SignatureTypeCode.IntPtr:
            case SignatureTypeCode.UIntPtr:
            case SignatureTypeCode.Single:
            case SignatureTypeCode.Double:
                break;

            case SignatureTypeCode.Object:
            case SignatureTypeCode.String:
                break;

            case SignatureTypeCode.Array:
                reader = new TypeSignature(reader).Skip();
                reader = new ArrayShapeSignature(reader).Skip();
                break;

            case SignatureTypeCode.FunctionPointer:
                throw new NotImplementedException(string.Format("{0} is not yet implemented.", typeCode));

            case SignatureTypeCode.GenericTypeInstance:
                reader.ReadSignatureTypeCode();
                reader.ReadTypeHandle();

                int argumentCount = reader.ReadCompressedInteger();
                for (int i = 0; i < argumentCount; i++)
                {
                    reader = new TypeSignature(reader).Skip();
                }

                break;

            case SignatureTypeCode.GenericMethodParameter:
            case SignatureTypeCode.GenericTypeParameter:
                // skip the generic parameter index
                reader.ReadCompressedInteger();
                break;

            case SignatureTypeCode.TypeHandle:
                reader.ReadTypeHandle();
                break;

            case SignatureTypeCode.Pointer:
                while (reader.IsCustomModifier())
                {
                    reader = new CustomModifierSignature(reader).Skip();
                }

                if (reader.PeekSignatureTypeCode() == SignatureTypeCode.Void)
                {
                    reader.ReadSignatureTypeCode();
                }
                else
                {
                    reader = new TypeSignature(reader).Skip();
                }

                break;

            case SignatureTypeCode.SZArray:
                while (reader.IsCustomModifier())
                {
                    reader = new CustomModifierSignature(reader).Skip();
                }

                reader = new TypeSignature(reader).Skip();
                break;

            default:
                throw new InvalidOperationException("Invalid signature type code.");
            }

            return(reader);
        }
コード例 #34
0
 private static string GetTypeName(SignatureTypeCode typeCode)
 {
     switch (typeCode)
     {
         case SignatureTypeCode.Boolean: return "[bool]";
         case SignatureTypeCode.Int32: return "[int]";
         case SignatureTypeCode.String: return "[string]";
         case SignatureTypeCode.Object: return "[object]";
         default: return null;
     }
 }
コード例 #35
0
        private object ReadAndTranslateValue(ref BlobReader sigReader, SignatureTypeCode typeCode, out bool isEnumTypeCode)
        {
            switch (typeCode)
            {
                case SignatureTypeCode.Boolean:
                    isEnumTypeCode = true;
                    return (short)(sigReader.ReadBoolean() ? 1 : 0);

                case SignatureTypeCode.Char:
                    isEnumTypeCode = true;
                    return (ushort)sigReader.ReadChar();

                case SignatureTypeCode.SByte:
                    isEnumTypeCode = true;
                    return (short)sigReader.ReadSByte();

                case SignatureTypeCode.Byte:
                    isEnumTypeCode = true;
                    return (short)sigReader.ReadByte();

                case SignatureTypeCode.Int16:
                    isEnumTypeCode = true;
                    return sigReader.ReadInt16();

                case SignatureTypeCode.UInt16:
                    isEnumTypeCode = true;
                    return sigReader.ReadUInt16();

                case SignatureTypeCode.Int32:
                    isEnumTypeCode = true;
                    return sigReader.ReadInt32();

                case SignatureTypeCode.UInt32:
                    isEnumTypeCode = true;
                    return sigReader.ReadUInt32();

                case SignatureTypeCode.Int64:
                    isEnumTypeCode = true;
                    return sigReader.ReadInt64();

                case SignatureTypeCode.UInt64:
                    isEnumTypeCode = true;
                    return sigReader.ReadUInt64();

                case SignatureTypeCode.Single:
                    isEnumTypeCode = false;
                    return sigReader.ReadSingle();

                case SignatureTypeCode.Double:
                    isEnumTypeCode = false;
                    return sigReader.ReadDouble();

                case SignatureTypeCode.String:
                    isEnumTypeCode = false;

                    if (sigReader.RemainingBytes == 1)
                    {
                        if (sigReader.ReadByte() != 0xff)
                        {
                            throw new BadImageFormatException();
                        }

                        return NullReferenceValue;
                    }

                    if (sigReader.RemainingBytes % 2 != 0)
                    {
                        throw new BadImageFormatException();
                    }

                    return sigReader.ReadUTF16(sigReader.RemainingBytes);

                case SignatureTypeCode.Object:
                    // null reference
                    isEnumTypeCode = false;
                    return NullReferenceValue;

                default:
                    throw new BadImageFormatException();
            }
        }