Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
MetadataSizes.cs
Go to the documentation of this file.
3
5
6public sealed class MetadataSizes
7{
8 internal const int MaxMetadataVersionByteCount = 254;
9
10 internal readonly int MetadataVersionPaddedLength;
11
12 internal const ulong SortedDebugTables = 55169095435288576uL;
13
14 internal readonly bool IsEncDelta;
15
16 internal readonly bool IsCompressed;
17
18 internal readonly bool BlobReferenceIsSmall;
19
20 internal readonly bool StringReferenceIsSmall;
21
22 internal readonly bool GuidReferenceIsSmall;
23
25
26 internal readonly bool DeclSecurityCodedIndexIsSmall;
27
28 internal readonly bool EventDefReferenceIsSmall;
29
30 internal readonly bool FieldDefReferenceIsSmall;
31
32 internal readonly bool GenericParamReferenceIsSmall;
33
34 internal readonly bool HasConstantCodedIndexIsSmall;
35
37
38 internal readonly bool HasFieldMarshalCodedIndexIsSmall;
39
40 internal readonly bool HasSemanticsCodedIndexIsSmall;
41
42 internal readonly bool ImplementationCodedIndexIsSmall;
43
44 internal readonly bool MemberForwardedCodedIndexIsSmall;
45
46 internal readonly bool MemberRefParentCodedIndexIsSmall;
47
48 internal readonly bool MethodDefReferenceIsSmall;
49
50 internal readonly bool MethodDefOrRefCodedIndexIsSmall;
51
52 internal readonly bool ModuleRefReferenceIsSmall;
53
54 internal readonly bool ParameterReferenceIsSmall;
55
56 internal readonly bool PropertyDefReferenceIsSmall;
57
58 internal readonly bool ResolutionScopeCodedIndexIsSmall;
59
60 internal readonly bool TypeDefReferenceIsSmall;
61
62 internal readonly bool TypeDefOrRefCodedIndexIsSmall;
63
64 internal readonly bool TypeOrMethodDefCodedIndexIsSmall;
65
66 internal readonly bool DocumentReferenceIsSmall;
67
68 internal readonly bool LocalVariableReferenceIsSmall;
69
70 internal readonly bool LocalConstantReferenceIsSmall;
71
72 internal readonly bool ImportScopeReferenceIsSmall;
73
75
76 internal readonly ulong PresentTablesMask;
77
78 internal readonly ulong ExternalTablesMask;
79
80 internal readonly int MetadataStreamStorageSize;
81
82 internal readonly int MetadataTableStreamSize;
83
84 internal readonly int StandalonePdbStreamSize;
85
86 internal const int PdbIdSize = 20;
87
89
91
93
95
96 internal int MetadataHeaderSize => 16 + MetadataVersionPaddedLength + 2 + 2 + (IsStandaloneDebugMetadata ? 16 : 0) + 76 + (IsEncDelta ? 16 : 0);
97
99
100 internal MetadataSizes(ImmutableArray<int> rowCounts, ImmutableArray<int> externalRowCounts, ImmutableArray<int> heapSizes, int metadataVersionByteCount, bool isStandaloneDebugMetadata)
101 {
102 RowCounts = rowCounts;
103 ExternalRowCounts = externalRowCounts;
104 HeapSizes = heapSizes;
105 MetadataVersionPaddedLength = BitArithmetic.Align(metadataVersionByteCount + 1, 4);
107 ExternalTablesMask = ComputeNonEmptyTableMask(externalRowCounts);
108 bool flag = IsPresent(TableIndex.EncLog) || IsPresent(TableIndex.EncMap);
109 bool flag2 = !flag;
110 IsEncDelta = flag;
111 IsCompressed = flag2;
112 BlobReferenceIsSmall = flag2 && heapSizes[2] <= 65535;
113 StringReferenceIsSmall = flag2 && heapSizes[1] <= 65535;
114 GuidReferenceIsSmall = flag2 && heapSizes[3] <= 65535;
121 HasCustomAttributeCodedIndexIsSmall = IsReferenceSmall(5, TableIndex.MethodDef, TableIndex.Field, TableIndex.TypeRef, TableIndex.TypeDef, TableIndex.Param, TableIndex.InterfaceImpl, TableIndex.MemberRef, TableIndex.Module, TableIndex.DeclSecurity, TableIndex.Property, TableIndex.Event, TableIndex.StandAloneSig, TableIndex.ModuleRef, TableIndex.TypeSpec, TableIndex.Assembly, TableIndex.AssemblyRef, TableIndex.File, TableIndex.ExportedType, TableIndex.ManifestResource, TableIndex.GenericParam, TableIndex.GenericParamConstraint, TableIndex.MethodSpec);
126 MemberRefParentCodedIndexIsSmall = IsReferenceSmall(3, TableIndex.TypeDef, TableIndex.TypeRef, TableIndex.ModuleRef, TableIndex.MethodDef, TableIndex.TypeSpec);
140 HasCustomDebugInformationCodedIndexIsSmall = IsReferenceSmall(5, TableIndex.MethodDef, TableIndex.Field, TableIndex.TypeRef, TableIndex.TypeDef, TableIndex.Param, TableIndex.InterfaceImpl, TableIndex.MemberRef, TableIndex.Module, TableIndex.DeclSecurity, TableIndex.Property, TableIndex.Event, TableIndex.StandAloneSig, TableIndex.ModuleRef, TableIndex.TypeSpec, TableIndex.Assembly, TableIndex.AssemblyRef, TableIndex.File, TableIndex.ExportedType, TableIndex.ManifestResource, TableIndex.GenericParam, TableIndex.GenericParamConstraint, TableIndex.MethodSpec, TableIndex.Document, TableIndex.LocalScope, TableIndex.LocalVariable, TableIndex.LocalConstant, TableIndex.ImportScope);
142 byte b = (byte)(BlobReferenceIsSmall ? 2 : 4);
143 byte b2 = (byte)(StringReferenceIsSmall ? 2 : 4);
144 byte b3 = (byte)(GuidReferenceIsSmall ? 2 : 4);
145 byte b4 = (byte)(CustomAttributeTypeCodedIndexIsSmall ? 2 : 4);
146 byte b5 = (byte)(DeclSecurityCodedIndexIsSmall ? 2 : 4);
147 byte b6 = (byte)(EventDefReferenceIsSmall ? 2 : 4);
148 byte b7 = (byte)(FieldDefReferenceIsSmall ? 2 : 4);
149 byte b8 = (byte)(GenericParamReferenceIsSmall ? 2 : 4);
150 byte b9 = (byte)(HasConstantCodedIndexIsSmall ? 2 : 4);
151 byte b10 = (byte)(HasCustomAttributeCodedIndexIsSmall ? 2 : 4);
152 byte b11 = (byte)(HasFieldMarshalCodedIndexIsSmall ? 2 : 4);
153 byte b12 = (byte)(HasSemanticsCodedIndexIsSmall ? 2 : 4);
154 byte b13 = (byte)(ImplementationCodedIndexIsSmall ? 2 : 4);
155 byte b14 = (byte)(MemberForwardedCodedIndexIsSmall ? 2 : 4);
156 byte b15 = (byte)(MemberRefParentCodedIndexIsSmall ? 2 : 4);
157 byte b16 = (byte)(MethodDefReferenceIsSmall ? 2 : 4);
158 byte b17 = (byte)(MethodDefOrRefCodedIndexIsSmall ? 2 : 4);
159 byte b18 = (byte)(ModuleRefReferenceIsSmall ? 2 : 4);
160 byte b19 = (byte)(ParameterReferenceIsSmall ? 2 : 4);
161 byte b20 = (byte)(PropertyDefReferenceIsSmall ? 2 : 4);
162 byte b21 = (byte)(ResolutionScopeCodedIndexIsSmall ? 2 : 4);
163 byte b22 = (byte)(TypeDefReferenceIsSmall ? 2 : 4);
164 byte b23 = (byte)(TypeDefOrRefCodedIndexIsSmall ? 2 : 4);
165 byte b24 = (byte)(TypeOrMethodDefCodedIndexIsSmall ? 2 : 4);
166 byte b25 = (byte)(DocumentReferenceIsSmall ? 2 : 4);
167 byte b26 = (byte)(LocalVariableReferenceIsSmall ? 2 : 4);
168 byte b27 = (byte)(LocalConstantReferenceIsSmall ? 2 : 4);
169 byte b28 = (byte)(ImportScopeReferenceIsSmall ? 2 : 4);
170 byte b29 = (byte)(HasCustomDebugInformationCodedIndexIsSmall ? 2 : 4);
171 num += GetTableSize(TableIndex.Module, 2 + 3 * b3 + b2);
172 num += GetTableSize(TableIndex.TypeRef, b21 + b2 + b2);
173 num += GetTableSize(TableIndex.TypeDef, 4 + b2 + b2 + b23 + b7 + b16);
174 num += GetTableSize(TableIndex.Field, 2 + b2 + b);
175 num += GetTableSize(TableIndex.MethodDef, 8 + b2 + b + b19);
176 num += GetTableSize(TableIndex.Param, 4 + b2);
177 num += GetTableSize(TableIndex.InterfaceImpl, b22 + b23);
178 num += GetTableSize(TableIndex.MemberRef, b15 + b2 + b);
179 num += GetTableSize(TableIndex.Constant, 2 + b9 + b);
180 num += GetTableSize(TableIndex.CustomAttribute, b10 + b4 + b);
181 num += GetTableSize(TableIndex.FieldMarshal, b11 + b);
182 num += GetTableSize(TableIndex.DeclSecurity, 2 + b5 + b);
183 num += GetTableSize(TableIndex.ClassLayout, 6 + b22);
184 num += GetTableSize(TableIndex.FieldLayout, 4 + b7);
185 num += GetTableSize(TableIndex.StandAloneSig, b);
186 num += GetTableSize(TableIndex.EventMap, b22 + b6);
187 num += GetTableSize(TableIndex.Event, 2 + b2 + b23);
188 num += GetTableSize(TableIndex.PropertyMap, b22 + b20);
189 num += GetTableSize(TableIndex.Property, 2 + b2 + b);
190 num += GetTableSize(TableIndex.MethodSemantics, 2 + b16 + b12);
191 num += GetTableSize(TableIndex.MethodImpl, b22 + b17 + b17);
192 num += GetTableSize(TableIndex.ModuleRef, b2);
193 num += GetTableSize(TableIndex.TypeSpec, b);
194 num += GetTableSize(TableIndex.ImplMap, 2 + b14 + b2 + b18);
195 num += GetTableSize(TableIndex.FieldRva, 4 + b7);
196 num += GetTableSize(TableIndex.EncLog, 8);
197 num += GetTableSize(TableIndex.EncMap, 4);
198 num += GetTableSize(TableIndex.Assembly, 16 + b + b2 + b2);
199 num += GetTableSize(TableIndex.AssemblyRef, 12 + b + b2 + b2 + b);
200 num += GetTableSize(TableIndex.File, 4 + b2 + b);
201 num += GetTableSize(TableIndex.ExportedType, 8 + b2 + b2 + b13);
202 num += GetTableSize(TableIndex.ManifestResource, 8 + b2 + b13);
203 num += GetTableSize(TableIndex.NestedClass, b22 + b22);
204 num += GetTableSize(TableIndex.GenericParam, 4 + b24 + b2);
205 num += GetTableSize(TableIndex.MethodSpec, b17 + b);
206 num += GetTableSize(TableIndex.GenericParamConstraint, b8 + b23);
207 num += GetTableSize(TableIndex.Document, b + b3 + b + b3);
208 num += GetTableSize(TableIndex.MethodDebugInformation, b25 + b);
209 num += GetTableSize(TableIndex.LocalScope, b16 + b28 + b26 + b27 + 4 + 4);
210 num += GetTableSize(TableIndex.LocalVariable, 4 + b2);
211 num += GetTableSize(TableIndex.LocalConstant, b2 + b);
212 num += GetTableSize(TableIndex.ImportScope, b28 + b);
213 num += GetTableSize(TableIndex.StateMachineMethod, b16 + b16);
214 num += GetTableSize(TableIndex.CustomDebugInformation, b29 + b3 + b);
216 StandalonePdbStreamSize = (isStandaloneDebugMetadata ? CalculateStandalonePdbStreamSize() : 0);
219 }
220
221 internal bool IsPresent(TableIndex table)
222 {
223 return (PresentTablesMask & (ulong)(1L << (int)table)) != 0;
224 }
225
226 internal static int GetMetadataStreamHeaderSize(string streamName)
227 {
228 return 8 + BitArithmetic.Align(streamName.Length + 1, 4);
229 }
230
232 {
233 if (index < HeapIndex.UserString || (int)index > HeapSizes.Length)
234 {
235 Throw.ArgumentOutOfRange("index");
236 }
237 return BitArithmetic.Align(HeapSizes[(int)index], 4);
238 }
239
241 {
242 int num = 24;
243 for (int i = 0; i < RowCounts.Length; i++)
244 {
245 if (((ulong)(1L << i) & PresentTablesMask) != 0L)
246 {
247 num += 4;
248 }
249 }
250 return num;
251 }
252
254 {
256 }
257
258 private static ulong ComputeNonEmptyTableMask(ImmutableArray<int> rowCounts)
259 {
260 ulong num = 0uL;
261 for (int i = 0; i < rowCounts.Length; i++)
262 {
263 if (rowCounts[i] > 0)
264 {
265 num |= (ulong)(1L << i);
266 }
267 }
268 return num;
269 }
270
271 private int GetTableSize(TableIndex index, int rowSize)
272 {
273 return RowCounts[(int)index] * rowSize;
274 }
275
276 private bool IsReferenceSmall(int tagBitSize, params TableIndex[] tables)
277 {
278 if (IsCompressed)
279 {
280 return ReferenceFits(16 - tagBitSize, tables);
281 }
282 return false;
283 }
284
285 private bool ReferenceFits(int bitCount, TableIndex[] tables)
286 {
287 int num = (1 << bitCount) - 1;
288 foreach (TableIndex index in tables)
289 {
290 if (RowCounts[(int)index] + ExternalRowCounts[(int)index] > num)
291 {
292 return false;
293 }
294 }
295 return true;
296 }
297}
static uint Align(uint position, uint alignment)
static int GetMetadataStreamHeaderSize(string streamName)
static ulong ComputeNonEmptyTableMask(ImmutableArray< int > rowCounts)
MetadataSizes(ImmutableArray< int > rowCounts, ImmutableArray< int > externalRowCounts, ImmutableArray< int > heapSizes, int metadataVersionByteCount, bool isStandaloneDebugMetadata)
bool IsReferenceSmall(int tagBitSize, params TableIndex[] tables)
int GetTableSize(TableIndex index, int rowSize)
bool ReferenceFits(int bitCount, TableIndex[] tables)
static void ArgumentOutOfRange(string parameterName)
Definition Throw.cs:145