Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XmlFormatReaderGenerator.cs
Go to the documentation of this file.
7using System.Xml;
8
10
11internal sealed class XmlFormatReaderGenerator
12{
13 private sealed class CriticalHelper
14 {
16
18
20
22
24
26
28
30
31 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
36
37 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
38 public XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract)
39 {
41 {
43 }
44 _ilg = new CodeGenerator();
45 bool flag = classContract.RequiresMemberAccessForRead(null);
46 try
47 {
48 _ilg.BeginMethod("Read" + classContract.StableName.Name + "FromXml", Globals.TypeOfXmlFormatClassReaderDelegate, flag);
49 }
51 {
52 if (!flag)
53 {
54 throw;
55 }
56 classContract.RequiresMemberAccessForRead(securityException);
57 }
58 InitArgs();
64 {
68 }
69 if (classContract.IsISerializable)
70 {
72 }
73 else
74 {
76 }
78 if (Globals.TypeOfIDeserializationCallback.IsAssignableFrom(classContract.UnderlyingType))
79 {
81 }
83 if (localBuilder == null)
84 {
87 {
91 }
92 else if (classContract.UnderlyingType == Globals.TypeOfMemoryStreamAdapter)
93 {
97 }
98 else if (classContract.IsKeyValuePairAdapter)
99 {
100 _ilg.Call(classContract.GetKeyValuePairMethodInfo);
101 _ilg.ConvertValue(Globals.TypeOfKeyValuePair.MakeGenericType(classContract.KeyValuePairGenericArguments), _ilg.CurrentMethod.ReturnType);
102 }
103 else
104 {
106 }
107 }
108 return (XmlFormatClassReaderDelegate)_ilg.EndMethod();
109 }
110
111 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
112 private XmlFormatCollectionReaderDelegate CreateReflectionXmlCollectionReader()
113 {
115 }
116
117 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
130
131 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
132 private XmlFormatGetOnlyCollectionReaderDelegate CreateReflectionReadGetOnlyCollectionReader()
133 {
135 }
136
137 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
138 public XmlFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract)
139 {
141 {
143 }
146 return (XmlFormatGetOnlyCollectionReaderDelegate)_ilg.EndMethod();
147 }
148
150 {
151 _ilg = new CodeGenerator();
152 bool flag = collectionContract.RequiresMemberAccessForRead(null);
153 try
154 {
156 {
157 _ilg.BeginMethod("Read" + collectionContract.StableName.Name + "FromXmlIsGetOnly", Globals.TypeOfXmlFormatGetOnlyCollectionReaderDelegate, flag);
158 }
159 else
160 {
161 _ilg.BeginMethod("Read" + collectionContract.StableName.Name + "FromXml" + string.Empty, Globals.TypeOfXmlFormatCollectionReaderDelegate, flag);
162 }
163 }
165 {
166 if (!flag)
167 {
168 throw;
169 }
170 collectionContract.RequiresMemberAccessForRead(securityException);
171 }
172 InitArgs();
174 return _ilg;
175 }
176
177 private void InitArgs()
178 {
183 }
184
185 [MemberNotNull("_objectType")]
186 [MemberNotNull("_objectLocal")]
187 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
189 {
190 Type type = (_objectType = classContract.UnderlyingType);
191 if (type.IsValueType && !classContract.IsNonAttributedType)
192 {
194 }
195 _objectLocal = _ilg.DeclareLocal(type, "objectDeserialized");
196 if (classContract.UnderlyingType == Globals.TypeOfDBNull)
197 {
200 }
201 else if (classContract.IsNonAttributedType)
202 {
203 if (type.IsValueType)
204 {
207 }
208 else
209 {
210 _ilg.New(classContract.GetNonAttributedTypeConstructor());
212 }
213 }
214 else
215 {
219 }
220 }
221
223 {
224 return typeof(DBNull).GetField("Value");
225 }
226
228 {
229 if (classContract.BaseContract != null)
230 {
232 }
233 if (classContract.OnDeserializing != null)
234 {
239 _ilg.Call(classContract.OnDeserializing);
240 }
241 }
242
244 {
245 if (classContract.BaseContract != null)
246 {
248 }
249 if (classContract.OnDeserialized != null)
250 {
255 _ilg.Call(classContract.OnDeserialized);
256 }
257 }
258
260 {
261 return Globals.TypeOfIObjectReference.IsAssignableFrom(classContract.UnderlyingType);
262 }
263
278
279 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
302
303 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
305 {
306 int num = classContract.MemberNames.Length;
311 bool flag = firstRequiredMember < num;
313 object forState = _ilg.For(null, null, null);
316 if (flag)
317 {
319 }
320 else
321 {
323 }
324 Label[] memberLabels = _ilg.Switch(num);
326 _ilg.EndSwitch();
327 _ilg.EndFor();
328 if (flag)
329 {
330 _ilg.If(localBuilder2, Cmp.LessThan, num);
332 _ilg.EndIf();
333 }
334 }
335
336 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
338 {
340 int num2 = 0;
341 while (num2 < classContract.Members.Count)
342 {
344 Type memberType = dataMember.MemberType;
345 _ilg.Case(memberLabels[num], dataMember.Name);
346 if (dataMember.IsRequired)
347 {
348 int i;
349 for (i = num + 1; i < requiredMembers.Length && !requiredMembers[i]; i++)
350 {
351 }
353 }
355 if (dataMember.IsGetOnlyCollection)
356 {
358 _ilg.LoadMember(dataMember.MemberInfo);
362 ReadValue(memberType, dataMember.Name, classContract.StableName.Namespace);
363 }
364 else
365 {
367 localBuilder = ReadValue(memberType, dataMember.Name, classContract.StableName.Namespace);
371 _ilg.StoreMember(dataMember.MemberInfo);
372 }
374 _ilg.EndCase();
375 num2++;
376 num++;
377 }
378 return num;
379 }
380
382 {
383 int num = contract.MemberNames.Length;
384 bool[] array = new bool[num];
388 {
390 }
391 return array;
392 }
393
395 {
396 int num = ((contract.BaseContract != null) ? GetRequiredMembers(contract.BaseContract, requiredMembers) : 0);
398 int num2 = 0;
399 while (num2 < members.Count)
400 {
401 requiredMembers[num] = members[num2].IsRequired;
402 num2++;
403 num++;
404 }
405 return num;
406 }
407
408 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
419
420 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
421 private LocalBuilder ReadValue(Type type, string name, string ns)
422 {
425 int num = 0;
426 while (type.IsGenericType && type.GetGenericTypeDefinition() == Globals.TypeOfNullable)
427 {
428 num++;
429 type = type.GetGenericArguments()[0];
430 }
432 if ((primitiveDataContract != null && primitiveDataContract.UnderlyingType != Globals.TypeOfObject) || num != 0 || type.IsValueType)
433 {
438 _ilg.If(localBuilder3, Cmp.EqualTo, null);
439 if (num != 0)
440 {
442 _ilg.InitObj(localBuilder.LocalType);
443 }
444 else if (type.IsValueType)
445 {
447 }
448 else
449 {
450 _ilg.Load(null);
452 }
456 if (type.IsValueType)
457 {
460 _ilg.EndIf();
461 }
462 if (num != 0)
463 {
465 localBuilder = _ilg.DeclareLocal(type, "innerValueRead");
466 }
467 if (primitiveDataContract != null && primitiveDataContract.UnderlyingType != Globals.TypeOfObject)
468 {
469 _ilg.Call(_xmlReaderArg, primitiveDataContract.XmlFormatReaderMethod);
471 if (!type.IsValueType)
472 {
474 }
475 }
476 else
477 {
479 }
480 _ilg.Else();
481 if (type.IsValueType)
482 {
484 }
485 else
486 {
490 }
491 _ilg.EndIf();
492 if (localBuilder2 != null)
493 {
494 _ilg.If(localBuilder3, Cmp.NotEqualTo, null);
496 _ilg.EndIf();
498 }
499 }
500 else
501 {
503 }
504 return localBuilder;
505 }
506
507 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
520
521 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
523 {
524 Type type = innerValue.LocalType;
525 Type localType = outerValue.LocalType;
528 for (int i = 1; i < nullables; i++)
529 {
530 Type type2 = Globals.TypeOfNullable.MakeGenericType(type);
531 _ilg.New(type2.GetConstructor(new Type[1] { type }));
532 type = type2;
533 }
534 _ilg.Call(localType.GetConstructor(new Type[1] { type }));
535 }
536
537 [MemberNotNull("_objectLocal")]
538 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
540 {
541 Type type = collectionContract.UnderlyingType;
543 bool flag = collectionContract.Kind == CollectionKind.Array;
545 if (type.IsInterface)
546 {
547 switch (collectionContract.Kind)
548 {
549 case CollectionKind.GenericDictionary:
550 type = Globals.TypeOfDictionaryGeneric.MakeGenericType(itemType.GetGenericArguments());
551 constructorInfo = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, Type.EmptyTypes);
552 break;
556 break;
557 case CollectionKind.GenericList:
558 case CollectionKind.GenericCollection:
559 case CollectionKind.List:
560 case CollectionKind.GenericEnumerable:
561 case CollectionKind.Collection:
562 case CollectionKind.Enumerable:
563 type = itemType.MakeArrayType();
564 flag = true;
565 break;
566 }
567 }
568 string itemName = collectionContract.ItemName;
569 string @namespace = collectionContract.StableName.Namespace;
570 _objectLocal = _ilg.DeclareLocal(type, "objectDeserialized");
571 if (!flag)
572 {
573 if (type.IsValueType)
574 {
575 _ilg.Ldloca(_objectLocal);
576 _ilg.InitObj(type);
577 }
578 else
579 {
580 _ilg.New(constructorInfo);
581 _ilg.Stloc(_objectLocal);
582 _ilg.Call(_contextArg, XmlFormatGeneratorStatics.AddNewObjectMethod, _objectLocal);
583 }
584 }
587 _ilg.Stloc(localBuilder);
590 _ilg.Stloc(localBuilder2);
591 bool flag2 = false;
592 if (flag && TryReadPrimitiveArray(type, itemType, localBuilder))
593 {
594 flag2 = true;
595 _ilg.IfNot();
596 }
597 _ilg.If(localBuilder, Cmp.EqualTo, -1);
599 if (flag)
600 {
601 localBuilder3 = _ilg.DeclareLocal(type, "growingCollection");
602 _ilg.NewArray(itemType, 32);
603 _ilg.Stloc(localBuilder3);
604 }
606 object forState = _ilg.For(localBuilder4, 0, int.MaxValue);
607 IsStartElement(_memberNamesArg, _memberNamespacesArg);
608 _ilg.If();
610 LocalBuilder value = ReadCollectionItem(collectionContract, itemType, itemName, @namespace);
611 if (flag)
612 {
615 _ilg.Stloc(localBuilder3);
617 }
618 else
619 {
620 StoreCollectionValue(_objectLocal, value, collectionContract);
621 }
622 _ilg.Else();
623 IsEndElement();
624 _ilg.If();
625 _ilg.Break(forState);
626 _ilg.Else();
627 HandleUnexpectedItemInCollection(localBuilder4);
628 _ilg.EndIf();
629 _ilg.EndIf();
630 _ilg.EndFor();
631 if (flag)
632 {
635 _ilg.Stloc(_objectLocal);
637 }
638 _ilg.Else();
640 if (flag)
641 {
643 _ilg.Stloc(_objectLocal);
644 _ilg.Call(_contextArg, XmlFormatGeneratorStatics.AddNewObjectMethod, _objectLocal);
645 }
648 IsStartElement(_memberNamesArg, _memberNamespacesArg);
649 _ilg.If();
650 LocalBuilder value2 = ReadCollectionItem(collectionContract, itemType, itemName, @namespace);
651 if (flag)
652 {
653 _ilg.StoreArrayElement(_objectLocal, localBuilder5, value2);
654 }
655 else
656 {
657 StoreCollectionValue(_objectLocal, value2, collectionContract);
658 }
659 _ilg.Else();
660 HandleUnexpectedItemInCollection(localBuilder5);
661 _ilg.EndIf();
662 _ilg.EndFor();
663 _ilg.Call(_contextArg, XmlFormatGeneratorStatics.CheckEndOfArrayMethod, _xmlReaderArg, localBuilder, _memberNamesArg, _memberNamespacesArg);
664 _ilg.EndIf();
665 if (flag2)
666 {
667 _ilg.Else();
669 _ilg.EndIf();
670 }
671 }
672
673 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
675 {
676 Type underlyingType = collectionContract.UnderlyingType;
678 bool flag = collectionContract.Kind == CollectionKind.Array;
679 string itemName = collectionContract.ItemName;
680 string @namespace = collectionContract.StableName.Namespace;
681 _objectLocal = _ilg.DeclareLocal(underlyingType, "objectDeserialized");
682 _ilg.Load(_contextArg);
685 _ilg.Stloc(_objectLocal);
686 IsStartElement(_memberNamesArg, _memberNamespacesArg);
687 _ilg.If();
688 _ilg.If(_objectLocal, Cmp.EqualTo, null);
690 _ilg.Else();
692 if (flag)
693 {
694 _ilg.Load(_objectLocal);
696 _ilg.Stloc(localBuilder);
697 }
698 _ilg.Call(_contextArg, XmlFormatGeneratorStatics.AddNewObjectMethod, _objectLocal);
700 object forState = _ilg.For(localBuilder2, 0, int.MaxValue);
701 IsStartElement(_memberNamesArg, _memberNamespacesArg);
702 _ilg.If();
704 LocalBuilder value = ReadCollectionItem(collectionContract, itemType, itemName, @namespace);
705 if (flag)
706 {
707 _ilg.If(localBuilder, Cmp.EqualTo, localBuilder2);
709 _ilg.Else();
710 _ilg.StoreArrayElement(_objectLocal, localBuilder2, value);
711 _ilg.EndIf();
712 }
713 else
714 {
715 StoreCollectionValue(_objectLocal, value, collectionContract);
716 }
717 _ilg.Else();
718 IsEndElement();
719 _ilg.If();
720 _ilg.Break(forState);
721 _ilg.Else();
722 HandleUnexpectedItemInCollection(localBuilder2);
723 _ilg.EndIf();
724 _ilg.EndIf();
725 _ilg.EndFor();
726 _ilg.Call(_contextArg, XmlFormatGeneratorStatics.CheckEndOfArrayMethod, _xmlReaderArg, localBuilder, _memberNamesArg, _memberNamespacesArg);
727 _ilg.EndIf();
728 _ilg.EndIf();
729 }
730
731 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
733 {
735 if (primitiveDataContract == null)
736 {
737 return false;
738 }
739 string text = null;
740 switch (itemType.GetTypeCode())
741 {
742 case TypeCode.Boolean:
743 text = "TryReadBooleanArray";
744 break;
745 case TypeCode.DateTime:
746 text = "TryReadDateTimeArray";
747 break;
748 case TypeCode.Decimal:
749 text = "TryReadDecimalArray";
750 break;
751 case TypeCode.Int32:
752 text = "TryReadInt32Array";
753 break;
754 case TypeCode.Int64:
755 text = "TryReadInt64Array";
756 break;
757 case TypeCode.Single:
758 text = "TryReadSingleArray";
759 break;
760 case TypeCode.Double:
761 text = "TryReadDoubleArray";
762 break;
763 }
764 if (text != null)
765 {
770 _ilg.Load(size);
772 _ilg.Call(typeof(XmlReaderDelegator).GetMethod(text, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic));
773 return true;
774 }
775 return false;
776 }
777
778 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
796
797 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
828
839
844
849
857
863
864 private void ThrowValidationException(string msg, params object[] values)
865 {
866 _ilg.Load(msg);
868 }
869
875 }
876
877 private readonly CriticalHelper _helper;
878
880 {
881 _helper = new CriticalHelper();
882 }
883
884 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
885 public XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract)
886 {
888 }
889
890 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
895
896 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
901
906
907 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
913}
static object GetUninitializedObject([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type)
void Ldloca(LocalBuilder localBuilder)
void Ldloc(LocalBuilder localBuilder)
void NewArray(Type elementType, object len)
void Call(object thisObj, MethodInfo methodInfo)
void IfNotIsEmptyString(LocalBuilder strLocal)
void BeginMethod(DynamicMethod dynamicMethod, Type delegateType, string methodName, Type[] argTypes, bool allowPrivateMemberAccess)
void ElseIfIsEmptyString(LocalBuilder strLocal)
Type LoadMember(MemberInfo memberInfo)
void StoreMember(MemberInfo memberInfo)
void Case(Label caseLabel1, string caseLabelName)
void Set(LocalBuilder local, object value)
object For(LocalBuilder local, object start, object end)
LocalBuilder DeclareLocal(Type type, string name, object initialValue)
void StoreArrayElement(object obj, object arrayIndex, object value)
void ConvertAddress(Type source, Type target)
void ConvertValue(Type source, Type target)
void New(ConstructorInfo constructorInfo)
static int GetIdForInitialization(ClassDataContract classContract)
static DataContract GetDataContractForInitialization(int id)
static int GetId(RuntimeTypeHandle typeHandle)
static string GetClrTypeFullName(Type type)
static DataContract GetDataContract(Type type)
static Type TypeOfXmlFormatCollectionReaderDelegate
Definition Globals.cs:657
static Type TypeOfXmlFormatClassReaderDelegate
Definition Globals.cs:645
static Type TypeOfXmlFormatGetOnlyCollectionReaderDelegate
Definition Globals.cs:669
static PrimitiveDataContract GetPrimitiveDataContract(Type type)
object ReflectionReadClass(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString[] memberNames, XmlDictionaryString[] memberNamespaces)
void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString itemName, XmlDictionaryString itemNs, CollectionDataContract collectionContract)
object ReflectionReadCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString itemName, XmlDictionaryString itemNamespace, CollectionDataContract collectionContract)
LocalBuilder ReadCollectionItem(CollectionDataContract collectionContract, Type itemType, string itemName, string itemNs)
int ReadMembers(ClassDataContract classContract, bool[] requiredMembers, Label[] memberLabels, LocalBuilder memberIndexLocal, LocalBuilder requiredIndexLocal)
bool TryReadPrimitiveArray(Type type, Type itemType, LocalBuilder size)
CodeGenerator GenerateCollectionReaderHelper(CollectionDataContract collectionContract, bool isGetOnlyCollection)
bool[] GetRequiredMembers(ClassDataContract contract, out int firstRequiredMember)
void WrapNullableObject(LocalBuilder innerValue, LocalBuilder outerValue, int nullables)
void ReadMembers(ClassDataContract classContract, LocalBuilder extensionDataLocal)
XmlFormatClassReaderDelegate CreateReflectionXmlClassReader(ClassDataContract classContract)
XmlFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract)
int GetRequiredMembers(ClassDataContract contract, bool[] requiredMembers)
XmlFormatGetOnlyCollectionReaderDelegate CreateReflectionReadGetOnlyCollectionReader()
XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract)
void StoreCollectionValue(LocalBuilder collection, LocalBuilder value, CollectionDataContract collectionContract)
void InternalDeserialize(LocalBuilder value, Type type, string name, string ns)
XmlFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract)
bool InvokeFactoryMethod(ClassDataContract classContract, LocalBuilder objectId)
XmlFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract)
XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract)
XmlFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract)
static object UnsafeGetUninitializedObject([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type)
static string ValueTypeCannotHaveId
Definition SR.cs:302
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string ValueTypeCannotHaveRef
Definition SR.cs:306
static string ValueTypeCannotBeNull
Definition SR.cs:298
Definition SR.cs:7
static readonly Type[] EmptyTypes
Definition Type.cs:19
TypeCode
Definition TypeCode.cs:4