Esempio n. 1
0
        /// <summary>
        /// Reads type record for the specified type index.
        /// </summary>
        /// <param name="typeIndex">Type record index in <see cref="references"/> list.</param>
        /// <returns></returns>
        private TypeRecord ReadType(int typeIndex)
        {
            IBinaryReader   reader    = typeRecordsSubStreamPerThread.Value;
            RecordReference reference = references[typeIndex];
            TypeRecord      typeRecord;
            long            dataEnd = reference.DataOffset + reference.DataLen;

            reader.Position = reference.DataOffset;
            switch (reference.Kind)
            {
            case TypeLeafKind.LF_MODIFIER:
                typeRecord = ModifierRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_PROCEDURE:
                typeRecord = ProcedureRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_MFUNCTION:
                typeRecord = MemberFunctionRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_LABEL:
                typeRecord = LabelRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_MFUNC_ID:
                typeRecord = MemberFunctionIdRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_ARGLIST:
                typeRecord = ArgumentListRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_SUBSTR_LIST:
                typeRecord = StringListRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_POINTER:
                typeRecord = PointerRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_NESTTYPE:
                typeRecord = NestedTypeRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_FIELDLIST:
                typeRecord = FieldListRecord.Read(reader, reference.Kind, reference.DataLen);
                break;

            case TypeLeafKind.LF_ENUM:
                typeRecord = EnumRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_CLASS:
            case TypeLeafKind.LF_STRUCTURE:
            case TypeLeafKind.LF_INTERFACE:
                typeRecord = ClassRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_ARRAY:
                typeRecord = ArrayRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_BITFIELD:
                typeRecord = BitFieldRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_METHODLIST:
                typeRecord = MethodOverloadListRecord.Read(reader, reference.Kind, reference.DataLen);
                break;

            case TypeLeafKind.LF_UNION:
                typeRecord = UnionRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_VTSHAPE:
                typeRecord = VirtualFunctionTableShapeRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_UDT_MOD_SRC_LINE:
                typeRecord = UdtModuleSourceLineRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_STRING_ID:
                typeRecord = StringIdRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_BUILDINFO:
                typeRecord = BuildInfoRecord.Read(reader, reference.Kind);
                break;

            case TypeLeafKind.LF_FUNC_ID:
                typeRecord = FunctionIdRecord.Read(reader, reference.Kind);
                break;

            default:
#if DEBUG
                throw new NotImplementedException($"Unknown reference kind: {reference.Kind}");
#else
                return(null);
#endif
            }
            if (reader.Position + 4 < dataEnd || reader.Position > dataEnd)
            {
                throw new Exception("Parsing went wrong");
            }
            return(typeRecord);
        }
Esempio n. 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="enumRecord">The enum record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbEnumType(PdbFileReader pdb, TypeIndex typeIndex, EnumRecord enumRecord, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, enumRecord, modifierOptions, pdb[enumRecord.UnderlyingType].Size)
 {
     EnumRecord  = enumRecord;
     valuesCache = SimpleCache.CreateWithContext(this, CallEnumerateValues);
 }