Example #1
0
        public CLRSigMethodSpec(CLRSignatureParser parser)
        {
            if (parser.NextToken() != CLRSignatureParser.Token.GENERICINST)
                throw new ParseFailedException("Malformed method spec");
            parser.ConsumeToken();
            uint numGenericParams = parser.ReadCompressedUInt();
            Types = new CLRSigType[numGenericParams];

            for (uint i = 0; i < numGenericParams; i++)
            {
                Types[i] = CLRSigType.Parse(parser, false);
            }
        }
Example #2
0
        public CLRSigTypeGenericInstantiation(ElementType type, CLRSignatureParser parser)
        {
            BasicType = type;

            ElementType instType = (ElementType)parser.NextByte();
            parser.ConsumeByte();
            if (instType == ElementType.CLASS)
                InstantiationType = InstType.Class;
            else if (instType == ElementType.VALUETYPE)
                InstantiationType = InstType.ValueType;
            else
                throw new ParseFailedException("Unexpected instantiation type");
            GenericType = parser.ReadTypeDefOrRefOrSpecEncoded();
            uint genArgCount = parser.ReadCompressedUInt();

            ArgTypes = new CLRSigType[genArgCount];
            for (uint i = 0; i < genArgCount; i++)
                ArgTypes[i] = CLRSigType.Parse(parser, false);
        }
Example #3
0
 public CLRSigTypeArray(ElementType type, CLRSigType containedType)
 {
     BasicType = type;
     Rank = 1;
     Sizes = new uint[0];
     LowBounds = new int[0];
     ContainedType = containedType;
 }
 private static bool IsValidFieldOrPropType(CLRSigType.ElementType t)
 {
     if (t != CLRSigType.ElementType.BOOLEAN &&
                     t != CLRSigType.ElementType.CHAR &&
                     t != CLRSigType.ElementType.STRING &&
                     t != CLRSigType.ElementType.I1 &&
                     t != CLRSigType.ElementType.I2 &&
                     t != CLRSigType.ElementType.I4 &&
                     t != CLRSigType.ElementType.I8 &&
                     t != CLRSigType.ElementType.U1 &&
                     t != CLRSigType.ElementType.U2 &&
                     t != CLRSigType.ElementType.U4 &&
                     t != CLRSigType.ElementType.U8 &&
                     t != CLRSigType.ElementType.R4 &&
                     t != CLRSigType.ElementType.R8)
         return false;
     return true;
 }
        private void Parse(CLRSignatureParser parser, CLRSigType elemType)
        {
            ElementType = elemType.BasicType;

            switch (elemType.BasicType)
            {
                case CLRSigType.ElementType.BOOLEAN:
                    Value = (parser.ReadU8() != 0);
                    break;
                case CLRSigType.ElementType.CHAR:
                    Value = (char)(parser.ReadU16());
                    break;
                case CLRSigType.ElementType.R4:
                    Value = parser.ReadF32();
                    break;
                case CLRSigType.ElementType.R8:
                    Value = parser.ReadF64();
                    break;
                case CLRSigType.ElementType.I1:
                    Value = parser.ReadS8();
                    break;
                case CLRSigType.ElementType.U1:
                    Value = parser.ReadU8();
                    break;
                case CLRSigType.ElementType.I2:
                    Value = parser.ReadS16();
                    break;
                case CLRSigType.ElementType.U2:
                    Value = parser.ReadU16();
                    break;
                case CLRSigType.ElementType.I4:
                    Value = parser.ReadS32();
                    break;
                case CLRSigType.ElementType.U4:
                    Value = parser.ReadU32();
                    break;
                case CLRSigType.ElementType.I8:
                    Value = parser.ReadS64();
                    break;
                case CLRSigType.ElementType.U8:
                    Value = parser.ReadU64();
                    break;
                case CLRSigType.ElementType.STRING:
                    Value = ReadUTF8String(parser);
                    break;
                case CLRSigType.ElementType.OBJECT:
                    Parse(parser, ReadFieldOrPropType(parser));
                    return;
                case CLRSigType.ElementType.CLASS:
                case CLRSigType.ElementType.VALUETYPE:
                    {
                        CLRSigTypeStructured st = (CLRSigTypeStructured)elemType;
                        CLRTableRow underlyingType = st.TypeDefOrRefOrSpec;
                        string typeNamespace, typeName;
                        if (underlyingType is CLRTypeDefRow)
                        {
                            CLRTypeDefRow typeDef = (CLRTypeDefRow)underlyingType;
                            typeNamespace = typeDef.TypeNamespace;
                            typeName = typeDef.TypeName;
                        }
                        else if (underlyingType is CLRTypeRefRow)
                        {
                            CLRTypeRefRow typeRef = (CLRTypeRefRow)underlyingType;
                            typeNamespace = typeRef.TypeNamespace;
                            typeName = typeRef.TypeName;
                        }
                        else
                            throw new ParseFailedException("Unusual CA type");

                        if (typeNamespace == "System" && typeName == "Type")
                        {
                            Parse(parser, new CLRSigTypeSimple(CLRSigType.ElementType.STRING));
                            return;
                        }

                        // Must be an enum
                        {
                            CLRTypeDefRow enumType;

                            if (underlyingType is CLRTypeDefRow)
                                enumType = (CLRTypeDefRow)underlyingType;
                            else if (underlyingType is CLRTypeRefRow)
                            {
                                CLRTypeRefRow typeRef = (CLRTypeRefRow)underlyingType;
                                if (typeRef.Resolution == null)
                                    throw new ParseFailedException("Custom attribute references unresolved enum type");
                                enumType = typeRef.Resolution;
                            }
                            else
                                throw new ParseFailedException("Unexpected CA underlying type");

                            CLRSigType valueType = null;

                            foreach (CLRFieldRow field in enumType.Fields)
                            {
                                if (!field.Static)
                                {
                                    valueType = field.Signature.Type;
                                    break;
                                }
                            }

                            if (valueType == null)
                                throw new ParseFailedException("Unknown CA enum type");
                            Parse(parser, valueType);
                        }
                    }
                    break;
                default:
                    throw new NotSupportedException("Unsupported custom attrib type");
            }
        }
 public CLRSigCustomAttributeElem(CLRSignatureParser parser, CLRSigType overallType)
 {
     Parse(parser, overallType);
 }
Example #7
0
 public static string SimpleTypeFullName(CLRSigType.ElementType basicType)
 {
     switch (basicType)
     {
         case CLRSigType.ElementType.BOOLEAN:
             return "System.Boolean";
         case CLRSigType.ElementType.CHAR:
             return "System.Char";
         case CLRSigType.ElementType.R4:
             return "System.Single";
         case CLRSigType.ElementType.R8:
             return "System.Double";
         case CLRSigType.ElementType.I1:
             return "System.SByte";
         case CLRSigType.ElementType.U1:
             return "System.Byte";
         case CLRSigType.ElementType.I2:
             return "System.Int16";
         case CLRSigType.ElementType.U2:
             return "System.UInt16";
         case CLRSigType.ElementType.I4:
             return "System.Int32";
         case CLRSigType.ElementType.U4:
             return "System.UInt32";
         case CLRSigType.ElementType.I8:
             return "System.Int64";
         case CLRSigType.ElementType.U8:
             return "System.UInt16";
         case CLRSigType.ElementType.STRING:
             return "System.String";
         case CLRSigType.ElementType.OBJECT:
             return "System.Object";
         case CLRSigType.ElementType.I:
             return "System.IntPtr";
         case CLRSigType.ElementType.U:
             return "System.UIntPtr";
     }
     throw new ArgumentException();
 }