/// <summary> /// Starts a function pointer signature. /// </summary> /// <param name="convention">Calling convention.</param> /// <param name="attributes">Function pointer attributes.</param> /// <param name="genericParameterCount">Generic parameter count.</param> /// <exception cref="ArgumentException"><paramref name="attributes"/> is invalid.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="genericParameterCount"/> is not in range [0, 0xffff].</exception> public MethodSignatureEncoder FunctionPointer( SignatureCallingConvention convention = SignatureCallingConvention.Default, FunctionPointerAttributes attributes = FunctionPointerAttributes.None, int genericParameterCount = 0) { // Spec: // The EXPLICITTHIS (0x40) bit can be set only in signatures for function pointers. // If EXPLICITTHIS (0x40) in the signature is set, then HASTHIS (0x20) shall also be set. if (attributes != FunctionPointerAttributes.None && attributes != FunctionPointerAttributes.HasThis && attributes != FunctionPointerAttributes.HasExplicitThis) { throw new ArgumentException(SR.InvalidSignature, nameof(attributes)); } if (unchecked ((uint)genericParameterCount) > ushort.MaxValue) { Throw.ArgumentOutOfRange(nameof(genericParameterCount)); } Builder.WriteByte((byte)SignatureTypeCode.FunctionPointer); Builder.WriteByte(new SignatureHeader(SignatureKind.Method, convention, (SignatureAttributes)attributes).RawValue); if (genericParameterCount != 0) { Builder.WriteCompressedInteger(genericParameterCount); } return(new MethodSignatureEncoder(Builder, hasVarArgs: convention == SignatureCallingConvention.VarArgs)); }
public MethodSignatureEncoder FunctionPointer(SignatureCallingConvention convention, FunctionPointerAttributes attributes, int genericParameterCount) { // Spec: // The EXPLICITTHIS (0x40) bit can be set only in signatures for function pointers. // If EXPLICITTHIS (0x40) in the signature is set, then HASTHIS (0x20) shall also be set. if (attributes != FunctionPointerAttributes.None && attributes != FunctionPointerAttributes.HasThis && attributes != FunctionPointerAttributes.HasExplicitThis) { throw new ArgumentException(nameof(attributes)); } Builder.WriteByte((byte)SignatureTypeCode.FunctionPointer); Builder.WriteByte(BlobEncoder.SignatureHeader(SignatureKind.Method, convention, (SignatureAttributes)attributes).RawValue); if (genericParameterCount != 0) { Builder.WriteCompressedInteger(genericParameterCount); } return new MethodSignatureEncoder(Builder, isVarArg: convention == SignatureCallingConvention.VarArgs); }
public MethodSignatureEncoder FunctionPointer(SignatureCallingConvention convention, FunctionPointerAttributes attributes, int genericParameterCount) { // Spec: // The EXPLICITTHIS (0x40) bit can be set only in signatures for function pointers. // If EXPLICITTHIS (0x40) in the signature is set, then HASTHIS (0x20) shall also be set. if (attributes != FunctionPointerAttributes.None && attributes != FunctionPointerAttributes.HasThis && attributes != FunctionPointerAttributes.HasExplicitThis) { throw new ArgumentException(nameof(attributes)); } Builder.WriteByte((byte)SignatureTypeCode.FunctionPointer); Builder.WriteByte(BlobEncoder.SignatureHeader(SignatureKind.Method, convention, (SignatureAttributes)attributes).RawValue); if (genericParameterCount != 0) { Builder.WriteCompressedInteger(genericParameterCount); } return(new MethodSignatureEncoder(Builder, isVarArg: convention == SignatureCallingConvention.VarArgs)); }
/// <summary> /// Starts a function pointer signature. /// </summary> /// <param name="convention">Calling convention.</param> /// <param name="attributes">Function pointer attributes.</param> /// <param name="genericParameterCount">Generic parameter count.</param> /// <exception cref="ArgumentException"><paramref name="attributes"/> is invalid.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="genericParameterCount"/> is not in range [0, 0xffff].</exception> public MethodSignatureEncoder FunctionPointer( SignatureCallingConvention convention = SignatureCallingConvention.Default, FunctionPointerAttributes attributes = FunctionPointerAttributes.None, int genericParameterCount = 0) { // Spec: // The EXPLICITTHIS (0x40) bit can be set only in signatures for function pointers. // If EXPLICITTHIS (0x40) in the signature is set, then HASTHIS (0x20) shall also be set. if (attributes != FunctionPointerAttributes.None && attributes != FunctionPointerAttributes.HasThis && attributes != FunctionPointerAttributes.HasExplicitThis) { throw new ArgumentException(SR.InvalidSignature, nameof(attributes)); } if (unchecked((uint)genericParameterCount) > ushort.MaxValue) { Throw.ArgumentOutOfRange(nameof(genericParameterCount)); } Builder.WriteByte((byte)SignatureTypeCode.FunctionPointer); Builder.WriteByte(new SignatureHeader(SignatureKind.Method, convention, (SignatureAttributes)attributes).RawValue); if (genericParameterCount != 0) { Builder.WriteCompressedInteger(genericParameterCount); } return new MethodSignatureEncoder(Builder, hasVarArgs: convention == SignatureCallingConvention.VarArgs); }