/// <summary> /// Initialises a new instance of the property signiture from the provided <paramref name="signiture"/>. /// </summary> /// <param name="signiture">The signiture blob.</param> public PropertySignature(byte[] signiture) : base(Signatures.Property) { Offset offset = 0; ElementTypeSignatureToken property = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(property); ParameterCountSignatureToken paramCount = new ParameterCountSignatureToken(signiture, offset); Tokens.Add(paramCount); while (CustomModifierToken.IsToken(signiture, offset)) { CustomModifierToken modifier = new CustomModifierToken(signiture, offset); Tokens.Add(modifier); } ElementTypeSignatureToken type = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(type); for (int i = 0; i < paramCount.Count; i++) { ParamSignatureToken param = new ParamSignatureToken(signiture, offset); Tokens.Add(param); } }
private void ReadReturnTypeSignature(Signature created, byte[] signature, Offset offset) { // p.265 of ecma 335 // zero or more custom modifiers can be provided while (CustomModifierToken.IsToken(signature, offset)) { created.Tokens.Add(new CustomModifierToken(signature, offset)); } // byref path if (ElementTypeSignatureToken.IsToken(signature, offset, ElementTypes.ByRef)) { created.Tokens.Add(new ElementTypeSignatureToken(signature, offset)); // ByRef created.Tokens.Add(new TypeSignatureToken(signature, offset)); // Type } // typed by ref or void path path else if (ElementTypeSignatureToken.IsToken(signature, offset, ElementTypes.Void | ElementTypes.TypedByRef)) { created.Tokens.Add(new ElementTypeSignatureToken(signature, offset)); // Void, TypedByRef } // path for byref where byref is not provided else { created.Tokens.Add(new TypeSignatureToken(signature, offset)); } }
/// <summary> /// Initialises a new instance of the ParamSignitureToken class from the provided <paramref name="signiture"/> /// at the specified <paramref name="offset"/>. /// </summary> /// <param name="signiture">The contents of the signiture.</param> /// <param name="offset">The offset of the current token.</param> public ParamSignatureToken(byte[] signiture, Offset offset) : base(SignatureTokens.Param) { while (CustomModifierToken.IsToken(signiture, offset)) { Tokens.Add(new CustomModifierToken(signiture, offset)); HasCustomModifier = true; } // After a custom modifier the parameter can be defined as a ByRef, TypedByRef or Type token. if (ElementTypeSignatureToken.IsToken(signiture, offset, ElementTypes.ByRef)) { Tokens.Add(new ElementTypeSignatureToken(signiture, offset)); // ByRef TypeSignatureToken typeSig = new TypeSignatureToken(signiture, offset); Tokens.Add(typeSig); // Type _elementType = typeSig.ElementType; _isTypeSigniture = true; IsByRef = true; } else if (ElementTypeSignatureToken.IsToken(signiture, offset, ElementTypes.TypedByRef)) { ElementTypeSignatureToken elementSig = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(elementSig); // Type _elementType = elementSig; } else { TypeSignatureToken typeSig = new TypeSignatureToken(signiture, offset); Tokens.Add(typeSig); _elementType = typeSig.ElementType; _isTypeSigniture = true; } }
/// <summary> /// Initialises a new TypeSigniture from the <paramref name="signiture"/> starting at the /// specified <paramref name="offset"/>. /// </summary> /// <param name="signiture">The signiture to parse the type from.</param> /// <param name="offset">The offset to start reading from.</param> public TypeSignatureToken(byte[] signiture, Offset offset) : base(SignatureTokens.Type) { ElementTypeSignatureToken type = new ElementTypeSignatureToken(signiture, offset); TypeSignatureToken childType; Tokens.Add(type); ElementType = type; switch (type.ElementType) { case ElementTypes.SZArray: while (CustomModifierToken.IsToken(signiture, offset)) { CustomModifierToken modifier = new CustomModifierToken(signiture, offset); Tokens.Add(modifier); } childType = new TypeSignatureToken(signiture, offset); Tokens.Add(childType); break; case ElementTypes.Ptr: while (CustomModifierToken.IsToken(signiture, offset)) { CustomModifierToken modifier = new CustomModifierToken(signiture, offset); Tokens.Add(modifier); } childType = new TypeSignatureToken(signiture, offset); Tokens.Add(childType); break; case ElementTypes.GenericInstance: ElementTypeSignatureToken genericType = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(genericType); GenericArgumentCountSignatureToken argCount = new GenericArgumentCountSignatureToken(signiture, offset); Tokens.Add(argCount); for (int i = 0; i < argCount.Count; i++) { TypeSignatureToken genArgType = new TypeSignatureToken(signiture, offset); Tokens.Add(genArgType); } break; case ElementTypes.Array: childType = new TypeSignatureToken(signiture, offset); Tokens.Add(childType); Tokens.Add(new ArrayShapeSignatureToken(signiture, offset)); break; } }
/// <summary> /// Initialise a new instance of a local variable signiture from the <paramref name="signiture"/> /// provided. /// </summary> /// <param name="signiture">The signiture blob.</param> internal LocalVariableSignature(byte[] signiture) : base(Signatures.LocalVariable) { Offset offset = 0; offset.Shift(1); // jump passed the 0x7 indicator CountSignatureToken count = new CountSignatureToken(signiture, offset); Tokens.Add(count); for (int i = 0; i < count.Count; i++) { if (ElementTypeSignatureToken.IsToken(signiture, offset, ElementTypes.TypedByRef)) { ElementTypeSignatureToken typedByRef = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(typedByRef); } else { while (CustomModifierToken.IsToken(signiture, offset) || ConstraintSignatureToken.IsToken(signiture, offset)) { if (CustomModifierToken.IsToken(signiture, offset)) { CustomModifierToken modifier = new CustomModifierToken(signiture, offset); Tokens.Add(modifier); } else { ConstraintSignatureToken constraint = new ConstraintSignatureToken(signiture, offset); Tokens.Add(constraint); } } ElementTypeSignatureToken byRef = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(byRef); ElementTypeSignatureToken type = new ElementTypeSignatureToken(signiture, offset); Tokens.Add(type); } } }
/// <summary> /// Initialises a new instance of the ReturnTypeSignitureToken class. /// </summary> /// <param name="signiture">The signiture to read.</param> /// <param name="offset">The offset to start processing at.</param> public ReturnTypeSignatureToken(byte[] signiture, Offset offset) : base(SignatureTokens.ReturnType) { while (CustomModifierToken.IsToken(signiture, offset)) { Tokens.Add(new CustomModifierToken(signiture, offset)); } if (ElementTypeSignatureToken.IsToken(signiture, offset, ElementTypes.ByRef)) { Tokens.Add(new ElementTypeSignatureToken(signiture, offset)); // ByRef Tokens.Add(new TypeSignatureToken(signiture, offset)); // Type } else if (ElementTypeSignatureToken.IsToken(signiture, offset, ElementTypes.Void | ElementTypes.TypedByRef)) { Tokens.Add(new ElementTypeSignatureToken(signiture, offset)); // Void, TypedByRef } else { Tokens.Add(new TypeSignatureToken(signiture, offset)); } }
/// <summary> /// Initialises a field signiture from the specified <paramref name="signiture"/> blob. /// </summary> /// <param name="signiture">The signiture blob.</param> public FieldSignature(byte[] signiture) : base(Signatures.Field) { Offset offset = 0; if (signiture[offset] != 0x06) { // 0x06 defines the Calling convention FIELD } offset.Shift(1); while (offset < signiture.Length) { while (CustomModifierToken.IsToken(signiture, offset)) { CustomModifierToken modifier = new CustomModifierToken(signiture, offset); Tokens.Add(modifier); } TypeSignatureToken type = new TypeSignatureToken(signiture, offset); Tokens.Add(type); } }