Пример #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();
        }
Пример #2
0
        /// <summary>
        /// Reads a single local variables signature from the provided input stream.
        /// </summary>
        /// <param name="parentModule">The module containing the signature.</param>
        /// <param name="reader">The input stream.</param>
        /// <param name="protection">The object responsible for detecting infinite recursion.</param>
        /// <returns>The signature.</returns>
        public static LocalVariablesSignature FromReader(ModuleDefinition parentModule, IBinaryStreamReader reader, RecursionProtection protection)
        {
            var result = new LocalVariablesSignature();

            result.Attributes = (CallingConventionAttributes)reader.ReadByte();

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

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

            return(result);
        }
Пример #3
0
        /// <inheritdoc />
        public bool Equals(CallingConventionSignature x, CallingConventionSignature y)
        {
            if (ReferenceEquals(x, y))
            {
                return(true);
            }
            if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
            {
                return(false);
            }

            return(x switch
            {
                LocalVariablesSignature localVarSig => Equals(localVarSig, y as LocalVariablesSignature),
                FieldSignature fieldSig => Equals(fieldSig, y as FieldSignature),
                MethodSignature methodSig => Equals(methodSig, y as MethodSignature),
                PropertySignature propertySig => Equals(propertySig, y as PropertySignature),
                _ => false
            });