Example #1
0
        /// <summary>
        /// Initializes data based on the <see cref="ModifierRecord"/>.
        /// </summary>
        private void Initialize(ModifierRecord record)
        {
            PdbSymbol symbol = PdbModule.GetSymbol(record.ModifiedType);

            symbol.LinkSymbols(this);
            Tag                  = symbol.Tag;
            BasicType            = symbol.BasicType;
            Offset               = symbol.Offset;
            Size                 = symbol.Size;
            IsVirtualInheritance = symbol.IsVirtualInheritance;
            IsForwardReference   = symbol.IsForwardReference;
            UniqueName           = symbol.UniqueName;
            Name                 = symbol.Name;
            if ((record.Modifiers & ModifierOptions.Unaligned) != ModifierOptions.None)
            {
                Name = "unaligned " + Name;
            }
            if ((record.Modifiers & ModifierOptions.Volatile) != ModifierOptions.None)
            {
                Name = "volatile " + Name;
            }
            if ((record.Modifiers & ModifierOptions.Const) != ModifierOptions.None)
            {
                Name = "const " + Name;
            }
        }
        internal async Task <Modifier> Add(ModifierCategory category, ModifierKey modKey, string targetID, string displayText)
        {
            var record = new ModifierRecord
            {
                CategoryID  = category.ID.Value,
                ModKey      = modKey.Value,
                TargetKey   = targetID,
                DisplayText = displayText
            };
            await factory.DB.Modifiers.Create(record);

            return(factory.Modifier(record));
        }
Example #3
0
 internal Modifier Modifier(ModifierRecord record)
 => new Modifier(this, record);
Example #4
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);
        }
Example #5
0
 internal Modifier(AppFactory factory, ModifierRecord record)
 {
     this.factory = factory;
     this.record  = record ?? new ModifierRecord();
     ID           = new EntityID(this.record.ID);
 }