/// <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; }
/// <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; }
/// <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); }
/// <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)) { }
/// <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; }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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) { }
/// <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; }