Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XmlFormatWriterGenerator.cs
Go to the documentation of this file.
7using System.Xml;
8
10
11internal sealed class XmlFormatWriterGenerator
12{
13 private sealed class CriticalHelper
14 {
16
18
20
22
24
26
28
30
31 private int _typeIndex = 1;
32
33 private int _childElementIndex;
34
35 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
36 private XmlFormatClassWriterDelegate CreateReflectionXmlFormatClassWriterDelegate()
37 {
39 }
40
41 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
42 internal XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract)
43 {
45 {
47 }
48 _ilg = new CodeGenerator();
49 bool flag = classContract.RequiresMemberAccessForWrite(null);
50 try
51 {
52 _ilg.BeginMethod("Write" + classContract.StableName.Name + "ToXml", Globals.TypeOfXmlFormatClassWriterDelegate, flag);
53 }
55 {
56 if (!flag)
57 {
58 throw;
59 }
60 classContract.RequiresMemberAccessForWrite(securityException);
61 }
62 InitArgs(classContract.UnderlyingType);
64 return (XmlFormatClassWriterDelegate)_ilg.EndMethod();
65 }
66
67 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
68 private XmlFormatCollectionWriterDelegate CreateReflectionXmlFormatCollectionWriterDelegate()
69 {
71 }
72
73 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
74 internal XmlFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract)
75 {
77 {
79 }
80 _ilg = new CodeGenerator();
81 bool flag = collectionContract.RequiresMemberAccessForWrite(null);
82 try
83 {
84 _ilg.BeginMethod("Write" + collectionContract.StableName.Name + "ToXml", Globals.TypeOfXmlFormatCollectionWriterDelegate, flag);
85 }
87 {
88 if (!flag)
89 {
90 throw;
91 }
92 collectionContract.RequiresMemberAccessForWrite(securityException);
93 }
94 InitArgs(collectionContract.UnderlyingType);
96 return (XmlFormatCollectionWriterDelegate)_ilg.EndMethod();
97 }
98
99 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
100 private void InitArgs(Type objType)
101 {
105 _objectLocal = _ilg.DeclareLocal(objType, "objSerialized");
107 _ilg.Load(arg);
109 {
112 }
114 {
117 }
118 else if (objType.IsGenericType && objType.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter)
119 {
121 _ilg.ConvertValue(arg.ArgType, Globals.TypeOfKeyValuePair.MakeGenericType(classDataContract.KeyValuePairGenericArguments));
122 _ilg.New(classDataContract.KeyValuePairAdapterConstructorInfo);
123 }
124 else
125 {
126 _ilg.ConvertValue(arg.ArgType, objType);
127 }
129 }
130
132 {
133 if (classContract.BaseContract != null)
134 {
136 }
137 if (classContract.OnSerializing != null)
138 {
142 _ilg.Call(classContract.OnSerializing);
143 }
144 }
145
147 {
148 if (classContract.BaseContract != null)
149 {
150 InvokeOnSerialized(classContract.BaseContract);
151 }
152 if (classContract.OnSerialized != null)
153 {
157 _ilg.Call(classContract.OnSerialized);
158 }
159 }
160
161 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
163 {
165 if (classContract.IsISerializable)
166 {
168 }
169 else
170 {
171 if (classContract.ContractNamespaces.Length > 1)
172 {
177 }
182 for (int i = 0; i < classContract.ChildElementNamespaces.Length; i++)
183 {
184 if (classContract.ChildElementNamespaces[i] != null)
185 {
190 }
191 }
192 if (classContract.HasExtensionData)
193 {
201 }
202 else
203 {
205 }
206 }
208 }
209
210 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
212 {
215 if (_contractNamespacesLocal == null)
216 {
219 }
220 else
221 {
223 }
225 int count = classContract.Members.Count;
227 int num2 = 0;
228 while (num2 < count)
229 {
231 Type memberType = dataMember.MemberType;
235 if (!dataMember.EmitDefaultValue)
236 {
239 }
242 {
244 if (classContract.ChildElementNamespaces[num2 + _childElementIndex] != null)
245 {
249 }
250 if (localBuilder2 == null)
251 {
253 }
256 }
257 if (classContract.HasExtensionData)
258 {
260 }
261 if (!dataMember.EmitDefaultValue)
262 {
263 if (dataMember.IsRequired)
264 {
265 _ilg.Else();
267 }
268 _ilg.EndIf();
269 }
270 num2++;
271 num++;
272 }
273 _typeIndex++;
275 return num;
276 }
277
286
287 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
289 {
298 if (collectionContract.ChildElementNamespace != null)
299 {
304 }
305 if (collectionContract.Kind == CollectionKind.Array)
306 {
311 {
314 {
321 }
322 _ilg.EndFor();
323 }
324 return;
325 }
326 MethodInfo methodInfo = null;
327 switch (collectionContract.Kind)
328 {
330 case CollectionKind.List:
331 case CollectionKind.Collection:
333 break;
334 case CollectionKind.GenericList:
335 case CollectionKind.GenericCollection:
337 break;
338 case CollectionKind.GenericDictionary:
339 methodInfo = XmlFormatGeneratorStatics.IncrementCollectionCountGenericMethod.MakeGenericMethod(Globals.TypeOfKeyValuePair.MakeGenericType(collectionContract.ItemType.GetGenericArguments()));
340 break;
341 }
342 if (methodInfo != null)
343 {
345 }
346 bool flag = false;
347 bool flag2 = false;
348 Type type = null;
349 Type[] typeArguments = null;
350 if (collectionContract.Kind == CollectionKind.GenericDictionary)
351 {
352 flag2 = true;
353 typeArguments = collectionContract.ItemType.GetGenericArguments();
355 }
357 {
358 flag = true;
359 typeArguments = new Type[2]
360 {
363 };
365 }
366 else
367 {
368 type = collectionContract.GetEnumeratorMethod.ReturnType;
369 }
370 MethodInfo methodInfo2 = type.GetMethod("MoveNext", BindingFlags.Instance | BindingFlags.Public, Type.EmptyTypes);
371 MethodInfo methodInfo3 = type.GetMethod("get_Current", BindingFlags.Instance | BindingFlags.Public, Type.EmptyTypes);
372 if (methodInfo2 == null || methodInfo3 == null)
373 {
374 if (type.IsInterface)
375 {
376 if (methodInfo2 == null)
377 {
379 }
380 if (methodInfo3 == null)
381 {
383 }
384 }
385 else
386 {
389 if (kind == CollectionKind.GenericDictionary || kind == CollectionKind.GenericCollection || kind == CollectionKind.GenericEnumerable)
390 {
391 Type[] interfaces = type.GetInterfaces();
392 Type[] array = interfaces;
393 foreach (Type type2 in array)
394 {
395 if (type2.IsGenericType && type2.GetGenericTypeDefinition() == Globals.TypeOfIEnumeratorGeneric && type2.GetGenericArguments()[0] == collectionContract.ItemType)
396 {
398 break;
399 }
400 }
401 }
402 if (methodInfo2 == null)
403 {
405 }
406 if (methodInfo3 == null)
407 {
409 }
410 }
411 }
412 Type returnType = methodInfo3.ReturnType;
415 _ilg.Call(_objectLocal, collectionContract.GetEnumeratorMethod);
416 if (flag)
417 {
420 }
421 else if (flag2)
422 {
424 ConstructorInfo constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { type3 });
425 _ilg.ConvertValue(collectionContract.GetEnumeratorMethod.ReturnType, type3);
427 }
430 if (methodInfo == null)
431 {
433 }
435 {
437 if (flag2 || flag)
438 {
445 }
446 else
447 {
449 }
451 }
453 }
454
455 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
457 {
459 if (primitiveDataContract == null || primitiveDataContract.UnderlyingType == Globals.TypeOfObject)
460 {
461 return false;
462 }
463 if (type.IsValueType)
464 {
466 }
467 else
468 {
471 }
472 if (value != null)
473 {
474 _ilg.Load(value);
475 }
476 else if (memberInfo != null)
477 {
480 }
481 else
482 {
484 }
485 if (name != null)
486 {
487 _ilg.Load(name);
488 }
489 else
490 {
492 }
493 _ilg.Load(ns);
494 _ilg.Call(primitiveDataContract.XmlFormatWriterMethod);
495 return true;
496 }
497
498 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
500 {
502 if (primitiveDataContract == null)
503 {
504 return false;
505 }
506 string text = null;
507 switch (itemType.GetTypeCode())
508 {
509 case TypeCode.Boolean:
510 text = "WriteBooleanArray";
511 break;
512 case TypeCode.DateTime:
513 text = "WriteDateTimeArray";
514 break;
515 case TypeCode.Decimal:
516 text = "WriteDecimalArray";
517 break;
518 case TypeCode.Int32:
519 text = "WriteInt32Array";
520 break;
521 case TypeCode.Int64:
522 text = "WriteInt64Array";
523 break;
524 case TypeCode.Single:
525 text = "WriteSingleArray";
526 break;
527 case TypeCode.Double:
528 text = "WriteDoubleArray";
529 break;
530 }
531 if (text != null)
532 {
534 _ilg.Load(value);
537 _ilg.Call(typeof(XmlWriterDelegator).GetMethod(text, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[3]
538 {
539 type,
540 typeof(XmlDictionaryString),
541 typeof(XmlDictionaryString)
542 }));
543 return true;
544 }
545 return false;
546 }
547
548 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
550 {
551 Type localType = memberValue.LocalType;
552 bool flag = localType.IsGenericType && localType.GetGenericTypeDefinition() == Globals.TypeOfNullable;
553 if (localType.IsValueType && !flag)
554 {
556 if (primitiveDataContract != null && !writeXsiType)
557 {
558 _ilg.Call(_xmlWriterArg, primitiveDataContract.XmlFormatContentWriterMethod, memberValue);
559 }
560 else
561 {
563 }
564 return;
565 }
566 if (flag)
567 {
569 localType = memberValue.LocalType;
570 }
571 else
572 {
574 _ilg.Load(null);
575 _ilg.Ceq();
576 }
577 _ilg.If();
579 _ilg.Else();
582 {
583 if (flag)
584 {
585 _ilg.Call(_xmlWriterArg, primitiveDataContract2.XmlFormatContentWriterMethod, memberValue);
586 }
587 else
588 {
589 _ilg.Call(_contextArg, primitiveDataContract2.XmlFormatContentWriterMethod, _xmlWriterArg, memberValue);
590 }
591 }
592 else
593 {
594 if (localType == Globals.TypeOfObject || localType == Globals.TypeOfValueType || ((IList)Globals.TypeOfNullable.GetInterfaces()).Contains((object?)localType))
595 {
598 memberValue = _ilg.DeclareLocal(Globals.TypeOfObject, "unwrappedMemberValue");
599 localType = memberValue.LocalType;
601 _ilg.If(memberValue, Cmp.EqualTo, null);
603 _ilg.Else();
604 }
607 {
608 _ilg.EndIf();
609 }
610 }
611 _ilg.EndIf();
612 }
613
626
627 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
629 {
630 Type type = memberValue.LocalType;
634 while (type.IsGenericType && type.GetGenericTypeDefinition() == Globals.TypeOfNullable)
635 {
636 Type type2 = type.GetGenericArguments()[0];
637 _ilg.Dup();
641 type = type2;
642 }
643 memberValue = _ilg.DeclareLocal(type, "nullableUnwrappedMemberValue");
645 _ilg.Load(false);
646 _ilg.Br(label2);
648 _ilg.Pop();
651 _ilg.Load(true);
653 return memberValue;
654 }
655
657 {
659 {
660 if (ns != null && ns.Value != null)
661 {
662 return ns.Value.Length > 0;
663 }
664 return false;
665 }
666 return false;
667 }
668
688
693
695 {
697 {
698 return true;
699 }
700 string name = member.Name;
701 string @namespace = classContract.StableName.Namespace;
704 {
705 if (@namespace == classDataContract.StableName.Namespace)
706 {
708 for (int i = 0; i < members.Count; i++)
709 {
710 if (name == members[i].Name)
711 {
712 return CheckIfConflictingMembersHaveDifferentTypes(members[i]);
713 }
714 }
715 }
717 }
718 return false;
719 }
720
722 {
723 while (member.ConflictingMember != null)
724 {
725 if (member.MemberType != member.ConflictingMember.MemberType)
726 {
727 return true;
728 }
729 member = member.ConflictingMember;
730 }
731 return false;
732 }
733 }
734
735 private readonly CriticalHelper _helper;
736
738 {
739 _helper = new CriticalHelper();
740 }
741
742 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
743 internal XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract)
744 {
746 }
747
748 [RequiresUnreferencedCode("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")]
753}
void LoadArrayElement(object obj, object arrayIndex)
void EndForEach(MethodInfo moveNextMethod)
void Call(object thisObj, MethodInfo methodInfo)
void BeginMethod(DynamicMethod dynamicMethod, Type delegateType, string methodName, Type[] argTypes, bool allowPrivateMemberAccess)
Type LoadMember(MemberInfo memberInfo)
object For(LocalBuilder local, object start, object end)
LocalBuilder DeclareLocal(Type type, string name, object initialValue)
void ForEach(LocalBuilder local, Type elementType, Type enumeratorType, LocalBuilder enumerator, MethodInfo getCurrentMethod)
void ConvertValue(Type source, Type target)
void New(ConstructorInfo constructorInfo)
static MethodInfo GetTargetMethodWithName(string name, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type interfaceType)
static int GetId(RuntimeTypeHandle typeHandle)
static DataContract GetDataContract(Type type)
static Type TypeOfXmlFormatCollectionWriterDelegate
Definition Globals.cs:633
static Type TypeOfXmlFormatClassWriterDelegate
Definition Globals.cs:621
static PrimitiveDataContract GetPrimitiveDataContract(Type type)
void ReflectionWriteCollection(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, CollectionDataContract collectionDataContract)
void ReflectionWriteClass(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, ClassDataContract classContract)
int WriteMembers(ClassDataContract classContract, LocalBuilder extensionDataLocal, ClassDataContract derivedMostClassContract)
XmlFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract)
void InternalSerialize(MethodInfo methodInfo, LocalBuilder memberValue, Type memberType, bool writeXsiType)
void WriteStartElement(Type type, XmlDictionaryString ns, LocalBuilder namespaceLocal, LocalBuilder nameLocal, int nameIndex)
bool TryWritePrimitive(Type type, LocalBuilder value, MemberInfo memberInfo, LocalBuilder arrayItemIndex, LocalBuilder ns, LocalBuilder name, int nameIndex)
XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract)
bool TryWritePrimitiveArray(Type type, Type itemType, LocalBuilder value, LocalBuilder itemName, LocalBuilder itemNamespace)
bool CheckIfMemberHasConflict(DataMember member, ClassDataContract classContract, ClassDataContract derivedMostClassContract)
XmlFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract)
XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract)
Type[] GetInterfaces()
static readonly Type[] EmptyTypes
Definition Type.cs:19
TypeCode
Definition TypeCode.cs:4