예제 #1
0
        public static FieldSignature Decode(BufferedBinaryReader reader)
        {
            var h = (SignatureFlags)reader.ReadUInt8();

            if ((h & SignatureFlags.TYPEMASK) != SignatureFlags.FIELD)
            {
                throw new BadMetadataException("Incorrect signature for field.");
            }
            return(new FieldSignature(TypeSignature.Decode(reader)));
        }
예제 #2
0
        public static MetadataSignature DecodeMember(BufferedBinaryReader reader)
        {
            var flags = (SignatureFlags)reader.ReadUInt8();
            var type  = flags & SignatureFlags.TYPEMASK;

            switch (type)
            {
            case SignatureFlags.FIELD:
                return(new FieldSignature(TypeSignature.Decode(reader)));

            case SignatureFlags.LOCAL:
                throw new NotImplementedException();

            default:
                return(MethodSignature.Decode(reader, flags));
            }
        }
예제 #3
0
        internal static MethodSignature Decode(BufferedBinaryReader reader, SignatureFlags flags)
        {
            var type = (flags & SignatureFlags.TYPEMASK);

            if (!(type == SignatureFlags.PROPERTY || (type >= SignatureFlags.DEFAULT && type <= SignatureFlags.VARARG)))
            {
                throw new BadMetadataException("Incorrect signature for method.");
            }

            var sig = new MethodSignature();

            if (type == SignatureFlags.PROPERTY)
            {
                sig.IsProperty = true;
            }

            if ((flags & SignatureFlags.HASTHIS) != 0)
            {
                sig.CallingConventions |= CallingConventions.HasThis;
            }
            if ((flags & SignatureFlags.EXPLICITTHIS) != 0)
            {
                sig.CallingConventions |= CallingConventions.ExplicitThis;
            }
            if (type == SignatureFlags.VARARG)
            {
                sig.CallingConventions &= CallingConventions.Standard;
                sig.CallingConventions |= CallingConventions.VarArgs;
            }

            if ((flags & SignatureFlags.GENERIC) != 0)
            {
                sig.GenericParamCount = reader.ReadPackedInt();
            }

            int paramCount = reader.ReadPackedInt();

            sig.Type   = TypeSignature.Decode(reader);
            sig.Params = new TypeSignature[paramCount];
            for (int i = 0; i < paramCount; ++i)
            {
                sig.Params[i] = TypeSignature.Decode(reader);
            }
            return(sig);
        }