/// <summary> /// Factory method for creating new Signatures. /// </summary> /// <param name="source">The contents of the library the signiture is being read from</param> /// <param name="offset">The offset to the start of the signiture</param> /// <param name="tokenType">The type of signiture being read.</param> /// <returns></returns> public static Signature Create(byte[] source, Offset offset, Signatures tokenType) { int startingOffset = offset; uint lengthOfSigniture = SignatureToken.GetCompressedValue(source, offset); // The first byte is always the length // Read the full signiture byte[] signiture = new byte[lengthOfSigniture]; for (int i = 0; i < lengthOfSigniture; i++) { signiture[i] = source[offset.Shift(1)]; } // Instatiate the correct signiture reader and pass control Signature instantiatedSigniture = null; switch (tokenType) { case Signatures.CustomAttribute: // instantiatedSigniture = new CustomAttributeSigniture(signiture); break; case Signatures.MethodSpecification: // to do: implement break; case Signatures.LocalVariable: instantiatedSigniture = new LocalVariableSignature(signiture); break; case Signatures.MethodDef: instantiatedSigniture = new MethodDefSignature(signiture); break; case Signatures.MethodRef: instantiatedSigniture = new MethodRefSignature(signiture); break; case Signatures.Field: instantiatedSigniture = new FieldSignature(signiture); break; case Signatures.Property: instantiatedSigniture = new PropertySignature(signiture); break; case Signatures.TypeSpecification: instantiatedSigniture = new TypeSpecificationSignature(signiture); break; } return(instantiatedSigniture); }
/// <summary> /// Instantiates a new instance of the ElementTypeSignitureToken class. /// </summary> /// <include file='code-documentation\signatures.xml' path='docs/elementtypesignaturetoken/member[@name="ctor"]/*'/> public ElementTypeSignatureToken(byte[] signiture, Offset offset) : base(SignatureTokens.ElementType) { ElementType = (ElementTypes)GetCompressedValue(signiture, offset); switch (ElementType) { case ElementTypes.Class: case ElementTypes.ValueType: DecodeEncodedDefRefSpecToken(signiture, offset); break; case ElementTypes.MVar: case ElementTypes.Var: Token = SignatureToken.GetCompressedValue(signiture, offset); break; // Well known types case ElementTypes.Boolean: Definition = WellKnownTypeDef.Boolean; break; case ElementTypes.I: Definition = WellKnownTypeDef.I; break; case ElementTypes.I1: Definition = WellKnownTypeDef.I1; break; case ElementTypes.I2: Definition = WellKnownTypeDef.I2; break; case ElementTypes.I4: Definition = WellKnownTypeDef.I4; break; case ElementTypes.I8: Definition = WellKnownTypeDef.I8; break; case ElementTypes.U: Definition = WellKnownTypeDef.U; break; case ElementTypes.U1: Definition = WellKnownTypeDef.U1; break; case ElementTypes.U2: Definition = WellKnownTypeDef.U2; break; case ElementTypes.U4: Definition = WellKnownTypeDef.U4; break; case ElementTypes.U8: Definition = WellKnownTypeDef.U8; break; case ElementTypes.Char: Definition = WellKnownTypeDef.Char; break; case ElementTypes.R4: Definition = WellKnownTypeDef.R4; break; case ElementTypes.R8: Definition = WellKnownTypeDef.R8; break; case ElementTypes.TypedByRef: Definition = WellKnownTypeDef.TypedByRef; break; case ElementTypes.String: Definition = WellKnownTypeDef.String; break; case ElementTypes.Object: Definition = WellKnownTypeDef.Object; break; case ElementTypes.Void: Definition = WellKnownTypeDef.Void; break; } }
/// <summary> /// Instantiates a new instance of the ElementTypeSignitureToken class. /// </summary> /// <param name="signiture">The signiture where this token is defined.</param> /// <param name="offset">The current offset in the signiture to read the token.</param> /// <remarks> /// <para> /// An ElementTypeSignitureToken details the element of a Type signiture. These /// elements are defined in section 23.1.16 in ECMA 335. Where a type can contain /// multiple ElementTypeSignitureTokens each building up to reveal more information /// about the type. This class will only ever provide a single item of detail. /// </para> /// </remarks> public ElementTypeSignatureToken(byte[] signiture, Offset offset) : base(SignatureTokens.ElementType) { ElementType = (ElementTypes)GetCompressedValue(signiture, offset); int typeMask; uint token; switch (ElementType) { case ElementTypes.Class: // Read the typedef, typeref or typespec token typeMask = 0x00000003; token = GetCompressedValue(signiture, offset); switch (typeMask & token) { case 0: // TypeDef Token = token >> 2 | (int)ILMetadataToken.TypeDef; // (token & typeMask) | token >> 2; break; case 1: // TypeRef Token = token >> 2 | (int)ILMetadataToken.TypeRef; //(token & typeMask) | token >> 2; break; case 2: // TypeSpec Token = token >> 2 | (int)ILMetadataToken.TypeSpec; // (token & typeMask) | token >> 2; break; } break; case ElementTypes.ValueType: // Read the typedef, typeref or typespec token typeMask = 0x00000003; token = GetCompressedValue(signiture, offset); switch (typeMask & token) { case 0: // TypeDef Token = token >> 2 | (int)ILMetadataToken.TypeDef; // (token & typeMask) | token >> 2; break; case 1: // TypeRef Token = token >> 2 | (int)ILMetadataToken.TypeRef; //(token & typeMask) | token >> 2; break; } break; case ElementTypes.MVar: case ElementTypes.Var: Token = SignatureToken.GetCompressedValue(signiture, offset); break; // Well known types case ElementTypes.Boolean: Definition = WellKnownTypeDef.Boolean; break; case ElementTypes.I: Definition = WellKnownTypeDef.I; break; case ElementTypes.I1: Definition = WellKnownTypeDef.I1; break; case ElementTypes.I2: Definition = WellKnownTypeDef.I2; break; case ElementTypes.I4: Definition = WellKnownTypeDef.I4; break; case ElementTypes.I8: Definition = WellKnownTypeDef.I8; break; case ElementTypes.U: Definition = WellKnownTypeDef.U; break; case ElementTypes.U1: Definition = WellKnownTypeDef.U1; break; case ElementTypes.U2: Definition = WellKnownTypeDef.U2; break; case ElementTypes.U4: Definition = WellKnownTypeDef.U4; break; case ElementTypes.U8: Definition = WellKnownTypeDef.U8; break; case ElementTypes.Char: Definition = WellKnownTypeDef.Char; break; case ElementTypes.R4: Definition = WellKnownTypeDef.R4; break; case ElementTypes.R8: Definition = WellKnownTypeDef.R8; break; case ElementTypes.TypedByRef: Definition = WellKnownTypeDef.TypedByRef; break; case ElementTypes.String: Definition = WellKnownTypeDef.String; break; case ElementTypes.Object: Definition = WellKnownTypeDef.Object; break; case ElementTypes.Void: Definition = WellKnownTypeDef.Void; break; } }