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