Exemple #1
0
        private static CallingConventionSignature ReadSignature(
            ModuleDefinition module,
            IBinaryStreamReader reader,
            RecursionProtection protection)
        {
            byte flag = reader.ReadByte();

            reader.FileOffset--;

            switch ((CallingConventionAttributes)flag & SignatureTypeMask)
            {
            case CallingConventionAttributes.Default:
            case CallingConventionAttributes.C:
            case CallingConventionAttributes.ExplicitThis:
            case CallingConventionAttributes.FastCall:
            case CallingConventionAttributes.StdCall:
            case CallingConventionAttributes.ThisCall:
            case CallingConventionAttributes.VarArg:
                return(MethodSignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.Property:
                return(PropertySignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.Local:
                return(LocalVariablesSignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.GenericInstance:
                return(GenericInstanceMethodSignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.Field:
                return(FieldSignature.FromReader(module, reader, protection));
            }

            throw new NotSupportedException();
        }
        internal static GenericInstanceMethodSignature FromReader(ModuleDefinition parentModule,
                                                                  IBinaryStreamReader reader, RecursionProtection protection)
        {
            if (!reader.CanRead(sizeof(byte)))
            {
                return(null);
            }

            var attributes = (CallingConventionAttributes)reader.ReadByte();
            var result     = new GenericInstanceMethodSignature(attributes);

            if (!reader.TryReadCompressedUInt32(out uint count))
            {
                return(result);
            }

            for (int i = 0; i < count; i++)
            {
                result.TypeArguments.Add(TypeSignature.FromReader(parentModule, reader, protection));
            }

            return(result);
        }