Ejemplo n.º 1
0
        /// <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));
            }
        }
Ejemplo n.º 7
0
        /// <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);
            }
        }