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> /// 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)); } }