Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
SignatureDecoder.cs
Go to the documentation of this file.
2
4
5public readonly struct SignatureDecoder<TType, TGenericContext>
6{
8
10
11 private readonly TGenericContext _genericContext;
12
13 public SignatureDecoder(ISignatureTypeProvider<TType, TGenericContext> provider, MetadataReader metadataReader, TGenericContext genericContext)
14 {
15 if (provider == null)
16 {
17 Throw.ArgumentNull("provider");
18 }
19 _metadataReaderOpt = metadataReader;
20 _provider = provider;
21 _genericContext = genericContext;
22 }
23
24 public TType DecodeType(ref BlobReader blobReader, bool allowTypeSpecifications = false)
25 {
26 return DecodeType(ref blobReader, allowTypeSpecifications, blobReader.ReadCompressedInteger());
27 }
28
29 private TType DecodeType(ref BlobReader blobReader, bool allowTypeSpecifications, int typeCode)
30 {
31 switch (typeCode)
32 {
33 case 1:
34 case 2:
35 case 3:
36 case 4:
37 case 5:
38 case 6:
39 case 7:
40 case 8:
41 case 9:
42 case 10:
43 case 11:
44 case 12:
45 case 13:
46 case 14:
47 case 22:
48 case 24:
49 case 25:
50 case 28:
51 return _provider.GetPrimitiveType((PrimitiveTypeCode)typeCode);
52 case 15:
53 {
54 TType elementType = DecodeType(ref blobReader);
55 return _provider.GetPointerType(elementType);
56 }
57 case 16:
58 {
59 TType elementType = DecodeType(ref blobReader);
60 return _provider.GetByReferenceType(elementType);
61 }
62 case 69:
63 {
64 TType elementType = DecodeType(ref blobReader);
65 return _provider.GetPinnedType(elementType);
66 }
67 case 29:
68 {
69 TType elementType = DecodeType(ref blobReader);
70 return _provider.GetSZArrayType(elementType);
71 }
72 case 27:
73 {
74 MethodSignature<TType> signature = DecodeMethodSignature(ref blobReader);
75 return _provider.GetFunctionPointerType(signature);
76 }
77 case 20:
78 return DecodeArrayType(ref blobReader);
79 case 31:
80 return DecodeModifiedType(ref blobReader, isRequired: true);
81 case 32:
82 return DecodeModifiedType(ref blobReader, isRequired: false);
83 case 21:
84 return DecodeGenericTypeInstance(ref blobReader);
85 case 19:
86 {
87 int index = blobReader.ReadCompressedInteger();
88 return _provider.GetGenericTypeParameter(_genericContext, index);
89 }
90 case 30:
91 {
92 int index = blobReader.ReadCompressedInteger();
93 return _provider.GetGenericMethodParameter(_genericContext, index);
94 }
95 case 17:
96 case 18:
97 return DecodeTypeHandle(ref blobReader, (byte)typeCode, allowTypeSpecifications);
98 default:
100 }
101 }
102
104 {
105 int num = blobReader.ReadCompressedInteger();
106 if (num == 0)
107 {
109 }
110 ImmutableArray<TType>.Builder builder = ImmutableArray.CreateBuilder<TType>(num);
111 for (int i = 0; i < num; i++)
112 {
113 builder.Add(DecodeType(ref blobReader));
114 }
115 return builder.MoveToImmutable();
116 }
117
119 {
120 SignatureHeader header = blobReader.ReadSignatureHeader();
122 int genericParameterCount = 0;
123 if (header.IsGeneric)
124 {
125 genericParameterCount = blobReader.ReadCompressedInteger();
126 }
127 int num = blobReader.ReadCompressedInteger();
128 TType returnType = DecodeType(ref blobReader);
129 int requiredParameterCount;
130 ImmutableArray<TType> parameterTypes;
131 if (num == 0)
132 {
133 requiredParameterCount = 0;
134 parameterTypes = ImmutableArray<TType>.Empty;
135 }
136 else
137 {
138 ImmutableArray<TType>.Builder builder = ImmutableArray.CreateBuilder<TType>(num);
139 int i;
140 for (i = 0; i < num; i++)
141 {
142 int num2 = blobReader.ReadCompressedInteger();
143 if (num2 == 65)
144 {
145 break;
146 }
147 builder.Add(DecodeType(ref blobReader, allowTypeSpecifications: false, num2));
148 }
149 requiredParameterCount = i;
150 for (; i < num; i++)
151 {
152 builder.Add(DecodeType(ref blobReader));
153 }
154 parameterTypes = builder.MoveToImmutable();
155 }
156 return new MethodSignature<TType>(header, returnType, requiredParameterCount, genericParameterCount, parameterTypes);
157 }
158
160 {
161 SignatureHeader header = blobReader.ReadSignatureHeader();
162 CheckHeader(header, SignatureKind.MethodSpecification);
163 return DecodeTypeSequence(ref blobReader);
164 }
165
167 {
168 SignatureHeader header = blobReader.ReadSignatureHeader();
169 CheckHeader(header, SignatureKind.LocalVariables);
170 return DecodeTypeSequence(ref blobReader);
171 }
172
173 public TType DecodeFieldSignature(ref BlobReader blobReader)
174 {
175 SignatureHeader header = blobReader.ReadSignatureHeader();
176 CheckHeader(header, SignatureKind.Field);
177 return DecodeType(ref blobReader);
178 }
179
180 private TType DecodeArrayType(ref BlobReader blobReader)
181 {
182 TType elementType = DecodeType(ref blobReader);
183 int rank = blobReader.ReadCompressedInteger();
186 int num = blobReader.ReadCompressedInteger();
187 if (num > 0)
188 {
189 ImmutableArray<int>.Builder builder = ImmutableArray.CreateBuilder<int>(num);
190 for (int i = 0; i < num; i++)
191 {
192 builder.Add(blobReader.ReadCompressedInteger());
193 }
194 sizes = builder.MoveToImmutable();
195 }
196 int num2 = blobReader.ReadCompressedInteger();
197 if (num2 > 0)
198 {
199 ImmutableArray<int>.Builder builder2 = ImmutableArray.CreateBuilder<int>(num2);
200 for (int j = 0; j < num2; j++)
201 {
202 builder2.Add(blobReader.ReadCompressedSignedInteger());
203 }
204 lowerBounds = builder2.MoveToImmutable();
205 }
206 ArrayShape shape = new ArrayShape(rank, sizes, lowerBounds);
207 return _provider.GetArrayType(elementType, shape);
208 }
209
210 private TType DecodeGenericTypeInstance(ref BlobReader blobReader)
211 {
212 TType genericType = DecodeType(ref blobReader);
213 ImmutableArray<TType> typeArguments = DecodeTypeSequence(ref blobReader);
214 return _provider.GetGenericInstantiation(genericType, typeArguments);
215 }
216
217 private TType DecodeModifiedType(ref BlobReader blobReader, bool isRequired)
218 {
219 TType modifier = DecodeTypeHandle(ref blobReader, 0, allowTypeSpecifications: true);
220 TType unmodifiedType = DecodeType(ref blobReader);
221 return _provider.GetModifiedType(modifier, unmodifiedType, isRequired);
222 }
223
224 private TType DecodeTypeHandle(ref BlobReader blobReader, byte rawTypeKind, bool allowTypeSpecifications)
225 {
226 EntityHandle entityHandle = blobReader.ReadTypeHandle();
227 if (!entityHandle.IsNil)
228 {
229 switch (entityHandle.Kind)
230 {
231 case HandleKind.TypeDefinition:
232 return _provider.GetTypeFromDefinition(_metadataReaderOpt, (TypeDefinitionHandle)entityHandle, rawTypeKind);
233 case HandleKind.TypeReference:
234 return _provider.GetTypeFromReference(_metadataReaderOpt, (TypeReferenceHandle)entityHandle, rawTypeKind);
235 case HandleKind.TypeSpecification:
236 if (!allowTypeSpecifications)
237 {
239 }
240 return _provider.GetTypeFromSpecification(_metadataReaderOpt, _genericContext, (TypeSpecificationHandle)entityHandle, rawTypeKind);
241 }
242 }
244 }
245
246 private void CheckHeader(SignatureHeader header, SignatureKind expectedKind)
247 {
248 if (header.Kind != expectedKind)
249 {
250 throw new BadImageFormatException(System.SR.Format(System.SR.UnexpectedSignatureHeader, expectedKind, header.Kind, header.RawValue));
251 }
252 }
253
255 {
256 SignatureKind kind = header.Kind;
257 if (kind != 0 && kind != SignatureKind.Property)
258 {
260 }
261 }
262}
static readonly ImmutableArray< T > Empty
static void ArgumentNull(string parameterName)
Definition Throw.cs:110
static string UnexpectedSignatureHeader2
Definition SR.cs:166
static string NotTypeDefOrRefOrSpecHandle
Definition SR.cs:174
static string UnexpectedSignatureHeader
Definition SR.cs:164
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string UnexpectedSignatureTypeCode
Definition SR.cs:170
static string NotTypeDefOrRefHandle
Definition SR.cs:168
static string SignatureTypeSequenceMustHaveAtLeastOneElement
Definition SR.cs:172
Definition SR.cs:7
TType DecodeModifiedType(ref BlobReader blobReader, bool isRequired)
TType DecodeTypeHandle(ref BlobReader blobReader, byte rawTypeKind, bool allowTypeSpecifications)
ImmutableArray< TType > DecodeLocalSignature(ref BlobReader blobReader)
SignatureDecoder(ISignatureTypeProvider< TType, TGenericContext > provider, MetadataReader metadataReader, TGenericContext genericContext)
readonly ISignatureTypeProvider< TType, TGenericContext > _provider
ImmutableArray< TType > DecodeTypeSequence(ref BlobReader blobReader)
TType DecodeType(ref BlobReader blobReader, bool allowTypeSpecifications, int typeCode)
ImmutableArray< TType > DecodeMethodSpecificationSignature(ref BlobReader blobReader)
void CheckHeader(SignatureHeader header, SignatureKind expectedKind)
MethodSignature< TType > DecodeMethodSignature(ref BlobReader blobReader)
TType DecodeFieldSignature(ref BlobReader blobReader)
TType DecodeGenericTypeInstance(ref BlobReader blobReader)
TType DecodeType(ref BlobReader blobReader, bool allowTypeSpecifications=false)