Пример #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbPointerType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 /// <param name="elementType">PDB type of object pointed to.</param>
 /// <param name="size">The type size in bytes.</param>
 /// <param name="isLValueReference"><c>true</c> if pointer is L-value reference</param>
 /// <param name="isRValueReference"><c>true</c> if pointer is R-value reference</param>
 internal PdbPointerType(PdbFileReader pdb, TypeIndex typeIndex, ModifierOptions modifierOptions, TypeIndex elementType, ulong size, bool isLValueReference, bool isRValueReference)
     : base(pdb, typeIndex, modifierOptions, pdb[elementType].Name + "*", size)
 {
     ElementType       = pdb[elementType];
     IsLValueReference = isLValueReference;
     IsRValueReference = isRValueReference;
 }
Пример #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="modifierOptions">The modifier options.</param>
 /// <param name="name">The type name.</param>
 /// <param name="size">The type size in bytes.</param>
 internal PdbType(PdbFileReader pdb, TypeIndex typeIndex, ModifierOptions modifierOptions, string name, ulong size)
 {
     Pdb             = pdb;
     ModifierOptions = modifierOptions;
     TypeIndex       = typeIndex;
     Name            = name;
     Size            = size;
 }
Пример #3
0
        /// <summary>
        /// Sets the modifier options from another set of options.
        /// </summary>
        /// <param name="options">The options.</param>
        public void Apply(ModifierOptions options)
        {
            if (options == null)
            {
                return;
            }

            Access     = options.Access;
            IsAbstract = options.IsAbstract;
            IsExtern   = options.IsExtern;
            IsStatic   = options.IsStatic;
        }
 /// <summary>
 /// Combines modifier options with pointer record data.
 /// </summary>
 /// <param name="modifierOptions">The modifier options.</param>
 /// <param name="pointerRecord">The pointer record.</param>
 private static ModifierOptions CombineModifierOptions(ModifierOptions modifierOptions, PointerRecord pointerRecord)
 {
     if (pointerRecord.IsConst)
     {
         modifierOptions |= ModifierOptions.Const;
     }
     if (pointerRecord.IsVolatile)
     {
         modifierOptions |= ModifierOptions.Volatile;
     }
     if (pointerRecord.IsUnaligned)
     {
         modifierOptions |= ModifierOptions.Unaligned;
     }
     return(modifierOptions);
 }
Пример #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbSimpleType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbSimpleType(PdbFileReader pdb, TypeIndex typeIndex, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, modifierOptions, typeIndex.SimpleTypeName, GetSize(typeIndex))
 {
 }
Пример #6
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="unionRecord">The union record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbUnionType(PdbFileReader pdb, TypeIndex typeIndex, UnionRecord unionRecord, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, unionRecord, modifierOptions, unionRecord.Size)
 {
     UnionRecord = unionRecord;
 }
Пример #7
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);
 }
Пример #8
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="tagRecord">The tag record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 /// <param name="size">The type size in bytes.</param>
 internal PdbUserDefinedType(PdbFileReader pdb, TypeIndex typeIndex, TagRecord tagRecord, ModifierOptions modifierOptions, ulong size)
     : base(pdb, typeIndex, modifierOptions, tagRecord.Name.String, size)
 {
     TagRecord               = tagRecord;
     fieldsCache             = SimpleCache.CreateWithContext(this, CallEnumerateFields);
     staticFieldsCache       = SimpleCache.CreateWithContext(this, CallEnumerateStaticFields);
     baseClassesCache        = SimpleCache.CreateWithContext(this, CallEnumerateBaseClasses);
     virtualBaseClassesCache = SimpleCache.CreateWithContext(this, CallEnumerateVirtualBaseClasses);
 }
Пример #9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbFunctionType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="procedureRecord">The procedure record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbFunctionType(PdbFileReader pdb, TypeIndex typeIndex, ProcedureRecord procedureRecord, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, modifierOptions, string.Empty, 0)
 {
     ProcedureRecord = procedureRecord;
     argumentsCache  = SimpleCache.CreateWithContext(this, CallEnumerateArguments);
 }
Пример #10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbArrayType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="arrayRecord">The array record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbArrayType(PdbFileReader pdb, TypeIndex typeIndex, ArrayRecord arrayRecord, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, modifierOptions, GetTypeName(pdb, arrayRecord), arrayRecord.Size)
 {
     ArrayRecord = arrayRecord;
 }
