/// <summary> /// Reads <see cref="MethodOverloadListRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> /// <param name="dataLength">Record data length.</param> public static MethodOverloadListRecord Read(IBinaryReader reader, TypeLeafKind kind, uint dataLength) { long endPosition = reader.Position + dataLength; List <OneMethodRecord> methods = new List <OneMethodRecord>(); while (reader.Position < endPosition) { methods.Add(OneMethodRecord.Read(reader, TypeLeafKind.LF_ONEMETHOD, isFromOverloadedList: true)); } return(new MethodOverloadListRecord { Kind = kind, Methods = methods, }); }
/// <summary> /// Reads <see cref="OneMethodRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> /// <param name="isFromOverloadedList"><c>true</c> if we are reading this from <see cref="MethodOverloadListRecord"/>.</param> public static OneMethodRecord Read(IBinaryReader reader, TypeLeafKind kind, bool isFromOverloadedList = false) { var record = new OneMethodRecord { Kind = kind, Attributes = MemberAttributes.Read(reader) }; if (isFromOverloadedList) { reader.Move(2); // 2 = sizeof(ushort) } record.Type = TypeIndex.Read(reader); record.VFTableOffset = record.Attributes.IsIntroducedVirtual ? reader.ReadInt() : -1; if (!isFromOverloadedList) { record.Name = reader.ReadCString(); } return(record); }
/// <summary> /// Reads <see cref="FieldListRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> /// <param name="dataLength">Record data length.</param> public static FieldListRecord Read(IBinaryReader reader, TypeLeafKind kind, uint dataLength) { long positionEnd = reader.Position + dataLength; List <TypeRecord> fields = new List <TypeRecord>(); while (reader.Position < positionEnd) { // Read leaf TypeRecord record; TypeLeafKind leaf = (TypeLeafKind)reader.ReadUshort(); switch (leaf) { case TypeLeafKind.LF_ENUMERATE: record = EnumeratorRecord.Read(reader, leaf); break; case TypeLeafKind.LF_MEMBER: record = DataMemberRecord.Read(reader, leaf); break; case TypeLeafKind.LF_NESTTYPE: record = NestedTypeRecord.Read(reader, leaf); break; case TypeLeafKind.LF_ONEMETHOD: record = OneMethodRecord.Read(reader, leaf); break; case TypeLeafKind.LF_METHOD: record = OverloadedMethodRecord.Read(reader, leaf); break; case TypeLeafKind.LF_BCLASS: case TypeLeafKind.LF_INTERFACE: record = BaseClassRecord.Read(reader, leaf); break; case TypeLeafKind.LF_VFUNCTAB: record = VirtualFunctionPointerRecord.Read(reader, leaf); break; case TypeLeafKind.LF_STMEMBER: record = StaticDataMemberRecord.Read(reader, leaf); break; case TypeLeafKind.LF_VBCLASS: case TypeLeafKind.LF_IVBCLASS: record = VirtualBaseClassRecord.Read(reader, leaf); break; case TypeLeafKind.LF_INDEX: record = ListContinuationRecord.Read(reader, leaf); break; default: throw new NotImplementedException(); } fields.Add(record); // Read padding if (reader.Position < positionEnd) { byte padding = reader.ReadByte(); if (padding > 0xf0) { byte offset = (byte)((padding & 0x0f) - 1); if (offset > 0) { reader.Position += offset; } } else { reader.Position--; } } } return(new FieldListRecord { Kind = kind, Fields = fields, }); }