Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DebugDirectoryBuilder.cs
Go to the documentation of this file.
3using System.IO;
6
8
9public sealed class DebugDirectoryBuilder
10{
11 private struct Entry
12 {
13 public uint Stamp;
14
15 public uint Version;
16
18
19 public int DataSize;
20 }
21
22 private readonly List<Entry> _entries;
23
24 private readonly BlobBuilder _dataBuilder;
25
26 internal int TableSize => 28 * _entries.Count;
27
28 internal int Size => (TableSize + _dataBuilder?.Count).GetValueOrDefault();
29
31 {
32 _entries = new List<Entry>(3);
34 }
35
36 internal void AddEntry(DebugDirectoryEntryType type, uint version, uint stamp, int dataSize)
37 {
39 {
40 Stamp = stamp,
41 Version = version,
42 Type = type,
43 DataSize = dataSize
44 });
45 }
46
47 public void AddEntry(DebugDirectoryEntryType type, uint version, uint stamp)
48 {
49 AddEntry(type, version, stamp, 0);
50 }
51
53 {
54 if (dataSerializer == null)
55 {
56 Throw.ArgumentNull("dataSerializer");
57 }
60 int dataSize = _dataBuilder.Count - count;
61 AddEntry(type, version, stamp, dataSize);
62 }
63
68
70 {
71 if (pdbPath == null)
72 {
73 Throw.ArgumentNull("pdbPath");
74 }
75 if (age < 1)
76 {
78 }
79 if (pdbPath.Length == 0 || pdbPath.IndexOf('\0') == 0)
80 {
82 }
84 {
85 Throw.ArgumentOutOfRange("portablePdbVersion");
86 }
89 }
90
92 {
93 AddEntry(DebugDirectoryEntryType.Reproducible, 0u, 0u);
94 }
95
96 private static int WriteCodeViewData(BlobBuilder builder, string pdbPath, Guid pdbGuid, int age)
97 {
98 int count = builder.Count;
99 builder.WriteByte(82);
100 builder.WriteByte(83);
101 builder.WriteByte(68);
102 builder.WriteByte(83);
103 builder.WriteGuid(pdbGuid);
104 builder.WriteInt32(age);
105 builder.WriteUTF8(pdbPath);
106 builder.WriteByte(0);
107 return builder.Count - count;
108 }
109
111 {
112 if (algorithmName == null)
113 {
114 Throw.ArgumentNull("algorithmName");
115 }
116 if (algorithmName.Length == 0)
117 {
118 Throw.ArgumentEmptyString("algorithmName");
119 }
120 if (checksum.IsDefault)
121 {
122 Throw.ArgumentNull("checksum");
123 }
124 if (checksum.Length == 0)
125 {
126 Throw.ArgumentEmptyArray("checksum");
127 }
129 AddEntry(DebugDirectoryEntryType.PdbChecksum, 1u, 0u, dataSize);
130 }
131
133 {
134 int count = builder.Count;
135 builder.WriteUTF8(algorithmName);
136 builder.WriteByte(0);
137 builder.WriteBytes(checksum);
138 return builder.Count - count;
139 }
140
142 {
143 int num = sectionOffset + TableSize;
144 foreach (Entry entry in _entries)
145 {
146 int value;
147 int value2;
148 if (entry.DataSize > 0)
149 {
150 value = sectionLocation.RelativeVirtualAddress + num;
151 value2 = sectionLocation.PointerToRawData + num;
152 }
153 else
154 {
155 value = 0;
156 value2 = 0;
157 }
158 builder.WriteUInt32(0u);
159 builder.WriteUInt32(entry.Stamp);
160 builder.WriteUInt32(entry.Version);
161 builder.WriteInt32((int)entry.Type);
162 builder.WriteInt32(entry.DataSize);
163 builder.WriteInt32(value);
164 builder.WriteInt32(value2);
165 num += entry.DataSize;
166 }
167 builder.LinkSuffix(_dataBuilder);
168 }
169
171 {
172 if (debugMetadata == null)
173 {
174 Throw.ArgumentNull("debugMetadata");
175 }
176 if (portablePdbVersion < 256)
177 {
178 Throw.ArgumentOutOfRange("portablePdbVersion");
179 }
182 }
183
185 {
186 int count = builder.Count;
187 builder.WriteUInt32(1111773261u);
188 builder.WriteInt32(debugMetadata.Count);
191 {
192 foreach (Blob blob in debugMetadata.GetBlobs())
193 {
195 deflateStream.Write(bytes.Array, bytes.Offset, bytes.Count);
196 }
197 }
198 builder.WriteBytes(memoryStream.ToArray());
199 return builder.Count - count;
200 }
201}
void Add(TKey key, TValue value)
static uint DebugDirectoryEntryVersion(ushort portablePdbVersion)
static uint DebugDirectoryEmbeddedVersion(ushort portablePdbVersion)
static int WriteEmbeddedPortablePdbData(BlobBuilder builder, BlobBuilder debugMetadata)
void AddEntry(DebugDirectoryEntryType type, uint version, uint stamp, int dataSize)
void Serialize(BlobBuilder builder, SectionLocation sectionLocation, int sectionOffset)
void AddEntry(DebugDirectoryEntryType type, uint version, uint stamp)
void AddCodeViewEntry(string pdbPath, BlobContentId pdbContentId, ushort portablePdbVersion, int age)
static int WritePdbChecksumData(BlobBuilder builder, string algorithmName, ImmutableArray< byte > checksum)
static int WriteCodeViewData(BlobBuilder builder, string pdbPath, Guid pdbGuid, int age)
void AddEntry< TData >(DebugDirectoryEntryType type, uint version, uint stamp, TData data, Action< BlobBuilder, TData > dataSerializer)
void AddCodeViewEntry(string pdbPath, BlobContentId pdbContentId, ushort portablePdbVersion)
void AddEmbeddedPortablePdbEntry(BlobBuilder debugMetadata, ushort portablePdbVersion)
void AddPdbChecksumEntry(string algorithmName, ImmutableArray< byte > checksum)
static void ArgumentNull(string parameterName)
Definition Throw.cs:110
static void ArgumentEmptyString(string parameterName)
Definition Throw.cs:117
static void ArgumentEmptyArray(string parameterName)
Definition Throw.cs:124
static void ArgumentOutOfRange(string parameterName)
Definition Throw.cs:145
static void InvalidArgument(string message, string parameterName)
Definition Throw.cs:19
static string ExpectedNonEmptyString
Definition SR.cs:206
Definition SR.cs:7
ArraySegment< byte > GetBytes()
Definition Blob.cs:20