Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CustomAttributeDecoder.cs
Go to the documentation of this file.
2
4
5internal readonly struct CustomAttributeDecoder<TType>
6{
7 private struct ArgumentTypeInfo
8 {
9 public TType Type;
10
11 public TType ElementType;
12
14
16 }
17
19
20 private readonly MetadataReader _reader;
21
23 {
24 _reader = reader;
25 _provider = provider;
26 }
27
29 {
30 BlobHandle handle = constructor.Kind switch
31 {
32 HandleKind.MethodDefinition => _reader.GetMethodDefinition((MethodDefinitionHandle)constructor).Signature,
33 HandleKind.MemberReference => _reader.GetMemberReference((MemberReferenceHandle)constructor).Signature,
34 _ => throw new BadImageFormatException(),
35 };
36 BlobReader signatureReader = _reader.GetBlobReader(handle);
38 ushort num = valueReader.ReadUInt16();
39 if (num != 1)
40 {
41 throw new BadImageFormatException();
42 }
43 SignatureHeader signatureHeader = signatureReader.ReadSignatureHeader();
44 if (signatureHeader.Kind != 0 || signatureHeader.IsGeneric)
45 {
46 throw new BadImageFormatException();
47 }
48 int count = signatureReader.ReadCompressedInteger();
49 SignatureTypeCode signatureTypeCode = signatureReader.ReadSignatureTypeCode();
50 if (signatureTypeCode != SignatureTypeCode.Void)
51 {
52 throw new BadImageFormatException();
53 }
54 ImmutableArray<CustomAttributeTypedArgument<TType>> fixedArguments = DecodeFixedArguments(ref signatureReader, ref valueReader, count);
56 return new CustomAttributeValue<TType>(fixedArguments, namedArguments);
57 }
58
60 {
61 if (count == 0)
62 {
64 }
66 for (int i = 0; i < count; i++)
67 {
68 ArgumentTypeInfo info = DecodeFixedArgumentType(ref signatureReader);
69 builder.Add(DecodeArgument(ref valueReader, info));
70 }
71 return builder.MoveToImmutable();
72 }
73
75 {
76 int num = valueReader.ReadUInt16();
77 if (num == 0)
78 {
80 }
82 for (int i = 0; i < num; i++)
83 {
84 CustomAttributeNamedArgumentKind customAttributeNamedArgumentKind = (CustomAttributeNamedArgumentKind)valueReader.ReadSerializationTypeCode();
85 if (customAttributeNamedArgumentKind != CustomAttributeNamedArgumentKind.Field && customAttributeNamedArgumentKind != CustomAttributeNamedArgumentKind.Property)
86 {
87 throw new BadImageFormatException();
88 }
90 string name = valueReader.ReadSerializedString();
91 CustomAttributeTypedArgument<TType> customAttributeTypedArgument = DecodeArgument(ref valueReader, info);
92 builder.Add(new CustomAttributeNamedArgument<TType>(name, customAttributeNamedArgumentKind, customAttributeTypedArgument.Type, customAttributeTypedArgument.Value));
93 }
94 return builder.MoveToImmutable();
95 }
96
97 private ArgumentTypeInfo DecodeFixedArgumentType(ref BlobReader signatureReader, bool isElementType = false)
98 {
99 SignatureTypeCode signatureTypeCode = signatureReader.ReadSignatureTypeCode();
100 ArgumentTypeInfo argumentTypeInfo = default(ArgumentTypeInfo);
101 argumentTypeInfo.TypeCode = (SerializationTypeCode)signatureTypeCode;
102 ArgumentTypeInfo result = argumentTypeInfo;
103 switch (signatureTypeCode)
104 {
105 case SignatureTypeCode.Boolean:
106 case SignatureTypeCode.Char:
107 case SignatureTypeCode.SByte:
108 case SignatureTypeCode.Byte:
109 case SignatureTypeCode.Int16:
110 case SignatureTypeCode.UInt16:
111 case SignatureTypeCode.Int32:
112 case SignatureTypeCode.UInt32:
113 case SignatureTypeCode.Int64:
114 case SignatureTypeCode.UInt64:
115 case SignatureTypeCode.Single:
116 case SignatureTypeCode.Double:
117 case SignatureTypeCode.String:
118 result.Type = _provider.GetPrimitiveType((PrimitiveTypeCode)signatureTypeCode);
119 break;
120 case SignatureTypeCode.Object:
121 result.TypeCode = SerializationTypeCode.TaggedObject;
122 result.Type = _provider.GetPrimitiveType(PrimitiveTypeCode.Object);
123 break;
124 case SignatureTypeCode.TypeHandle:
125 {
126 EntityHandle handle = signatureReader.ReadTypeHandle();
127 result.Type = GetTypeFromHandle(handle);
128 result.TypeCode = (SerializationTypeCode)(_provider.IsSystemType(result.Type) ? ((PrimitiveTypeCode)80) : _provider.GetUnderlyingEnumType(result.Type));
129 break;
130 }
131 case SignatureTypeCode.SZArray:
132 {
133 if (isElementType)
134 {
135 throw new BadImageFormatException();
136 }
137 ArgumentTypeInfo argumentTypeInfo2 = DecodeFixedArgumentType(ref signatureReader, isElementType: true);
138 result.ElementType = argumentTypeInfo2.Type;
139 result.ElementTypeCode = argumentTypeInfo2.TypeCode;
140 result.Type = _provider.GetSZArrayType(result.ElementType);
141 break;
142 }
143 default:
144 throw new BadImageFormatException();
145 }
146 return result;
147 }
148
149 private ArgumentTypeInfo DecodeNamedArgumentType(ref BlobReader valueReader, bool isElementType = false)
150 {
151 ArgumentTypeInfo argumentTypeInfo = default(ArgumentTypeInfo);
152 argumentTypeInfo.TypeCode = valueReader.ReadSerializationTypeCode();
153 ArgumentTypeInfo result = argumentTypeInfo;
154 switch (result.TypeCode)
155 {
156 case SerializationTypeCode.Boolean:
157 case SerializationTypeCode.Char:
158 case SerializationTypeCode.SByte:
159 case SerializationTypeCode.Byte:
160 case SerializationTypeCode.Int16:
161 case SerializationTypeCode.UInt16:
162 case SerializationTypeCode.Int32:
163 case SerializationTypeCode.UInt32:
164 case SerializationTypeCode.Int64:
165 case SerializationTypeCode.UInt64:
166 case SerializationTypeCode.Single:
167 case SerializationTypeCode.Double:
168 case SerializationTypeCode.String:
169 result.Type = _provider.GetPrimitiveType((PrimitiveTypeCode)result.TypeCode);
170 break;
172 result.Type = _provider.GetSystemType();
173 break;
174 case SerializationTypeCode.TaggedObject:
175 result.Type = _provider.GetPrimitiveType(PrimitiveTypeCode.Object);
176 break;
177 case SerializationTypeCode.SZArray:
178 {
179 if (isElementType)
180 {
181 throw new BadImageFormatException();
182 }
183 ArgumentTypeInfo argumentTypeInfo2 = DecodeNamedArgumentType(ref valueReader, isElementType: true);
184 result.ElementType = argumentTypeInfo2.Type;
185 result.ElementTypeCode = argumentTypeInfo2.TypeCode;
186 result.Type = _provider.GetSZArrayType(result.ElementType);
187 break;
188 }
189 case SerializationTypeCode.Enum:
190 {
191 string name = valueReader.ReadSerializedString();
192 result.Type = _provider.GetTypeFromSerializedName(name);
193 result.TypeCode = (SerializationTypeCode)_provider.GetUnderlyingEnumType(result.Type);
194 break;
195 }
196 default:
197 throw new BadImageFormatException();
198 }
199 return result;
200 }
201
203 {
204 if (info.TypeCode == SerializationTypeCode.TaggedObject)
205 {
206 info = DecodeNamedArgumentType(ref valueReader);
207 }
208 object value;
209 switch (info.TypeCode)
210 {
211 case SerializationTypeCode.Boolean:
212 value = valueReader.ReadBoolean();
213 break;
214 case SerializationTypeCode.Byte:
215 value = valueReader.ReadByte();
216 break;
217 case SerializationTypeCode.Char:
218 value = valueReader.ReadChar();
219 break;
220 case SerializationTypeCode.Double:
221 value = valueReader.ReadDouble();
222 break;
223 case SerializationTypeCode.Int16:
224 value = valueReader.ReadInt16();
225 break;
226 case SerializationTypeCode.Int32:
227 value = valueReader.ReadInt32();
228 break;
229 case SerializationTypeCode.Int64:
230 value = valueReader.ReadInt64();
231 break;
232 case SerializationTypeCode.SByte:
233 value = valueReader.ReadSByte();
234 break;
235 case SerializationTypeCode.Single:
236 value = valueReader.ReadSingle();
237 break;
238 case SerializationTypeCode.UInt16:
239 value = valueReader.ReadUInt16();
240 break;
241 case SerializationTypeCode.UInt32:
242 value = valueReader.ReadUInt32();
243 break;
244 case SerializationTypeCode.UInt64:
245 value = valueReader.ReadUInt64();
246 break;
247 case SerializationTypeCode.String:
248 value = valueReader.ReadSerializedString();
249 break;
250 case SerializationTypeCode.Type:
251 {
252 string name = valueReader.ReadSerializedString();
253 value = _provider.GetTypeFromSerializedName(name);
254 break;
255 }
256 case SerializationTypeCode.SZArray:
257 value = DecodeArrayArgument(ref valueReader, info);
258 break;
259 default:
260 throw new BadImageFormatException();
261 }
263 }
264
266 {
267 int num = blobReader.ReadInt32();
268 if (num == -1)
269 {
270 return null;
271 }
272 if (num == 0)
273 {
275 }
276 if (num < 0)
277 {
278 throw new BadImageFormatException();
279 }
280 ArgumentTypeInfo argumentTypeInfo = default(ArgumentTypeInfo);
281 argumentTypeInfo.Type = info.ElementType;
282 argumentTypeInfo.TypeCode = info.ElementTypeCode;
283 ArgumentTypeInfo info2 = argumentTypeInfo;
285 for (int i = 0; i < num; i++)
286 {
287 builder.Add(DecodeArgument(ref blobReader, info2));
288 }
289 return builder.MoveToImmutable();
290 }
291
293 {
294 return handle.Kind switch
295 {
296 HandleKind.TypeDefinition => _provider.GetTypeFromDefinition(_reader, (TypeDefinitionHandle)handle, 0),
297 HandleKind.TypeReference => _provider.GetTypeFromReference(_reader, (TypeReferenceHandle)handle, 0),
299 };
300 }
301}
static readonly ImmutableArray< T > Empty
MemberReference GetMemberReference(MemberReferenceHandle handle)
BlobReader GetBlobReader(BlobHandle handle)
MethodDefinition GetMethodDefinition(MethodDefinitionHandle handle)
static string NotTypeDefOrRefHandle
Definition SR.cs:168
Definition SR.cs:7
SignatureTypeCode ReadSignatureTypeCode()
ImmutableArray< CustomAttributeTypedArgument< TType > >? DecodeArrayArgument(ref BlobReader blobReader, ArgumentTypeInfo info)
CustomAttributeTypedArgument< TType > DecodeArgument(ref BlobReader valueReader, ArgumentTypeInfo info)
ArgumentTypeInfo DecodeNamedArgumentType(ref BlobReader valueReader, bool isElementType=false)
readonly ICustomAttributeTypeProvider< TType > _provider
CustomAttributeValue< TType > DecodeValue(EntityHandle constructor, BlobHandle value)
ImmutableArray< CustomAttributeTypedArgument< TType > > DecodeFixedArguments(ref BlobReader signatureReader, ref BlobReader valueReader, int count)
CustomAttributeDecoder(ICustomAttributeTypeProvider< TType > provider, MetadataReader reader)
ImmutableArray< CustomAttributeNamedArgument< TType > > DecodeNamedArguments(ref BlobReader valueReader)
ArgumentTypeInfo DecodeFixedArgumentType(ref BlobReader signatureReader, bool isElementType=false)