Пример #11
0
        /// <summary>
        /// Creates <see cref="PdbType"/> read from <see cref="PdbFile"/> for the specified type index.
        /// </summary>
        /// <param name="typeIndex">Type index.</param>
        /// <param name="modifierOptions">Modifier options for new type.</param>
        /// <param name="originalTypeIndex">Original type index of the PDB type.</param>
        private PdbType CreateType(TypeIndex typeIndex, ModifierOptions modifierOptions, TypeIndex originalTypeIndex)
        {
            if (typeIndex.IsSimple)
            {
                if (typeIndex.SimpleMode != SimpleTypeMode.Direct)
                {
                    return(new PdbSimplePointerType(this, typeIndex, modifierOptions));
                }
                return(new PdbSimpleType(this, typeIndex, modifierOptions));
            }

            TypeRecord typeRecord = PdbFile.TpiStream[typeIndex];

            if (typeRecord is ModifierRecord modifierRecord)
            {
                return(CreateType(modifierRecord.ModifiedType, modifierRecord.Modifiers, originalTypeIndex));
            }

            if (typeRecord is TagRecord tagRecord && tagRecord.IsForwardReference)
            {
                // Resolve forward references
                TagRecord resolvedRecord = null;

                if (PdbFile.TpiStream.HashTable != null)
                {
                    TagRecord FindUdtByHash(uint hash)
                    {
                        var bucket = PdbFile.TpiStream.HashTable[hash % PdbFile.TpiStream.Header.HashBucketsCount];

                        while (bucket != null)
                        {
                            TypeRecord record = PdbFile.TpiStream[bucket.TypeIndex];

                            if (record is TagRecord tag && tagRecord.Name.String == tag.Name.String)
                            {
                                return(tag);
                            }
                            bucket = bucket.Next;
                        }
                        return(null);
                    }

                    resolvedRecord = FindUdtByHash(HashTable.HashStringV1(tagRecord.Name.String));
                    if (resolvedRecord == null && tagRecord.HasUniqueName)
                    {
                        resolvedRecord = FindUdtByHash(HashTable.HashStringV1(tagRecord.UniqueName.String));
                    }
                }
                else
                {
                    resolvedRecord = PdbFile.TpiStream[typeRecord.Kind].OfType <TagRecord>().LastOrDefault(r => !r.IsForwardReference && r.UniqueName.String == tagRecord.UniqueName.String);
                }
                if (resolvedRecord != null)
                {
                    typeRecord = resolvedRecord;
                }
            }

            if (typeRecord is ClassRecord classRecord)
            {
                return(new PdbClassType(this, originalTypeIndex, classRecord, modifierOptions));
            }
            if (typeRecord is UnionRecord unionRecord)
            {
                return(new PdbUnionType(this, originalTypeIndex, unionRecord, modifierOptions));
            }
            if (typeRecord is EnumRecord enumRecord)
            {
                return(new PdbEnumType(this, originalTypeIndex, enumRecord, modifierOptions));
            }
            if (typeRecord is ArrayRecord arrayRecord)
            {
                return(new PdbArrayType(this, originalTypeIndex, arrayRecord, modifierOptions));
            }
            if (typeRecord is PointerRecord pointerRecord)
            {
                return(new PdbComplexPointerType(this, originalTypeIndex, pointerRecord, modifierOptions));
            }
            if (typeRecord is ProcedureRecord procedureRecord)
            {
                return(new PdbFunctionType(this, originalTypeIndex, procedureRecord, modifierOptions));
            }
            if (typeRecord is MemberFunctionRecord memberFunctionRecord)
            {
                return(new PdbMemberFunctionType(this, originalTypeIndex, memberFunctionRecord, modifierOptions));
            }

#if DEBUG
            throw new NotImplementedException();
#else
            return(null);
#endif
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbSimplePointerType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbSimplePointerType(PdbFileReader pdb, TypeIndex typeIndex, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, modifierOptions, new TypeIndex(typeIndex.SimpleKind), GetPointerSize(typeIndex), isLValueReference: false, isRValueReference: false)
 {
 }
Пример #13
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="classRecord">The class record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbClassType(PdbFileReader pdb, TypeIndex typeIndex, ClassRecord classRecord, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, classRecord, modifierOptions, classRecord.Size)
 {
     ClassRecord = classRecord;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbComplexPointerType"/> class.
 /// </summary>
 /// <param name="pdb">The PDB file reader.</param>
 /// <param name="typeIndex">Type index.</param>
 /// <param name="pointerRecord">The pointer record.</param>
 /// <param name="modifierOptions">The modifier options.</param>
 internal PdbComplexPointerType(PdbFileReader pdb, TypeIndex typeIndex, PointerRecord pointerRecord, ModifierOptions modifierOptions)
     : base(pdb, typeIndex, CombineModifierOptions(modifierOptions, pointerRecord), pointerRecord.ReferentType, GetPointerSize(pointerRecord), pointerRecord.Mode == PointerMode.LValueReference, pointerRecord.Mode == PointerMode.RValueReference)
 {
     PointerRecord = pointerRecord;
 }