Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XmlSerializationReaderILGen.cs
Go to the documentation of this file.
11
13
15{
16 private sealed class Member
17 {
18 private readonly string _source;
19
20 private readonly string _arrayName;
21
22 private readonly string _arraySource;
23
24 private readonly string _choiceArrayName;
25
26 private readonly string _choiceSource;
27
28 private readonly string _choiceArraySource;
29
30 private readonly MemberMapping _mapping;
31
32 private readonly bool _isArray;
33
34 private readonly bool _isList;
35
36 private bool _isNullable;
37
38 private int _fixupIndex = -1;
39
40 private string _paramsReadSource;
41
42 private string _checkSpecifiedSource;
43
45
46 internal string Source => _source;
47
48 internal string ArrayName => _arrayName;
49
50 internal string ArraySource => _arraySource;
51
52 internal bool IsList => _isList;
53
54 internal bool IsArrayLike
55 {
56 get
57 {
58 if (!_isArray)
59 {
60 return _isList;
61 }
62 return true;
63 }
64 }
65
66 internal bool IsNullable
67 {
68 get
69 {
70 return _isNullable;
71 }
72 set
73 {
75 }
76 }
77
78 internal int FixupIndex => _fixupIndex;
79
80 internal string ParamsReadSource
81 {
82 get
83 {
84 return _paramsReadSource;
85 }
86 set
87 {
89 }
90 }
91
92 internal string CheckSpecifiedSource
93 {
94 get
95 {
97 }
98 set
99 {
101 }
102 }
103
104 internal string ChoiceSource => _choiceSource;
105
107
109
114
119
124
129
134
136 {
137 _source = source;
139 _choiceArrayName = "choice_" + _arrayName;
141 if (mapping.TypeDesc.IsArrayLike)
142 {
143 if (arraySource != null)
144 {
146 }
147 else
148 {
149 _arraySource = outerClass.GetArraySource(mapping.TypeDesc, _arrayName, multiRef);
150 }
151 _isArray = mapping.TypeDesc.IsArray;
152 _isList = !_isArray;
153 if (mapping.ChoiceIdentifier != null)
154 {
157 string text = "c" + choiceArrayName;
158 string cSharpName = mapping.ChoiceIdentifier.Mapping.TypeDesc.CSharpName;
159 string text2 = "(" + cSharpName + "[])";
160 string text3 = choiceArrayName + " = " + text2 + "EnsureArrayIndex(" + choiceArrayName + ", " + text + ", " + outerClass.RaCodeGen.GetStringForTypeof(cSharpName) + ");";
161 _choiceArraySource = text3 + outerClass.RaCodeGen.GetStringForArrayMember(choiceArrayName, text + "++", mapping.ChoiceIdentifier.Mapping.TypeDesc);
162 }
163 else
164 {
166 }
167 }
168 else
169 {
170 _arraySource = ((arraySource == null) ? source : arraySource);
172 }
174 }
175 }
176
178
180
182
183 private int _nextIdNumber;
184
186 {
187 get
188 {
189 if (_enums == null)
190 {
192 }
193 return _enums;
194 }
195 }
196
197 [RequiresUnreferencedCode("Creates XmlSerializationILGen")]
198 internal XmlSerializationReaderILGen(TypeScope[] scopes, string access, string className)
199 : base(scopes, access, className)
200 {
201 }
202
203 [RequiresUnreferencedCode("calls WriteReflectionInit")]
204 internal void GenerateBegin()
205 {
206 typeBuilder = CodeGenerator.CreateTypeBuilder(base.ModuleBuilder, base.ClassName, base.TypeAttributes | TypeAttributes.BeforeFieldInit, typeof(XmlSerializationReader), Type.EmptyTypes);
207 TypeScope[] scopes = base.Scopes;
208 foreach (TypeScope typeScope in scopes)
209 {
210 foreach (TypeMapping typeMapping in typeScope.TypeMappings)
211 {
213 {
214 base.MethodNames.Add(typeMapping, NextMethodName(typeMapping.TypeDesc.Name));
215 }
216 }
217 base.RaCodeGen.WriteReflectionInit(typeScope);
218 }
219 }
220
221 [RequiresUnreferencedCode("calls WriteStructMethod")]
222 internal override void GenerateMethod(TypeMapping mapping)
223 {
224 if (base.GeneratedMethods.Add(mapping))
225 {
227 {
229 }
230 else if (mapping is EnumMapping)
231 {
233 }
234 else if (mapping is NullableMapping)
235 {
237 }
238 }
239 }
240
241 [RequiresUnreferencedCode("calls GenerateReferencedMethods")]
242 internal void GenerateEnd(string[] methods, XmlMapping[] xmlMappings, Type[] types)
243 {
247 ilg.BeginMethod(typeof(void), "InitIDs", Type.EmptyTypes, Array.Empty<string>(), MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig);
248 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
249 MethodInfo method2 = typeof(XmlReader).GetMethod("get_NameTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
250 MethodInfo method3 = typeof(XmlNameTable).GetMethod("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
251 foreach (string key in _idNames.Keys)
252 {
253 ilg.Ldarg(0);
254 ilg.Ldarg(0);
255 ilg.Call(method);
260 }
261 ilg.EndMethod();
264 CreatedTypes.Add(type.Name, type);
265 }
266
267 [RequiresUnreferencedCode("calls GenerateMembersElement")]
269 {
270 if (!xmlMapping.IsReadable)
271 {
272 return null;
273 }
274 if (!xmlMapping.GenerateSerializer)
275 {
276 throw new ArgumentException(System.SR.XmlInternalError, "xmlMapping");
277 }
279 {
281 }
283 {
285 }
286 throw new ArgumentException(System.SR.XmlInternalError, "xmlMapping");
287 }
288
289 [RequiresUnreferencedCode("calls LoadMember")]
290 private void WriteIsStartTag(string name, string ns)
291 {
292 WriteID(name);
293 WriteID(ns);
294 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
295 MethodInfo method2 = typeof(XmlReader).GetMethod("IsStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
296 {
297 typeof(string),
298 typeof(string)
299 });
300 ilg.Ldarg(0);
301 ilg.Call(method);
302 ilg.Ldarg(0);
304 ilg.Ldarg(0);
305 ilg.LoadMember(_idNameFields[ns ?? string.Empty]);
307 ilg.If();
308 }
309
310 [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")]
311 private void WriteUnknownNode(string func, string node, ElementAccessor e, bool anyIfs)
312 {
313 if (anyIfs)
314 {
315 ilg.Else();
316 }
317 List<Type> list = new List<Type>();
318 ilg.Ldarg(0);
319 if (node == "null")
320 {
321 ilg.Load(null);
322 }
323 else
324 {
325 object variable = ilg.GetVariable("p");
328 }
329 list.Add(typeof(object));
330 if (e != null)
331 {
332 string text = ((e.Form == XmlSchemaForm.Qualified) ? e.Namespace : "");
333 text += ":";
334 text += e.Name;
336 list.Add(typeof(string));
337 }
338 MethodInfo method = typeof(XmlSerializationReader).GetMethod(func, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, list.ToArray());
339 ilg.Call(method);
340 if (anyIfs)
341 {
342 ilg.EndIf();
343 }
344 }
345
347 {
349 ilg.BeginMethod(typeof(void), "InitCallbacks", Type.EmptyTypes, Array.Empty<string>(), MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig);
350 ilg.EndMethod();
351 }
352
353 [RequiresUnreferencedCode("calls GenerateLiteralMembersElement")]
358
360 {
361 string result = null;
362 if (member.ChoiceIdentifier != null)
363 {
364 for (int i = 0; i < mappings.Length; i++)
365 {
367 {
368 result = $"p[{i}]";
369 break;
370 }
371 }
372 }
373 return result;
374 }
375
377 {
378 if (mapping.ChoiceIdentifier == null)
379 {
380 return "";
381 }
382 CodeIdentifier.CheckValidIdentifier(mapping.ChoiceIdentifier.MemberName);
383 return base.RaCodeGen.GetStringForMember(parent, mapping.ChoiceIdentifier.MemberName, parentTypeDesc);
384 }
385
386 [RequiresUnreferencedCode("calls InitializeValueTypes")]
388 {
390 MemberMapping[] members = ((MembersMapping)accessor.Mapping).Members;
391 bool hasWrapperElement = ((MembersMapping)accessor.Mapping).HasWrapperElement;
392 string text = NextMethodName(accessor.Name);
394 ilg.BeginMethod(typeof(object[]), text, Type.EmptyTypes, Array.Empty<string>(), MethodAttributes.Public | MethodAttributes.HideBySig);
395 ilg.Load(null);
397 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
398 MethodInfo method2 = typeof(XmlReader).GetMethod("MoveToContent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
399 ilg.Ldarg(0);
400 ilg.Call(method);
402 ilg.Pop();
404 ilg.NewArray(typeof(object), members.Length);
408 {
410 WriteIsStartTag(accessor.Name, (accessor.Form == XmlSchemaForm.Qualified) ? accessor.Namespace : "");
411 }
412 Member anyText = null;
413 Member anyElement = null;
414 Member anyAttribute = null;
418 for (int i = 0; i < members.Length; i++)
419 {
421 string text2 = $"p[{i}]";
422 string arraySource = text2;
423 if (memberMapping.Xmlns != null)
424 {
425 arraySource = $"(({memberMapping.TypeDesc.CSharpName}){text2})";
426 }
430 if (!memberMapping.IsSequence)
431 {
432 member.ParamsReadSource = $"paramsRead[{i}]";
433 }
434 if (memberMapping.CheckSpecified == SpecifiedAccessor.ReadWrite)
435 {
436 string text3 = memberMapping.Name + "Specified";
437 for (int j = 0; j < members.Length; j++)
438 {
439 if (members[j].Name == text3)
440 {
442 break;
443 }
444 }
445 }
446 bool flag = false;
447 if (memberMapping.Text != null)
448 {
450 }
451 if (memberMapping.Attribute != null && memberMapping.Attribute.Any)
452 {
454 }
455 if (memberMapping.Attribute != null || memberMapping.Xmlns != null)
456 {
457 list3.Add(member);
458 }
459 else if (memberMapping.Text != null)
460 {
461 list2.Add(member);
462 }
463 if (!memberMapping.IsSequence)
464 {
465 for (int k = 0; k < memberMapping.Elements.Length; k++)
466 {
467 if (memberMapping.Elements[k].Any && memberMapping.Elements[k].Name.Length == 0)
468 {
470 if (memberMapping.Attribute == null && memberMapping.Text == null)
471 {
473 }
474 flag = true;
475 break;
476 }
477 }
478 }
479 if (memberMapping.Attribute != null || memberMapping.Text != null || flag)
480 {
481 list.Add(member2);
482 continue;
483 }
484 if (memberMapping.TypeDesc.IsArrayLike && (memberMapping.Elements.Length != 1 || !(memberMapping.Elements[0].Mapping is ArrayMapping)))
485 {
486 list.Add(member2);
488 continue;
489 }
490 if (memberMapping.TypeDesc.IsArrayLike && !memberMapping.TypeDesc.IsArray)
491 {
493 }
494 list.Add(member);
495 }
496 Member[] array = list.ToArray();
497 Member[] members2 = list2.ToArray();
498 if (array.Length != 0 && array[0].Mapping.IsReturnValue)
499 {
500 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("set_IsReturnValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(bool) });
501 ilg.Ldarg(0);
502 ilg.Ldc(boolVar: true);
504 }
505 WriteParamsRead(members.Length);
506 if (list3.Count > 0)
507 {
508 Member[] members3 = list3.ToArray();
512 MethodInfo method4 = typeof(XmlReader).GetMethod("MoveToElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
513 ilg.Ldarg(0);
514 ilg.Call(method);
516 ilg.Pop();
517 }
520 {
521 MethodInfo method5 = typeof(XmlReader).GetMethod("get_IsEmptyElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
522 ilg.Ldarg(0);
523 ilg.Call(method);
525 ilg.If();
526 MethodInfo method6 = typeof(XmlReader).GetMethod("Skip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
527 ilg.Ldarg(0);
528 ilg.Call(method);
530 ilg.Ldarg(0);
531 ilg.Call(method);
533 ilg.Pop();
535 ilg.EndIf();
536 MethodInfo method7 = typeof(XmlReader).GetMethod("ReadStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
537 ilg.Ldarg(0);
538 ilg.Call(method);
540 }
541 if (IsSequence(array))
542 {
543 ilg.Ldc(0);
544 ilg.Stloc(typeof(int), "state");
545 }
547 string text4 = "UnknownNode((object)p, " + ExpectedElements(array) + ");";
549 ilg.Ldarg(0);
550 ilg.Call(method);
552 ilg.Pop();
556 {
557 MethodInfo method8 = typeof(XmlSerializationReader).GetMethod("ReadEndElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
558 ilg.Ldarg(0);
560 WriteUnknownNode("UnknownNode", "null", accessor, anyIfs: true);
561 ilg.Ldarg(0);
562 ilg.Call(method);
564 ilg.Pop();
566 }
567 ilg.Ldloc(ilg.GetLocal("p"));
568 ilg.EndMethod();
569 return text;
570 }
571
572 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
574 {
575 for (int i = 0; i < mappings.Length; i++)
576 {
578 {
580 ilg.Ldloc(local);
581 ilg.Ldc(i);
582 base.RaCodeGen.ILGenForCreateInstance(ilg, mappings[i].TypeDesc.Type, ctorInaccessible: false, cast: false);
584 ilg.Stelem(local.LocalType.GetElementType());
585 }
586 }
587 }
588
589 [RequiresUnreferencedCode("calls WriteMemberElements")]
591 {
593 TypeMapping mapping = accessor.Mapping;
594 string text = NextMethodName(accessor.Name);
596 ilg.BeginMethod(typeof(object), text, Type.EmptyTypes, Array.Empty<string>(), MethodAttributes.Public | MethodAttributes.HideBySig);
598 ilg.Load(null);
603 Member[] array = new Member[1]
604 {
605 new Member(this, "o", "o", "a", 0, memberMapping)
606 };
607 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
608 MethodInfo method2 = typeof(XmlReader).GetMethod("MoveToContent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
609 ilg.Ldarg(0);
610 ilg.Call(method);
612 ilg.Pop();
613 string elseString = "UnknownNode(null, " + ExpectedElements(array) + ");";
614 WriteMemberElements(array, "throw CreateUnknownNodeException();", elseString, accessor.Any ? array[0] : null, null);
618 ilg.EndMethod();
619 return text;
620 }
621
622 private string NextMethodName(string name)
623 {
626 handler.AppendLiteral("Read");
627 handler.AppendFormatted(++base.NextMethodNumber);
628 handler.AppendLiteral("_");
630 return string.Create(invariantCulture, ref handler);
631 }
632
633 private string NextIdName(string name)
634 {
637 handler.AppendLiteral("id");
639 handler.AppendLiteral("_");
641 return string.Create(invariantCulture, ref handler);
642 }
643
644 [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")]
646 {
648 {
649 string text = ReferenceMapping(mapping);
650 if (text == null)
651 {
653 }
654 MethodBuilder methodInfo = EnsureMethodBuilder(typeBuilder, text, MethodAttributes.Private | MethodAttributes.HideBySig, mapping.TypeDesc.Type, new Type[1] { typeof(string) });
655 ilg.Ldarg(0);
656 switch (source)
657 {
658 case "Reader.ReadElementString()":
659 case "Reader.ReadString()":
660 {
661 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
662 MethodInfo method4 = typeof(XmlReader).GetMethod((source == "Reader.ReadElementString()") ? "ReadElementContentAsString" : "ReadContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
663 ilg.Ldarg(0);
666 break;
667 }
668 case "Reader.Value":
669 {
670 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
671 MethodInfo method2 = typeof(XmlReader).GetMethod("get_Value", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
672 ilg.Ldarg(0);
673 ilg.Call(method);
675 break;
676 }
677 case "vals[i]":
678 {
679 LocalBuilder local = ilg.GetLocal("vals");
682 break;
683 }
684 case "false":
685 ilg.Ldc(boolVar: false);
686 break;
687 default:
688 throw Globals.NotSupported("Unexpected: " + source);
689 }
691 return;
692 }
693 if (mapping.TypeDesc == base.StringTypeDesc)
694 {
695 switch (source)
696 {
697 case "Reader.ReadElementString()":
698 case "Reader.ReadString()":
699 {
700 MethodInfo method7 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
701 MethodInfo method8 = typeof(XmlReader).GetMethod((source == "Reader.ReadElementString()") ? "ReadElementContentAsString" : "ReadContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
702 ilg.Ldarg(0);
705 break;
706 }
707 case "Reader.Value":
708 {
709 MethodInfo method5 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
710 MethodInfo method6 = typeof(XmlReader).GetMethod("get_Value", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
711 ilg.Ldarg(0);
714 break;
715 }
716 case "vals[i]":
717 {
721 break;
722 }
723 default:
724 throw Globals.NotSupported("Unexpected: " + source);
725 }
726 return;
727 }
728 if (mapping.TypeDesc.FormatterName == "String")
729 {
730 if (source == "vals[i]")
731 {
732 if (mapping.TypeDesc.CollapseWhitespace)
733 {
734 ilg.Ldarg(0);
735 }
739 if (mapping.TypeDesc.CollapseWhitespace)
740 {
741 MethodInfo method9 = typeof(XmlSerializationReader).GetMethod("CollapseWhitespace", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[1] { typeof(string) }, null);
743 }
744 return;
745 }
746 MethodInfo method10 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
747 MethodInfo method11 = typeof(XmlReader).GetMethod((source == "Reader.Value") ? "get_Value" : "ReadElementContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
748 if (mapping.TypeDesc.CollapseWhitespace)
749 {
750 ilg.Ldarg(0);
751 }
752 ilg.Ldarg(0);
755 if (mapping.TypeDesc.CollapseWhitespace)
756 {
757 MethodInfo method12 = typeof(XmlSerializationReader).GetMethod("CollapseWhitespace", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
759 }
760 return;
761 }
762 Type type = ((source == "false") ? typeof(bool) : typeof(string));
764 if (mapping.TypeDesc.HasCustomFormatter)
765 {
767 if ((mapping.TypeDesc.FormatterName == "ByteArrayBase64" && source == "false") || (mapping.TypeDesc.FormatterName == "ByteArrayHex" && source == "false") || mapping.TypeDesc.FormatterName == "XmlQualifiedName")
768 {
770 ilg.Ldarg(0);
771 }
772 method13 = typeof(XmlSerializationReader).GetMethod("To" + mapping.TypeDesc.FormatterName, bindingAttr, new Type[1] { type });
773 }
774 else
775 {
776 method13 = typeof(XmlConvert).GetMethod("To" + mapping.TypeDesc.FormatterName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { type });
777 }
778 switch (source)
779 {
780 case "Reader.ReadElementString()":
781 case "Reader.ReadString()":
782 {
783 MethodInfo method16 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
784 MethodInfo method17 = typeof(XmlReader).GetMethod((source == "Reader.ReadElementString()") ? "ReadElementContentAsString" : "ReadContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
785 ilg.Ldarg(0);
788 break;
789 }
790 case "Reader.Value":
791 {
792 MethodInfo method14 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
793 MethodInfo method15 = typeof(XmlReader).GetMethod("get_Value", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
794 ilg.Ldarg(0);
797 break;
798 }
799 case "vals[i]":
800 {
804 break;
805 }
806 default:
807 ilg.Ldc(boolVar: false);
808 break;
809 }
811 }
812
813 private string MakeUnique(EnumMapping mapping, string name)
814 {
815 string text = name;
816 if (Enums.TryGetValue(text, out var value))
817 {
818 if (value == mapping)
819 {
820 return null;
821 }
822 int num = 0;
823 while (value != null)
824 {
825 num++;
826 text = name + num.ToString(CultureInfo.InvariantCulture);
827 Enums.TryGetValue(text, out value);
828 }
829 }
830 Enums.Add(text, mapping);
831 return text;
832 }
833
834 [RequiresUnreferencedCode("calls LoadMember")]
836 {
837 get_TableName = null;
839 string text = MakeUnique(mapping, typeName + "Values");
840 if (text == null)
841 {
842 return CodeIdentifier.GetCSharpName(typeName);
843 }
844 string fieldName = MakeUnique(mapping, "_" + text);
849 ilg.BeginMethod(typeof(Hashtable), "get_" + text, Type.EmptyTypes, Array.Empty<string>(), MethodAttributes.Assembly | MethodAttributes.HideBySig | MethodAttributes.SpecialName);
850 ilg.Ldarg(0);
852 ilg.Load(null);
853 ilg.If(Cmp.EqualTo);
854 ConstructorInfo constructor = typeof(Hashtable).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
858 ConstantMapping[] constants = mapping.Constants;
859 MethodInfo method = typeof(Hashtable).GetMethod("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
860 {
861 typeof(object),
862 typeof(object)
863 });
864 for (int i = 0; i < constants.Length; i++)
865 {
868 ilg.Ldc(Enum.ToObject(mapping.TypeDesc.Type, constants[i].Value));
869 ilg.ConvertValue(mapping.TypeDesc.Type, typeof(long));
870 ilg.ConvertValue(typeof(long), typeof(object));
871 ilg.Call(method);
872 }
873 ilg.Ldarg(0);
876 ilg.EndIf();
877 ilg.Ldarg(0);
880 propertyBuilder.SetGetMethod(get_TableName);
881 return text;
882 }
883
884 [RequiresUnreferencedCode("calls WriteHashtable")]
886 {
888 if (mapping.IsFlags)
889 {
891 }
892 base.MethodNames.TryGetValue(mapping, out var value);
893 string cSharpName = mapping.TypeDesc.CSharpName;
894 List<Type> list = new List<Type>();
896 Type type = mapping.TypeDesc.Type;
898 list.Add(typeof(string));
899 list2.Add("s");
901 ilg.BeginMethod(type, GetMethodBuilder(value), list.ToArray(), list2.ToArray(), MethodAttributes.Private | MethodAttributes.HideBySig);
902 ConstantMapping[] constants = mapping.Constants;
903 if (mapping.IsFlags)
904 {
905 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ToEnum", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[3]
906 {
907 typeof(string),
908 typeof(Hashtable),
909 typeof(string)
910 });
911 ilg.Ldarg("s");
912 ilg.Ldarg(0);
915 ilg.Call(method);
916 if (underlyingType != typeof(long))
917 {
919 }
922 }
923 else
924 {
930 ilg.Ldarg("s");
936 {
938 if (hashSet.Add(constantMapping.XmlName))
939 {
943 MethodInfo method2 = typeof(string).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
944 {
945 typeof(string),
946 typeof(string)
947 });
951 list4.Add(Enum.ToObject(mapping.TypeDesc.Type, constantMapping.Value));
952 }
953 }
954 ilg.Br(label);
955 for (int j = 0; j < list3.Count; j++)
956 {
958 ilg.Ldc(list4[j]);
961 }
962 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("CreateUnknownConstantException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
963 {
964 typeof(string),
965 typeof(Type)
966 });
968 ilg.Ldarg(0);
969 ilg.Ldarg("s");
970 ilg.Ldc(mapping.TypeDesc.Type);
972 ilg.Throw();
974 }
977 ilg.EndMethod();
978 }
979
980 [RequiresUnreferencedCode("calls WriteQNameEqual")]
982 {
983 for (StructMapping structMapping = mapping.DerivedMappings; structMapping != null; structMapping = structMapping.NextDerivedMapping)
984 {
985 ilg.InitElseIf();
986 WriteQNameEqual("xsiType", structMapping.TypeName, structMapping.Namespace);
987 ilg.AndIf();
989 List<Type> list = new List<Type>();
990 ilg.Ldarg(0);
991 if (structMapping.TypeDesc.IsNullable)
992 {
993 ilg.Ldarg("isNullable");
994 list.Add(typeof(bool));
995 }
996 ilg.Ldc(boolVar: false);
997 list.Add(typeof(bool));
1004 }
1005 }
1006
1007 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
1009 {
1010 TypeScope[] scopes = base.Scopes;
1011 foreach (TypeScope typeScope in scopes)
1012 {
1013 foreach (Mapping typeMapping in typeScope.TypeMappings)
1014 {
1016 {
1018 ilg.InitElseIf();
1019 WriteQNameEqual("xsiType", enumMapping.TypeName, enumMapping.Namespace);
1020 ilg.AndIf();
1021 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1022 MethodInfo method2 = typeof(XmlReader).GetMethod("ReadStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1023 ilg.Ldarg(0);
1024 ilg.Call(method);
1025 ilg.Call(method2);
1028 MethodBuilder methodBuilder = EnsureMethodBuilder(typeBuilder, methodName, MethodAttributes.Private | MethodAttributes.HideBySig, enumMapping.TypeDesc.Type, new Type[1] { typeof(string) });
1029 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("CollapseWhitespace", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1030 MethodInfo method4 = typeof(XmlReader).GetMethod("ReadContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1031 ilg.Ldarg(0);
1032 ilg.Ldarg(0);
1033 ilg.Ldarg(0);
1034 ilg.Call(method);
1035 ilg.Call(method4);
1036 ilg.Call(method3);
1038 ilg.ConvertValue(methodBuilder.ReturnType, localBuilder.LocalType);
1040 MethodInfo method5 = typeof(XmlSerializationReader).GetMethod("ReadEndElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1041 ilg.Ldarg(0);
1042 ilg.Call(method5);
1046 }
1047 else
1048 {
1050 {
1051 continue;
1052 }
1054 if (arrayMapping.TypeDesc.HasDefaultConstructor)
1055 {
1056 ilg.InitElseIf();
1057 WriteQNameEqual("xsiType", arrayMapping.TypeName, arrayMapping.Namespace);
1058 ilg.AndIf();
1059 ilg.EnterScope();
1063 string text = "a";
1064 string arrayName = "z";
1065 Member member = new Member(this, text, arrayName, 0, memberMapping);
1066 TypeDesc typeDesc = arrayMapping.TypeDesc;
1068 if (arrayMapping.TypeDesc.IsValueType)
1069 {
1070 base.RaCodeGen.ILGenForCreateInstance(ilg, typeDesc.Type, ctorInaccessible: false, cast: false);
1071 }
1072 else
1073 {
1074 ilg.Load(null);
1075 }
1077 WriteArray(member.Source, member.ArrayName, arrayMapping, readOnly: false, isNullable: false, -1, 0);
1081 ilg.ExitScope();
1082 }
1083 }
1084 }
1085 }
1086 }
1087
1088 [RequiresUnreferencedCode("calls WriteElement")]
1090 {
1093 ilg.BeginMethod(nullableMapping.TypeDesc.Type, GetMethodBuilder(value), new Type[1] { typeof(bool) }, new string[1] { "checkType" }, MethodAttributes.Private | MethodAttributes.HideBySig);
1096 ilg.InitObj(nullableMapping.TypeDesc.Type);
1097 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ReadNull", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1098 ilg.Ldarg(0);
1099 ilg.Call(method);
1100 ilg.If();
1104 ilg.EndIf();
1107 elementAccessor.Any = false;
1108 elementAccessor.IsNullable = nullableMapping.BaseMapping.TypeDesc.IsNullable;
1109 WriteElement("o", null, null, elementAccessor, null, null, checkForNull: false, readOnly: false, -1, -1);
1115 ilg.EndMethod();
1116 }
1117
1118 [RequiresUnreferencedCode("calls WriteLiteralStructMethod")]
1123
1124 [RequiresUnreferencedCode("calls WriteEnumAndArrayTypes")]
1126 {
1127 base.MethodNames.TryGetValue(structMapping, out var value);
1128 string cSharpName = structMapping.TypeDesc.CSharpName;
1130 List<Type> list = new List<Type>();
1132 if (structMapping.TypeDesc.IsNullable)
1133 {
1134 list.Add(typeof(bool));
1135 list2.Add("isNullable");
1136 }
1137 list.Add(typeof(bool));
1138 list2.Add("checkType");
1139 ilg.BeginMethod(structMapping.TypeDesc.Type, GetMethodBuilder(value), list.ToArray(), list2.ToArray(), MethodAttributes.Private | MethodAttributes.HideBySig);
1142 MethodInfo method = typeof(XmlSerializationReader).GetMethod("GetXsiType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1143 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("ReadNull", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1146 ilg.Ldarg("checkType");
1147 ilg.Brtrue(label);
1148 ilg.Load(null);
1149 ilg.Br_S(label2);
1151 ilg.Ldarg(0);
1152 ilg.Call(method);
1155 ilg.Ldc(boolVar: false);
1157 if (structMapping.TypeDesc.IsNullable)
1158 {
1159 ilg.Ldarg("isNullable");
1160 ilg.If();
1161 ilg.Ldarg(0);
1162 ilg.Call(method2);
1164 ilg.EndIf();
1165 }
1166 ilg.Ldarg("checkType");
1167 ilg.If();
1168 if (structMapping.TypeDesc.IsRoot)
1169 {
1171 ilg.If();
1173 ilg.Load(null);
1174 ilg.If(Cmp.NotEqualTo);
1175 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("ReadTypedNull", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { localBuilder.LocalType });
1176 ilg.Ldarg(0);
1178 ilg.Call(method3);
1181 ilg.Else();
1182 if (structMapping.TypeDesc.IsValueType)
1183 {
1185 }
1186 ilg.Load(null);
1189 ilg.EndIf();
1190 ilg.EndIf();
1191 }
1192 ilg.Ldloc(typeof(XmlQualifiedName), "xsiType");
1193 ilg.Load(null);
1194 ilg.Ceq();
1195 if (!structMapping.TypeDesc.IsRoot)
1196 {
1197 label = ilg.DefineLabel();
1199 ilg.Brtrue(label);
1200 WriteQNameEqual("xsiType", structMapping.TypeName, structMapping.Namespace);
1201 ilg.Br_S(label2);
1203 ilg.Ldc(boolVar: true);
1205 }
1206 ilg.If();
1207 if (structMapping.TypeDesc.IsRoot)
1208 {
1209 ConstructorInfo constructor = typeof(XmlQualifiedName).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
1210 {
1211 typeof(string),
1212 typeof(string)
1213 });
1214 MethodInfo method4 = typeof(XmlSerializationReader).GetMethod("ReadTypedPrimitive", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(XmlQualifiedName) });
1215 ilg.Ldarg(0);
1216 ilg.Ldstr("anyType");
1217 ilg.Ldstr("http://www.w3.org/2001/XMLSchema");
1219 ilg.Call(method4);
1222 }
1224 if (structMapping.TypeDesc.IsRoot)
1225 {
1227 }
1228 ilg.Else();
1229 if (structMapping.TypeDesc.IsRoot)
1230 {
1231 MethodInfo method5 = typeof(XmlSerializationReader).GetMethod("ReadTypedPrimitive", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { localBuilder.LocalType });
1232 ilg.Ldarg(0);
1234 ilg.Call(method5);
1237 }
1238 else
1239 {
1240 MethodInfo method6 = typeof(XmlSerializationReader).GetMethod("CreateUnknownTypeException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(XmlQualifiedName) });
1241 ilg.Ldarg(0);
1243 ilg.Call(method6);
1244 ilg.Throw();
1245 }
1246 ilg.EndIf();
1247 ilg.EndIf();
1248 if (structMapping.TypeDesc.IsNullable)
1249 {
1250 ilg.Ldloc(typeof(bool), "isNull");
1251 ilg.If();
1252 ilg.Load(null);
1255 ilg.EndIf();
1256 }
1257 if (structMapping.TypeDesc.IsAbstract)
1258 {
1259 MethodInfo method7 = typeof(XmlSerializationReader).GetMethod("CreateAbstractTypeException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
1260 {
1261 typeof(string),
1262 typeof(string)
1263 });
1264 ilg.Ldarg(0);
1267 ilg.Call(method7);
1268 ilg.Throw();
1269 }
1270 else
1271 {
1272 if (structMapping.TypeDesc.Type != null && typeof(XmlSchemaObject).IsAssignableFrom(structMapping.TypeDesc.Type))
1273 {
1274 MethodInfo method8 = typeof(XmlSerializationReader).GetMethod("set_DecodeName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(bool) });
1275 ilg.Ldarg(0);
1276 ilg.Ldc(boolVar: false);
1277 ilg.Call(method8);
1278 }
1282 Member member = null;
1283 Member member2 = null;
1284 Member member3 = null;
1285 bool flag = structMapping.HasExplicitSequence();
1289 for (int i = 0; i < settableMembers.Length; i++)
1290 {
1293 string stringForMember = base.RaCodeGen.GetStringForMember("o", memberMapping.Name, structMapping.TypeDesc);
1295 if (!memberMapping.IsSequence)
1296 {
1297 member4.ParamsReadSource = $"paramsRead[{i}]";
1298 }
1299 member4.IsNullable = memberMapping.TypeDesc.IsNullable;
1300 if (memberMapping.CheckSpecified == SpecifiedAccessor.ReadWrite)
1301 {
1302 member4.CheckSpecifiedSource = base.RaCodeGen.GetStringForMember("o", memberMapping.Name + "Specified", structMapping.TypeDesc);
1303 }
1304 if (memberMapping.Text != null)
1305 {
1306 member = member4;
1307 }
1308 if (memberMapping.Attribute != null && memberMapping.Attribute.Any)
1309 {
1310 member3 = member4;
1311 }
1312 if (!flag)
1313 {
1314 for (int j = 0; j < memberMapping.Elements.Length; j++)
1315 {
1316 if (memberMapping.Elements[j].Any && (memberMapping.Elements[j].Name == null || memberMapping.Elements[j].Name.Length == 0))
1317 {
1318 member2 = member4;
1319 break;
1320 }
1321 }
1322 }
1323 else if (memberMapping.IsParticle && !memberMapping.IsSequence)
1324 {
1325 structMapping.FindDeclaringMapping(memberMapping, out var declaringMapping, structMapping.TypeName);
1326 throw new InvalidOperationException(System.SR.Format(System.SR.XmlSequenceHierarchy, structMapping.TypeDesc.FullName, memberMapping.Name, declaringMapping.TypeDesc.FullName, "Order"));
1327 }
1328 if (memberMapping.Attribute == null && memberMapping.Elements.Length == 1 && memberMapping.Elements[0].Mapping is ArrayMapping)
1329 {
1331 member5.CheckSpecifiedSource = member4.CheckSpecifiedSource;
1332 list5.Add(member5);
1333 }
1334 else
1335 {
1336 list5.Add(member4);
1337 }
1338 if (!memberMapping.TypeDesc.IsArrayLike)
1339 {
1340 continue;
1341 }
1342 list3.Add(member4);
1343 if (memberMapping.TypeDesc.IsArrayLike && (memberMapping.Elements.Length != 1 || !(memberMapping.Elements[0].Mapping is ArrayMapping)))
1344 {
1346 if (member4 != member && member4 != member2)
1347 {
1348 list4.Add(member4);
1349 }
1350 }
1351 else if (!memberMapping.TypeDesc.IsArray)
1352 {
1354 }
1355 }
1356 if (member2 != null)
1357 {
1358 list4.Add(member2);
1359 }
1360 if (member != null && member != member2)
1361 {
1362 list4.Add(member);
1363 }
1364 Member[] members = list3.ToArray();
1365 Member[] members2 = list4.ToArray();
1366 Member[] members3 = list5.ToArray();
1369 WriteAttributes(members3, member3, "UnknownNode", local);
1370 if (member3 != null)
1371 {
1373 }
1374 MethodInfo method9 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1375 MethodInfo method10 = typeof(XmlReader).GetMethod("MoveToElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1376 ilg.Ldarg(0);
1377 ilg.Call(method9);
1378 ilg.Call(method10);
1379 ilg.Pop();
1380 MethodInfo method11 = typeof(XmlReader).GetMethod("get_IsEmptyElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1381 ilg.Ldarg(0);
1382 ilg.Call(method9);
1383 ilg.Call(method11);
1384 ilg.If();
1385 MethodInfo method12 = typeof(XmlReader).GetMethod("Skip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1386 ilg.Ldarg(0);
1387 ilg.Call(method9);
1388 ilg.Call(method12);
1390 ilg.Ldloc(local);
1393 ilg.EndIf();
1394 MethodInfo method13 = typeof(XmlReader).GetMethod("ReadStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1395 ilg.Ldarg(0);
1396 ilg.Call(method9);
1397 ilg.Call(method13);
1398 if (IsSequence(members3))
1399 {
1400 ilg.Ldc(0);
1401 ilg.Stloc(typeof(int), "state");
1402 }
1404 string text = "UnknownNode((object)o, " + ExpectedElements(members3) + ");";
1406 MethodInfo method14 = typeof(XmlReader).GetMethod("MoveToContent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1407 ilg.Ldarg(0);
1408 ilg.Call(method9);
1409 ilg.Call(method14);
1410 ilg.Pop();
1413 MethodInfo method15 = typeof(XmlSerializationReader).GetMethod("ReadEndElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1414 ilg.Ldarg(0);
1415 ilg.Call(method15);
1416 ilg.Ldloc(structMapping.TypeDesc.Type, "o");
1418 }
1421 ilg.EndMethod();
1422 }
1423
1424 [RequiresUnreferencedCode("calls LoadMember")]
1425 private void WriteQNameEqual(string source, string name, string ns)
1426 {
1427 WriteID(name);
1428 WriteID(ns);
1429 MethodInfo method = typeof(XmlQualifiedName).GetMethod("get_Name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1430 MethodInfo method2 = typeof(XmlQualifiedName).GetMethod("get_Namespace", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1434 ilg.Ldloc(local);
1435 ilg.Call(method);
1436 ilg.Ldarg(0);
1438 ilg.Bne(label2);
1439 ilg.Ldloc(local);
1440 ilg.Call(method2);
1441 ilg.Ldarg(0);
1442 ilg.LoadMember(_idNameFields[ns ?? string.Empty]);
1443 ilg.Ceq();
1444 ilg.Br_S(label);
1446 ilg.Ldc(boolVar: false);
1448 }
1449
1450 [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")]
1451 private void WriteXmlNodeEqual(string source, string name, string ns)
1452 {
1453 WriteXmlNodeEqual(source, name, ns, doAndIf: true);
1454 }
1455
1456 [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")]
1457 private void WriteXmlNodeEqual(string source, string name, string ns, bool doAndIf)
1458 {
1459 bool flag = string.IsNullOrEmpty(name);
1460 if (!flag)
1461 {
1462 WriteID(name);
1463 }
1464 WriteID(ns);
1465 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_" + source, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1466 MethodInfo method2 = typeof(XmlReader).GetMethod("get_LocalName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1467 MethodInfo method3 = typeof(XmlReader).GetMethod("get_NamespaceURI", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1470 if (!flag)
1471 {
1472 ilg.Ldarg(0);
1473 ilg.Call(method);
1474 ilg.Call(method2);
1475 ilg.Ldarg(0);
1477 ilg.Bne(label);
1478 }
1479 ilg.Ldarg(0);
1480 ilg.Call(method);
1481 ilg.Call(method3);
1482 ilg.Ldarg(0);
1483 ilg.LoadMember(_idNameFields[ns ?? string.Empty]);
1484 ilg.Ceq();
1485 if (!flag)
1486 {
1487 ilg.Br_S(label2);
1489 ilg.Ldc(boolVar: false);
1491 }
1492 if (doAndIf)
1493 {
1494 ilg.AndIf();
1495 }
1496 }
1497
1498 private void WriteID(string name)
1499 {
1500 if (name == null)
1501 {
1502 name = "";
1503 }
1505 {
1509 }
1510 }
1511
1512 [RequiresUnreferencedCode("calls WriteSourceEnd")]
1514 {
1515 int num = 0;
1516 Member member = null;
1518 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1519 MethodInfo method2 = typeof(XmlReader).GetMethod("MoveToNextAttribute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1520 ilg.WhileBegin();
1521 foreach (Member member2 in members)
1522 {
1523 if (member2.Mapping.Xmlns != null)
1524 {
1525 member = member2;
1526 }
1527 else
1528 {
1529 if (member2.Mapping.Ignore)
1530 {
1531 continue;
1532 }
1533 AttributeAccessor attribute = member2.Mapping.Attribute;
1534 if (attribute != null && !attribute.Any)
1535 {
1537 if (num++ > 0)
1538 {
1539 ilg.InitElseIf();
1540 }
1541 else
1542 {
1543 ilg.InitIf();
1544 }
1545 if (member2.ParamsReadSource != null)
1546 {
1547 ILGenParamsReadSource(member2.ParamsReadSource);
1548 ilg.Ldc(boolVar: false);
1549 ilg.AndIf(Cmp.EqualTo);
1550 }
1551 if (attribute.IsSpecialXmlNamespace)
1552 {
1553 WriteXmlNodeEqual("Reader", attribute.Name, "http://www.w3.org/XML/1998/namespace");
1554 }
1555 else
1556 {
1557 WriteXmlNodeEqual("Reader", attribute.Name, (attribute.Form == XmlSchemaForm.Qualified) ? attribute.Namespace : "");
1558 }
1560 }
1561 }
1562 }
1563 if (num > 0)
1564 {
1565 ilg.InitElseIf();
1566 }
1567 else
1568 {
1569 ilg.InitIf();
1570 }
1571 if (member != null)
1572 {
1573 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("IsXmlnsAttribute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1574 MethodInfo method4 = typeof(XmlReader).GetMethod("get_Name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1575 MethodInfo method5 = typeof(XmlReader).GetMethod("get_LocalName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1576 MethodInfo method6 = typeof(XmlReader).GetMethod("get_Value", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1577 ilg.Ldarg(0);
1578 ilg.Ldarg(0);
1579 ilg.Call(method);
1580 ilg.Call(method4);
1581 ilg.Call(method3);
1582 ilg.Ldc(boolVar: true);
1583 ilg.AndIf(Cmp.EqualTo);
1584 ILGenLoad(member.Source);
1585 ilg.Load(null);
1586 ilg.If(Cmp.EqualTo);
1587 WriteSourceBegin(member.Source);
1588 ConstructorInfo constructor = member.Mapping.TypeDesc.Type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1590 WriteSourceEnd(member.Source, member.Mapping.TypeDesc.Type);
1591 ilg.EndIf();
1594 MethodInfo method7 = member.Mapping.TypeDesc.Type.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
1595 {
1596 typeof(string),
1597 typeof(string)
1598 });
1599 MethodInfo method8 = typeof(string).GetMethod("get_Length", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1600 ILGenLoad(member.ArraySource, member.Mapping.TypeDesc.Type);
1601 ilg.Ldarg(0);
1602 ilg.Call(method);
1603 ilg.Call(method4);
1604 ilg.Call(method8);
1605 ilg.Ldc(5);
1606 ilg.Beq(label);
1607 ilg.Ldarg(0);
1608 ilg.Call(method);
1609 ilg.Call(method5);
1610 ilg.Br(label2);
1612 ilg.Ldstr(string.Empty);
1614 ilg.Ldarg(0);
1615 ilg.Call(method);
1616 ilg.Call(method6);
1617 ilg.Call(method7);
1618 ilg.Else();
1619 }
1620 else
1621 {
1622 MethodInfo method9 = typeof(XmlSerializationReader).GetMethod("IsXmlnsAttribute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1623 MethodInfo method10 = typeof(XmlReader).GetMethod("get_Name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1624 ilg.Ldarg(0);
1625 ilg.Ldarg(0);
1626 ilg.Call(method);
1627 ilg.Call(method10);
1628 ilg.Call(method9);
1629 ilg.Ldc(boolVar: false);
1630 ilg.AndIf(Cmp.EqualTo);
1631 }
1632 if (anyAttribute != null)
1633 {
1635 MethodInfo method11 = typeof(XmlSerializationReader).GetMethod("get_Document", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1636 MethodInfo method12 = typeof(XmlDocument).GetMethod("ReadNode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(XmlReader) });
1637 ilg.Ldarg(0);
1638 ilg.Call(method11);
1639 ilg.Ldarg(0);
1640 ilg.Call(method);
1641 ilg.Call(method12);
1642 ilg.ConvertValue(method12.ReturnType, localBuilder.LocalType);
1644 MethodInfo method13 = typeof(XmlSerializationReader).GetMethod("ParseWsdlArrayType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { localBuilder.LocalType });
1645 ilg.Ldarg(0);
1647 ilg.Call(method13);
1649 }
1650 else
1651 {
1652 List<Type> list2 = new List<Type>();
1653 ilg.Ldarg(0);
1654 list2.Add(typeof(object));
1656 ilg.ConvertValue(firstParam.LocalType, typeof(object));
1657 if (list.Count > 0)
1658 {
1659 string text = "";
1660 for (int j = 0; j < list.Count; j++)
1661 {
1663 if (j > 0)
1664 {
1665 text += ", ";
1666 }
1667 text += (attributeAccessor.IsSpecialXmlNamespace ? "http://www.w3.org/XML/1998/namespace" : (((attributeAccessor.Form == XmlSchemaForm.Qualified) ? attributeAccessor.Namespace : "") + ":" + attributeAccessor.Name));
1668 }
1669 list2.Add(typeof(string));
1670 ilg.Ldstr(text);
1671 }
1672 MethodInfo method14 = typeof(XmlSerializationReader).GetMethod(elseCall, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, list2.ToArray());
1673 ilg.Call(method14);
1674 }
1675 ilg.EndIf();
1677 ilg.Ldarg(0);
1678 ilg.Call(method);
1679 ilg.Call(method2);
1681 ilg.WhileEnd();
1682 }
1683
1684 [RequiresUnreferencedCode("calls WriteSourceEnd")]
1685 private void WriteAttribute(Member member)
1686 {
1688 if (attribute.Mapping is SpecialMapping)
1689 {
1691 if (specialMapping.TypeDesc.Kind == TypeKind.Attribute)
1692 {
1694 ilg.Ldloc("attr");
1696 }
1697 else
1698 {
1699 if (!specialMapping.TypeDesc.CanBeAttributeValue)
1700 {
1702 }
1703 LocalBuilder local = ilg.GetLocal("attr");
1704 ilg.Ldloc(local);
1705 if (local.LocalType == typeof(XmlAttribute))
1706 {
1707 ilg.Load(null);
1708 ilg.Cne();
1709 }
1710 else
1711 {
1713 }
1714 ilg.If();
1716 ilg.Ldloc(local);
1719 ilg.EndIf();
1720 }
1721 }
1722 else if (attribute.IsList)
1723 {
1724 LocalBuilder localBuilder = ilg.DeclareOrGetLocal(typeof(string), "listValues");
1726 MethodInfo method = typeof(string).GetMethod("Split", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(char[]) });
1727 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1728 MethodInfo method3 = typeof(XmlReader).GetMethod("get_Value", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1729 ilg.Ldarg(0);
1730 ilg.Call(method2);
1731 ilg.Call(method3);
1734 ilg.Load(null);
1735 ilg.Call(method);
1739 string arraySource = GetArraySource(member.Mapping.TypeDesc, member.ArrayName);
1741 WritePrimitive(attribute.Mapping, "vals[i]");
1743 ilg.EndFor();
1744 }
1745 else
1746 {
1748 WritePrimitive(attribute.Mapping, attribute.IsList ? "vals[i]" : "Reader.Value");
1750 }
1751 if (member.Mapping.CheckSpecified == SpecifiedAccessor.ReadWrite && member.CheckSpecifiedSource != null && member.CheckSpecifiedSource.Length > 0)
1752 {
1753 ILGenSet(member.CheckSpecifiedSource, true);
1754 }
1755 if (member.ParamsReadSource != null)
1756 {
1758 }
1759 }
1760
1761 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
1763 {
1764 foreach (Member member in members)
1765 {
1766 if (!member.IsArrayLike)
1767 {
1768 continue;
1769 }
1770 string arrayName = member.ArrayName;
1771 string name = "c" + arrayName;
1773 if (member.Mapping.TypeDesc.IsArray)
1774 {
1775 WriteArrayLocalDecl(typeDesc.CSharpName, arrayName, "null", typeDesc);
1776 ilg.Ldc(0);
1777 ilg.Stloc(typeof(int), name);
1778 if (member.Mapping.ChoiceIdentifier != null)
1779 {
1781 ilg.Ldc(0);
1782 ilg.Stloc(typeof(int), "c" + member.ChoiceArrayName);
1783 }
1784 continue;
1785 }
1786 if (member.Source[member.Source.Length - 1] == '(' || member.Source[member.Source.Length - 1] == '{')
1787 {
1789 WriteSourceBegin(member.Source);
1791 WriteSourceEnd(member.Source, typeDesc.Type);
1792 continue;
1793 }
1794 if (member.IsList && !member.Mapping.ReadOnly && member.Mapping.TypeDesc.IsNullable)
1795 {
1796 ILGenLoad(member.Source, typeof(object));
1797 ilg.Load(null);
1798 ilg.If(Cmp.EqualTo);
1800 {
1801 MethodInfo method = typeof(XmlSerializationReader).GetMethod("CreateReadOnlyCollectionException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1802 ilg.Ldarg(0);
1804 ilg.Call(method);
1805 ilg.Throw();
1806 }
1807 else
1808 {
1809 WriteSourceBegin(member.Source);
1810 base.RaCodeGen.ILGenForCreateInstance(ilg, member.Mapping.TypeDesc.Type, typeDesc.CannotNew, cast: true);
1811 WriteSourceEnd(member.Source, member.Mapping.TypeDesc.Type);
1812 }
1813 ilg.EndIf();
1814 }
1815 WriteLocalDecl(arrayName, new SourceInfo(member.Source, member.Source, member.Mapping.MemberInfo, member.Mapping.TypeDesc.Type, ilg));
1816 }
1817 }
1818
1820 {
1821 if (IsSequence(members))
1822 {
1823 return "null";
1824 }
1825 string text = string.Empty;
1826 bool flag = true;
1827 foreach (Member member in members)
1828 {
1829 if (member.Mapping.Xmlns != null || member.Mapping.Ignore || member.Mapping.IsText || member.Mapping.IsAttribute)
1830 {
1831 continue;
1832 }
1833 ElementAccessor[] elements = member.Mapping.Elements;
1834 foreach (ElementAccessor elementAccessor in elements)
1835 {
1836 string text2 = ((elementAccessor.Form == XmlSchemaForm.Qualified) ? elementAccessor.Namespace : "");
1837 if (!elementAccessor.Any || (elementAccessor.Name != null && elementAccessor.Name.Length != 0))
1838 {
1839 if (!flag)
1840 {
1841 text += ", ";
1842 }
1843 text = text + text2 + ":" + elementAccessor.Name;
1844 flag = false;
1845 }
1846 }
1847 }
1849 }
1850
1851 [RequiresUnreferencedCode("calls WriteMemberElementsIf")]
1853 {
1854 if (anyText != null)
1855 {
1856 ilg.Load(null);
1857 ilg.Stloc(typeof(string), "tmp");
1858 }
1859 MethodInfo method = typeof(XmlReader).GetMethod("get_NodeType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1860 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1861 int intVar = 1;
1862 ilg.Ldarg(0);
1863 ilg.Call(method2);
1864 ilg.Call(method);
1865 ilg.Ldc(intVar);
1866 ilg.If(Cmp.EqualTo);
1868 if (anyText != null)
1869 {
1871 }
1872 ilg.Else();
1874 ilg.EndIf();
1875 }
1876
1877 [RequiresUnreferencedCode("calls WriteText")]
1879 {
1880 ilg.InitElseIf();
1883 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1884 MethodInfo method2 = typeof(XmlReader).GetMethod("get_NodeType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1885 ilg.Ldarg(0);
1886 ilg.Call(method);
1887 ilg.Call(method2);
1888 ilg.Ldc(XmlNodeType.Text);
1889 ilg.Ceq();
1890 ilg.Brtrue(label);
1891 ilg.Ldarg(0);
1892 ilg.Call(method);
1893 ilg.Call(method2);
1894 ilg.Ldc(XmlNodeType.CDATA);
1895 ilg.Ceq();
1896 ilg.Brtrue(label);
1897 ilg.Ldarg(0);
1898 ilg.Call(method);
1899 ilg.Call(method2);
1900 ilg.Ldc(XmlNodeType.Whitespace);
1901 ilg.Ceq();
1902 ilg.Brtrue(label);
1903 ilg.Ldarg(0);
1904 ilg.Call(method);
1905 ilg.Call(method2);
1906 ilg.Ldc(XmlNodeType.SignificantWhitespace);
1907 ilg.Ceq();
1908 ilg.Br(label2);
1910 ilg.Ldc(boolVar: true);
1912 ilg.AndIf();
1913 if (anyText != null)
1914 {
1916 }
1917 }
1918
1919 [RequiresUnreferencedCode("calls WriteSourceEnd")]
1920 private void WriteText(Member member)
1921 {
1922 TextAccessor text = member.Mapping.Text;
1923 if (text.Mapping is SpecialMapping)
1924 {
1927 TypeKind kind = specialMapping.TypeDesc.Kind;
1928 if (kind == TypeKind.Node)
1929 {
1930 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1931 MethodInfo method2 = typeof(XmlReader).GetMethod("ReadContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1932 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("get_Document", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1933 MethodInfo method4 = typeof(XmlDocument).GetMethod("CreateTextNode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1934 ilg.Ldarg(0);
1935 ilg.Call(method3);
1936 ilg.Ldarg(0);
1937 ilg.Call(method);
1938 ilg.Call(method2);
1939 ilg.Call(method4);
1940 WriteSourceEnd(member.ArraySource, specialMapping.TypeDesc.Type);
1941 return;
1942 }
1944 }
1945 if (member.IsArrayLike)
1946 {
1948 if (text.Mapping.TypeDesc.CollapseWhitespace)
1949 {
1950 ilg.Ldarg(0);
1951 }
1952 MethodInfo method5 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1953 MethodInfo method6 = typeof(XmlReader).GetMethod("ReadContentAsString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1954 ilg.Ldarg(0);
1955 ilg.Call(method5);
1956 ilg.Call(method6);
1957 if (text.Mapping.TypeDesc.CollapseWhitespace)
1958 {
1959 MethodInfo method7 = typeof(XmlSerializationReader).GetMethod("CollapseWhitespace", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1960 ilg.Call(method7);
1961 }
1962 }
1963 else if (text.Mapping.TypeDesc == base.StringTypeDesc || text.Mapping.TypeDesc.FormatterName == "String")
1964 {
1965 LocalBuilder local = ilg.GetLocal("tmp");
1966 MethodInfo method8 = typeof(XmlSerializationReader).GetMethod("ReadString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
1967 {
1968 typeof(string),
1969 typeof(bool)
1970 });
1971 ilg.Ldarg(0);
1972 ilg.Ldloc(local);
1973 ilg.Ldc(text.Mapping.TypeDesc.CollapseWhitespace);
1974 ilg.Call(method8);
1975 ilg.Stloc(local);
1977 ilg.Ldloc(local);
1978 }
1979 else
1980 {
1982 WritePrimitive(text.Mapping, "Reader.ReadString()");
1983 }
1984 WriteSourceEnd(member.ArraySource, text.Mapping.TypeDesc.Type);
1985 }
1986
1987 [RequiresUnreferencedCode("calls WriteElement")]
1989 {
1990 if (anyElement != null)
1991 {
1992 ElementAccessor[] elements = anyElement.Mapping.Elements;
1993 for (int i = 0; i < elements.Length; i++)
1994 {
1995 ElementAccessor elementAccessor = elements[i];
1996 if (elementAccessor.Any && elementAccessor.Name.Length == 0)
1997 {
1998 WriteElement(anyElement.ArraySource, anyElement.ArrayName, anyElement.ChoiceArraySource, elementAccessor, anyElement.Mapping.ChoiceIdentifier, (anyElement.Mapping.CheckSpecified == SpecifiedAccessor.ReadWrite) ? anyElement.CheckSpecifiedSource : null, checkForNull: false, readOnly: false, -1, i);
1999 break;
2000 }
2001 }
2002 }
2003 else
2004 {
2006 }
2007 }
2008
2009 private bool IsSequence(Member[] members)
2010 {
2011 for (int i = 0; i < members.Length; i++)
2012 {
2013 if (members[i].Mapping.IsParticle && members[i].Mapping.IsSequence)
2014 {
2015 return true;
2016 }
2017 }
2018 return false;
2019 }
2020
2021 [RequiresUnreferencedCode("calls WriteElement")]
2023 {
2024 int num = 0;
2025 bool flag = IsSequence(members);
2026 int num2 = 0;
2027 foreach (Member member in members)
2028 {
2029 if (member.Mapping.Xmlns != null || member.Mapping.Ignore || (flag && (member.Mapping.IsText || member.Mapping.IsAttribute)))
2030 {
2031 continue;
2032 }
2033 bool flag2 = true;
2035 ElementAccessor[] elements = member.Mapping.Elements;
2036 for (int j = 0; j < elements.Length; j++)
2037 {
2038 ElementAccessor elementAccessor = elements[j];
2039 string ns = ((elementAccessor.Form == XmlSchemaForm.Qualified) ? elementAccessor.Namespace : "");
2040 if (!flag && elementAccessor.Any && (elementAccessor.Name == null || elementAccessor.Name.Length == 0))
2041 {
2042 continue;
2043 }
2044 if (!flag2 || (!flag && num > 0))
2045 {
2046 ilg.InitElseIf();
2047 }
2048 else if (flag)
2049 {
2050 if (num2 > 0)
2051 {
2052 ilg.InitElseIf();
2053 }
2054 else
2055 {
2056 ilg.InitIf();
2057 }
2058 ilg.Ldloc("state");
2059 ilg.Ldc(num2);
2060 ilg.AndIf(Cmp.EqualTo);
2061 ilg.InitIf();
2062 }
2063 else
2064 {
2065 ilg.InitIf();
2066 }
2067 num++;
2068 flag2 = false;
2069 if (member.ParamsReadSource != null)
2070 {
2072 ilg.Ldc(boolVar: false);
2073 ilg.AndIf(Cmp.EqualTo);
2074 }
2077 if (member.Mapping.IsReturnValue)
2078 {
2079 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_IsReturnValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2080 ilg.Ldarg(0);
2081 ilg.Call(method);
2082 ilg.Brtrue(label);
2083 }
2084 if (flag && elementAccessor.Any && elementAccessor.AnyNamespaces == null)
2085 {
2086 ilg.Ldc(boolVar: true);
2087 }
2088 else
2089 {
2090 WriteXmlNodeEqual("Reader", elementAccessor.Name, ns, doAndIf: false);
2091 }
2092 if (member.Mapping.IsReturnValue)
2093 {
2094 ilg.Br_S(label2);
2096 ilg.Ldc(boolVar: true);
2098 }
2099 ilg.AndIf();
2101 if (member.Mapping.IsReturnValue)
2102 {
2103 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("set_IsReturnValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(bool) });
2104 ilg.Ldarg(0);
2105 ilg.Ldc(boolVar: false);
2106 ilg.Call(method2);
2107 }
2108 if (member.ParamsReadSource != null)
2109 {
2111 }
2112 }
2113 if (flag)
2114 {
2115 if (member.IsArrayLike)
2116 {
2117 ilg.Else();
2118 }
2119 else
2120 {
2121 ilg.EndIf();
2122 }
2123 num2++;
2124 ilg.Ldc(num2);
2125 ilg.Stloc(ilg.GetLocal("state"));
2126 if (member.IsArrayLike)
2127 {
2128 ilg.EndIf();
2129 }
2130 }
2131 }
2132 if (num > 0)
2133 {
2134 ilg.Else();
2135 }
2137 if (num > 0)
2138 {
2139 ilg.EndIf();
2140 }
2141 }
2142
2144 {
2145 return GetArraySource(typeDesc, arrayName, multiRef: false);
2146 }
2147
2148 private string GetArraySource(TypeDesc typeDesc, string arrayName, bool multiRef)
2149 {
2150 string text = "c" + arrayName;
2151 string text2 = "";
2152 if (multiRef)
2153 {
2154 text2 = "soap = (System.Object[])EnsureArrayIndex(soap, " + text + "+2, typeof(System.Object)); ";
2155 }
2156 if (typeDesc.IsArray)
2157 {
2158 string cSharpName = typeDesc.ArrayElementTypeDesc.CSharpName;
2159 string text3 = "(" + cSharpName + "[])";
2160 text2 = text2 + arrayName + " = " + text3 + "EnsureArrayIndex(" + arrayName + ", " + text + ", " + base.RaCodeGen.GetStringForTypeof(cSharpName) + ");";
2161 string stringForArrayMember = base.RaCodeGen.GetStringForArrayMember(arrayName, text + "++", typeDesc);
2162 if (multiRef)
2163 {
2164 text2 = text2 + " soap[1] = " + arrayName + ";";
2165 text2 = text2 + " if (ReadReference(out soap[" + text + "+2])) " + stringForArrayMember + " = null; else ";
2166 }
2167 return text2 + stringForArrayMember;
2168 }
2169 return base.RaCodeGen.GetStringForMethod(arrayName, typeDesc.CSharpName, "Add");
2170 }
2171
2172 [RequiresUnreferencedCode("calls WriteMemberEnd")]
2174 {
2176 }
2177
2178 [RequiresUnreferencedCode("calls WriteSourceEnd")]
2180 {
2181 foreach (Member member in members)
2182 {
2183 if (!member.IsArrayLike)
2184 {
2185 continue;
2186 }
2188 if (typeDesc.IsArray)
2189 {
2190 WriteSourceBegin(member.Source);
2191 string arrayName = member.ArrayName;
2192 string name = "c" + arrayName;
2193 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ShrinkArray", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[4]
2194 {
2195 typeof(Array),
2196 typeof(int),
2197 typeof(Type),
2198 typeof(bool)
2199 });
2200 ilg.Ldarg(0);
2203 ilg.Ldc(typeDesc.ArrayElementTypeDesc.Type);
2204 ilg.Ldc(member.IsNullable);
2205 ilg.Call(method);
2206 ilg.ConvertValue(method.ReturnType, typeDesc.Type);
2207 WriteSourceEnd(member.Source, typeDesc.Type);
2208 if (member.Mapping.ChoiceIdentifier != null)
2209 {
2211 arrayName = member.ChoiceArrayName;
2212 name = "c" + arrayName;
2213 ilg.Ldarg(0);
2217 ilg.Ldc(member.IsNullable);
2218 ilg.Call(method);
2221 }
2222 }
2223 else if (typeDesc.IsValueType)
2224 {
2226 WriteSourceBegin(member.Source);
2227 ilg.Ldloc(local);
2228 WriteSourceEnd(member.Source, local.LocalType);
2229 }
2230 }
2231 }
2232
2234 {
2236 }
2237
2238 private void WriteSourceBegin(string source)
2239 {
2241 {
2244 {
2246 }
2247 return;
2248 }
2249 if (source.StartsWith("o.@", StringComparison.Ordinal))
2250 {
2252 return;
2253 }
2254 Regex regex = XmlSerializationILGen.NewRegex("(?<locA1>[^ ]+) = .+EnsureArrayIndex[(](?<locA2>[^,]+), (?<locI1>[^,]+),[^;]+;(?<locA3>[^[]+)[[](?<locI2>[^+]+)[+][+][]]");
2255 Match match = regex.Match(source);
2256 if (match.Success)
2257 {
2258 LocalBuilder local = ilg.GetLocal(match.Groups["locA1"].Value);
2259 LocalBuilder local2 = ilg.GetLocal(match.Groups["locI1"].Value);
2260 Type elementType = local.LocalType.GetElementType();
2261 MethodInfo method = typeof(XmlSerializationReader).GetMethod("EnsureArrayIndex", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[3]
2262 {
2263 typeof(Array),
2264 typeof(int),
2265 typeof(Type)
2266 });
2267 ilg.Ldarg(0);
2268 ilg.Ldloc(local);
2269 ilg.Ldloc(local2);
2271 ilg.Call(method);
2272 ilg.Castclass(local.LocalType);
2273 ilg.Stloc(local);
2274 ilg.Ldloc(local);
2275 ilg.Ldloc(local2);
2276 ilg.Dup();
2277 ilg.Ldc(1);
2278 ilg.Add();
2279 ilg.Stloc(local2);
2281 {
2283 }
2284 }
2285 else if (source.EndsWith(".Add(", StringComparison.Ordinal))
2286 {
2287 int length = source.LastIndexOf(".Add(", StringComparison.Ordinal);
2288 LocalBuilder local3 = ilg.GetLocal(source.Substring(0, length));
2290 }
2291 else
2292 {
2293 regex = XmlSerializationILGen.NewRegex("(?<a>[^[]+)[[](?<ia>.+)[]]");
2294 match = regex.Match(source);
2295 if (!match.Success)
2296 {
2297 throw Globals.NotSupported("Unexpected: " + source);
2298 }
2299 ilg.Load(ilg.GetVariable(match.Groups["a"].Value));
2300 ilg.Load(ilg.GetVariable(match.Groups["ia"].Value));
2301 }
2302 }
2303
2304 [RequiresUnreferencedCode("calls WriteSourceEnd")]
2309
2310 [RequiresUnreferencedCode("string-based IL generation")]
2312 {
2314 {
2317 {
2318 ilg.Call(variableType.GetConstructor(variableType.GetGenericArguments()));
2319 return;
2320 }
2324 return;
2325 }
2326 if (source.StartsWith("o.@", StringComparison.Ordinal))
2327 {
2328 MemberInfo memberInfo = memberInfos[source.Substring(3)];
2331 return;
2332 }
2333 Regex regex = XmlSerializationILGen.NewRegex("(?<locA1>[^ ]+) = .+EnsureArrayIndex[(](?<locA2>[^,]+), (?<locI1>[^,]+),[^;]+;(?<locA3>[^[]+)[[](?<locI2>[^+]+)[+][+][]]");
2334 Match match = regex.Match(source);
2335 if (match.Success)
2336 {
2337 object variable2 = ilg.GetVariable(match.Groups["locA1"].Value);
2341 {
2343 }
2344 else
2345 {
2347 }
2348 }
2349 else if (source.EndsWith(".Add(", StringComparison.Ordinal))
2350 {
2351 int length = source.LastIndexOf(".Add(", StringComparison.Ordinal);
2352 LocalBuilder local = ilg.GetLocal(source.Substring(0, length));
2353 MethodInfo method = local.LocalType.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { elementType });
2354 Type parameterType = method.GetParameters()[0].ParameterType;
2356 ilg.Call(method);
2357 if (method.ReturnType != typeof(void))
2358 {
2359 ilg.Pop();
2360 }
2361 }
2362 else
2363 {
2364 regex = XmlSerializationILGen.NewRegex("(?<a>[^[]+)[[](?<ia>.+)[]]");
2365 match = regex.Match(source);
2366 if (!match.Success)
2367 {
2368 throw Globals.NotSupported("Unexpected: " + source);
2369 }
2371 Type elementType3 = variableType2.GetElementType();
2374 }
2375 }
2376
2377 [RequiresUnreferencedCode("calls WriteMemberBegin")]
2379 {
2380 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ReadNull", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2381 ilg.Ldarg(0);
2382 ilg.Call(method);
2383 ilg.IfNot();
2388 if (source.StartsWith("o.@", StringComparison.Ordinal))
2389 {
2390 memberMapping.MemberInfo = memberInfos[source.Substring(3)];
2391 }
2392 Member member = new Member(this, source, arrayName, elementIndex, memberMapping, multiRef: false);
2393 member.IsNullable = false;
2394 Member[] members = new Member[1] { member };
2395 WriteMemberBegin(members);
2396 Label label = ilg.DefineLabel();
2397 Label label2 = ilg.DefineLabel();
2398 if (readOnly)
2399 {
2400 ilg.Load(ilg.GetVariable(member.ArrayName));
2401 ilg.Load(null);
2402 ilg.Beq(label);
2403 }
2404 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2405 MethodInfo method3 = typeof(XmlReader).GetMethod("get_IsEmptyElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2406 ilg.Ldarg(0);
2407 ilg.Call(method2);
2408 ilg.Call(method3);
2409 if (readOnly)
2410 {
2411 ilg.Br_S(label2);
2412 ilg.MarkLabel(label);
2413 ilg.Ldc(boolVar: true);
2414 ilg.MarkLabel(label2);
2415 }
2416 ilg.If();
2417 MethodInfo method4 = typeof(XmlReader).GetMethod("Skip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2418 ilg.Ldarg(0);
2419 ilg.Call(method2);
2420 ilg.Call(method4);
2421 ilg.Else();
2422 MethodInfo method5 = typeof(XmlReader).GetMethod("ReadStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2423 ilg.Ldarg(0);
2424 ilg.Call(method2);
2425 ilg.Call(method5);
2426 WriteWhileNotLoopStart();
2427 string text = "UnknownNode(null, " + ExpectedElements(members) + ");";
2428 WriteMemberElements(members, text, text, null, null);
2429 MethodInfo method6 = typeof(XmlReader).GetMethod("MoveToContent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2430 ilg.Ldarg(0);
2431 ilg.Call(method2);
2432 ilg.Call(method6);
2433 ilg.Pop();
2434 WriteWhileLoopEnd();
2435 MethodInfo method7 = typeof(XmlSerializationReader).GetMethod("ReadEndElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2436 ilg.Ldarg(0);
2437 ilg.Call(method7);
2438 ilg.EndIf();
2439 WriteMemberEnd(members, soapRefs: false);
2440 if (isNullable)
2441 {
2442 ilg.Else();
2443 member.IsNullable = true;
2444 WriteMemberBegin(members);
2445 WriteMemberEnd(members);
2446 }
2447 ilg.EndIf();
2448 }
2449
2450 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
2452 {
2453 if (checkSpecified != null && checkSpecified.Length > 0)
2454 {
2455 ILGenSet(checkSpecified, true);
2456 }
2457 if (element.Mapping is ArrayMapping)
2458 {
2460 }
2461 else if (element.Mapping is NullableMapping)
2462 {
2463 string methodName = ReferenceMapping(element.Mapping);
2464 WriteSourceBegin(source);
2465 ilg.Ldarg(0);
2466 ilg.Ldc(boolVar: true);
2467 MethodBuilder methodInfo = EnsureMethodBuilder(typeBuilder, methodName, MethodAttributes.Private | MethodAttributes.HideBySig, element.Mapping.TypeDesc.Type, new Type[1] { typeof(bool) });
2468 ilg.Call(methodInfo);
2469 WriteSourceEnd(source, element.Mapping.TypeDesc.Type);
2470 }
2471 else if (element.Mapping is PrimitiveMapping)
2472 {
2473 bool flag = false;
2474 if (element.IsNullable)
2475 {
2476 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ReadNull", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2477 ilg.Ldarg(0);
2478 ilg.Call(method);
2479 ilg.If();
2480 WriteSourceBegin(source);
2481 if (element.Mapping.TypeDesc.IsValueType)
2482 {
2483 throw Globals.NotSupported("No such condition. PrimitiveMapping && IsNullable = String, XmlQualifiedName and never IsValueType");
2484 }
2485 ilg.Load(null);
2486 WriteSourceEnd(source, element.Mapping.TypeDesc.Type);
2487 ilg.Else();
2488 flag = true;
2489 }
2490 if (element.Default != null && element.Default != DBNull.Value && element.Mapping.TypeDesc.IsValueType)
2491 {
2492 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2493 MethodInfo method3 = typeof(XmlReader).GetMethod("get_IsEmptyElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2494 ilg.Ldarg(0);
2495 ilg.Call(method2);
2496 ilg.Call(method3);
2497 ilg.If();
2498 MethodInfo method4 = typeof(XmlReader).GetMethod("Skip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2499 ilg.Ldarg(0);
2500 ilg.Call(method2);
2501 ilg.Call(method4);
2502 ilg.Else();
2503 flag = true;
2504 }
2506 {
2507 MethodInfo method5 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2508 MethodInfo method6 = typeof(XmlReader).GetMethod("get_IsEmptyElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2509 ilg.Ldarg(0);
2510 ilg.Call(method5);
2511 ilg.Call(method6);
2512 ilg.If();
2513 WriteSourceBegin(source);
2514 MethodInfo method7 = typeof(XmlReader).GetMethod("Skip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2515 ilg.Ldarg(0);
2516 ilg.Call(method5);
2517 ilg.Call(method7);
2518 LocalBuilder tempLocal = ilg.GetTempLocal(element.Mapping.TypeDesc.Type);
2519 ilg.Ldloca(tempLocal);
2520 ilg.InitObj(element.Mapping.TypeDesc.Type);
2521 ilg.Ldloc(tempLocal);
2522 WriteSourceEnd(source, element.Mapping.TypeDesc.Type);
2523 ilg.Else();
2524 WriteSourceBegin(source);
2525 WritePrimitive(element.Mapping, "Reader.ReadElementString()");
2526 WriteSourceEnd(source, element.Mapping.TypeDesc.Type);
2527 ilg.EndIf();
2528 }
2529 else
2530 {
2531 WriteSourceBegin(source);
2532 if (element.Mapping.TypeDesc == base.QnameTypeDesc)
2533 {
2534 MethodInfo method8 = typeof(XmlSerializationReader).GetMethod("ReadElementQualifiedName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2535 ilg.Ldarg(0);
2536 ilg.Call(method8);
2537 }
2538 else
2539 {
2541 WritePrimitive(source: (!(formatterName == "ByteArrayBase64") && !(formatterName == "ByteArrayHex")) ? "Reader.ReadElementString()" : "false", mapping: element.Mapping);
2542 }
2543 WriteSourceEnd(source, element.Mapping.TypeDesc.Type);
2544 }
2545 if (flag)
2546 {
2547 ilg.EndIf();
2548 }
2549 }
2550 else if (element.Mapping is StructMapping)
2551 {
2552 TypeMapping mapping = element.Mapping;
2553 string methodName2 = ReferenceMapping(mapping);
2554 if (checkForNull)
2555 {
2556 MethodInfo method9 = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2557 MethodInfo method10 = typeof(XmlReader).GetMethod("Skip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2558 ilg.Ldloc(arrayName);
2559 ilg.Load(null);
2560 ilg.If(Cmp.EqualTo);
2561 ilg.Ldarg(0);
2562 ilg.Call(method9);
2563 ilg.Call(method10);
2564 ilg.Else();
2565 }
2566 WriteSourceBegin(source);
2567 List<Type> list = new List<Type>();
2568 ilg.Ldarg(0);
2569 if (mapping.TypeDesc.IsNullable)
2570 {
2571 ilg.Load(element.IsNullable);
2572 list.Add(typeof(bool));
2573 }
2574 ilg.Ldc(boolVar: true);
2575 list.Add(typeof(bool));
2576 MethodBuilder methodInfo2 = EnsureMethodBuilder(typeBuilder, methodName2, MethodAttributes.Private | MethodAttributes.HideBySig, mapping.TypeDesc.Type, list.ToArray());
2577 ilg.Call(methodInfo2);
2578 WriteSourceEnd(source, mapping.TypeDesc.Type);
2579 if (checkForNull)
2580 {
2581 ilg.EndIf();
2582 }
2583 }
2584 else
2585 {
2586 if (!(element.Mapping is SpecialMapping))
2587 {
2589 }
2591 switch (specialMapping.TypeDesc.Kind)
2592 {
2593 case TypeKind.Node:
2594 {
2596 WriteSourceBeginTyped(source, specialMapping.TypeDesc);
2597 MethodInfo method13 = typeof(XmlSerializationReader).GetMethod(flag3 ? "ReadXmlDocument" : "ReadXmlNode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(bool) });
2598 ilg.Ldarg(0);
2599 ilg.Ldc(!element.Any);
2600 ilg.Call(method13);
2601 if (specialMapping.TypeDesc != null)
2602 {
2603 ilg.Castclass(specialMapping.TypeDesc.Type);
2604 }
2605 WriteSourceEnd(source, specialMapping.TypeDesc.Type);
2606 break;
2607 }
2608 case TypeKind.Serializable:
2609 {
2611 if (serializableMapping.DerivedMappings != null)
2612 {
2613 MethodInfo method11 = typeof(XmlSerializationReader).GetMethod("GetXsiType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2614 Label label = ilg.DefineLabel();
2615 Label label2 = ilg.DefineLabel();
2616 LocalBuilder localBuilder = ilg.DeclareOrGetLocal(typeof(XmlQualifiedName), "tser");
2617 ilg.Ldarg(0);
2618 ilg.Call(method11);
2619 ilg.Stloc(localBuilder);
2620 ilg.Ldloc(localBuilder);
2621 ilg.Load(null);
2622 ilg.Ceq();
2623 ilg.Brtrue(label);
2624 WriteQNameEqual("tser", serializableMapping.XsiType.Name, serializableMapping.XsiType.Namespace);
2625 ilg.Br_S(label2);
2626 ilg.MarkLabel(label);
2627 ilg.Ldc(boolVar: true);
2628 ilg.MarkLabel(label2);
2629 ilg.If();
2630 }
2631 WriteSourceBeginTyped(source, serializableMapping.TypeDesc);
2633 MethodInfo method12 = typeof(XmlSerializationReader).GetMethod("ReadSerializable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, (!flag2) ? new Type[1] { typeof(IXmlSerializable) } : new Type[2]
2634 {
2636 typeof(bool)
2637 });
2638 ilg.Ldarg(0);
2639 base.RaCodeGen.ILGenForCreateInstance(ilg, serializableMapping.TypeDesc.Type, serializableMapping.TypeDesc.CannotNew, cast: false);
2640 if (serializableMapping.TypeDesc.CannotNew)
2641 {
2642 ilg.ConvertValue(typeof(object), typeof(IXmlSerializable));
2643 }
2644 if (flag2)
2645 {
2646 ilg.Ldc(boolVar: true);
2647 }
2648 ilg.Call(method12);
2649 if (serializableMapping.TypeDesc != null)
2650 {
2651 ilg.ConvertValue(typeof(IXmlSerializable), serializableMapping.TypeDesc.Type);
2652 }
2653 WriteSourceEnd(source, serializableMapping.TypeDesc.Type);
2654 if (serializableMapping.DerivedMappings != null)
2655 {
2656 WriteDerivedSerializable(serializableMapping, serializableMapping, source, flag2);
2657 WriteUnknownNode("UnknownNode", "null", null, anyIfs: true);
2658 }
2659 break;
2660 }
2661 default:
2663 }
2664 }
2665 if (choice != null)
2666 {
2667 WriteSourceBegin(choiceSource);
2669 base.RaCodeGen.ILGenForEnumMember(ilg, choice.Mapping.TypeDesc.Type, choice.MemberIds[elementIndex]);
2670 WriteSourceEnd(choiceSource, choice.Mapping.TypeDesc.Type);
2671 }
2672 }
2673
2674 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
2676 {
2677 if (mapping == null)
2678 {
2679 return;
2680 }
2682 {
2683 Label label = ilg.DefineLabel();
2684 Label label2 = ilg.DefineLabel();
2685 LocalBuilder local = ilg.GetLocal("tser");
2686 ilg.InitElseIf();
2687 ilg.Ldloc(local);
2688 ilg.Load(null);
2689 ilg.Ceq();
2690 ilg.Brtrue(label);
2691 WriteQNameEqual("tser", serializableMapping.XsiType.Name, serializableMapping.XsiType.Namespace);
2692 ilg.Br_S(label2);
2693 ilg.MarkLabel(label);
2694 ilg.Ldc(boolVar: true);
2695 ilg.MarkLabel(label2);
2696 ilg.AndIf();
2697 if (serializableMapping.Type != null)
2698 {
2700 {
2701 WriteSourceBeginTyped(source, head.TypeDesc);
2702 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ReadSerializable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, (!isWrappedAny) ? new Type[1] { typeof(IXmlSerializable) } : new Type[2]
2703 {
2705 typeof(bool)
2706 });
2707 ilg.Ldarg(0);
2708 base.RaCodeGen.ILGenForCreateInstance(ilg, serializableMapping.TypeDesc.Type, serializableMapping.TypeDesc.CannotNew, cast: false);
2709 if (serializableMapping.TypeDesc.CannotNew)
2710 {
2711 ilg.ConvertValue(typeof(object), typeof(IXmlSerializable));
2712 }
2713 if (isWrappedAny)
2714 {
2715 ilg.Ldc(boolVar: true);
2716 }
2717 ilg.Call(method);
2718 if (head.TypeDesc != null)
2719 {
2720 ilg.ConvertValue(typeof(IXmlSerializable), head.TypeDesc.Type);
2721 }
2722 WriteSourceEnd(source, head.TypeDesc.Type);
2723 }
2724 else
2725 {
2726 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("CreateBadDerivationException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[6]
2727 {
2728 typeof(string),
2729 typeof(string),
2730 typeof(string),
2731 typeof(string),
2732 typeof(string),
2733 typeof(string)
2734 });
2735 ilg.Ldarg(0);
2736 ilg.Ldstr(GetCSharpString(serializableMapping.XsiType.Name));
2737 ilg.Ldstr(GetCSharpString(serializableMapping.XsiType.Namespace));
2738 ilg.Ldstr(GetCSharpString(head.XsiType.Name));
2739 ilg.Ldstr(GetCSharpString(head.XsiType.Namespace));
2740 ilg.Ldstr(GetCSharpString(serializableMapping.Type.FullName));
2741 ilg.Ldstr(GetCSharpString(head.Type.FullName));
2742 ilg.Call(method2);
2743 ilg.Throw();
2744 }
2745 }
2746 else
2747 {
2748 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("CreateMissingIXmlSerializableType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[3]
2749 {
2750 typeof(string),
2751 typeof(string),
2752 typeof(string)
2753 });
2754 ilg.Ldarg(0);
2755 ilg.Ldstr(GetCSharpString(serializableMapping.XsiType.Name));
2756 ilg.Ldstr(GetCSharpString(serializableMapping.XsiType.Namespace));
2757 ilg.Ldstr(GetCSharpString(head.Type.FullName));
2758 ilg.Call(method3);
2759 ilg.Throw();
2760 }
2761 WriteDerivedSerializable(head, serializableMapping, source, isWrappedAny);
2762 }
2763 }
2764
2766 {
2767 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2768 MethodInfo method2 = typeof(XmlReader).GetMethod("MoveToContent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2769 ilg.Ldarg(0);
2770 ilg.Call(method);
2771 ilg.Call(method2);
2772 ilg.Pop();
2773 ilg.WhileBegin();
2774 }
2775
2776 private void WriteWhileLoopEnd()
2777 {
2778 ilg.WhileBeginCondition();
2779 int intVar = 0;
2780 int intVar2 = 15;
2781 MethodInfo method = typeof(XmlSerializationReader).GetMethod("get_Reader", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2782 MethodInfo method2 = typeof(XmlReader).GetMethod("get_NodeType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2783 Label label = ilg.DefineLabel();
2784 Label label2 = ilg.DefineLabel();
2785 ilg.Ldarg(0);
2786 ilg.Call(method);
2787 ilg.Call(method2);
2788 ilg.Ldc(intVar2);
2789 ilg.Beq(label);
2790 ilg.Ldarg(0);
2791 ilg.Call(method);
2792 ilg.Call(method2);
2793 ilg.Ldc(intVar);
2794 ilg.Cne();
2795 ilg.Br_S(label2);
2796 ilg.MarkLabel(label);
2797 ilg.Ldc(boolVar: false);
2798 ilg.MarkLabel(label2);
2799 ilg.WhileEndCondition();
2800 ilg.WhileEnd();
2801 }
2802
2803 private void WriteParamsRead(int length)
2804 {
2805 LocalBuilder local = ilg.DeclareLocal(typeof(bool[]), "paramsRead");
2806 ilg.NewArray(typeof(bool), length);
2807 ilg.Stloc(local);
2808 }
2809
2810 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
2812 {
2813 string cSharpName = mapping.TypeDesc.CSharpName;
2814 bool cannotNew = mapping.TypeDesc.CannotNew;
2815 LocalBuilder local2 = ilg.DeclareLocal(mapping.TypeDesc.Type, local);
2816 if (cannotNew)
2817 {
2818 ilg.BeginExceptionBlock();
2819 }
2820 base.RaCodeGen.ILGenForCreateInstance(ilg, mapping.TypeDesc.Type, mapping.TypeDesc.CannotNew, cast: true);
2821 ilg.Stloc(local2);
2822 if (cannotNew)
2823 {
2824 ilg.Leave();
2825 WriteCatchException(typeof(MissingMethodException));
2826 MethodInfo method = typeof(XmlSerializationReader).GetMethod("CreateInaccessibleConstructorException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
2827 ilg.Ldarg(0);
2828 ilg.Ldstr(GetCSharpString(cSharpName));
2829 ilg.Call(method);
2830 ilg.Throw();
2831 WriteCatchException(typeof(SecurityException));
2832 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("CreateCtorHasSecurityException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
2833 ilg.Ldarg(0);
2834 ilg.Ldstr(GetCSharpString(cSharpName));
2835 ilg.Call(method2);
2836 ilg.Throw();
2837 ilg.EndExceptionBlock();
2838 }
2839 }
2840
2842 {
2843 ilg.BeginCatchBlock(exceptionType);
2844 ilg.Pop();
2845 }
2846
2847 [RequiresUnreferencedCode("calls WriteArrayLocalDecl")]
2848 private void WriteArrayLocalDecl(string typeName, string variableName, string initValue, TypeDesc arrayTypeDesc)
2849 {
2850 base.RaCodeGen.WriteArrayLocalDecl(typeName, variableName, new SourceInfo(initValue, initValue, null, arrayTypeDesc.Type, ilg), arrayTypeDesc);
2851 }
2852
2853 [RequiresUnreferencedCode("calls WriteCreateInstance")]
2855 {
2856 base.RaCodeGen.WriteCreateInstance(source, ctorInaccessible, type, ilg);
2857 }
2858
2859 [RequiresUnreferencedCode("calls WriteLocalDecl")]
2861 {
2862 base.RaCodeGen.WriteLocalDecl(variableName, initValue);
2863 }
2864
2865 private void ILGenElseString(string elseString)
2866 {
2867 MethodInfo method = typeof(XmlSerializationReader).GetMethod("UnknownNode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(object) });
2868 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("UnknownNode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
2869 {
2870 typeof(object),
2871 typeof(string)
2872 });
2873 Regex regex = XmlSerializationILGen.NewRegex("UnknownNode[(]null, @[\"](?<qnames>[^\"]*)[\"][)];");
2874 Match match = regex.Match(elseString);
2875 if (match.Success)
2876 {
2877 ilg.Ldarg(0);
2878 ilg.Load(null);
2879 ilg.Ldstr(match.Groups["qnames"].Value);
2880 ilg.Call(method2);
2881 return;
2882 }
2883 regex = XmlSerializationILGen.NewRegex("UnknownNode[(][(]object[)](?<o>[^,]+), @[\"](?<qnames>[^\"]*)[\"][)];");
2884 match = regex.Match(elseString);
2885 if (match.Success)
2886 {
2887 ilg.Ldarg(0);
2888 LocalBuilder local = ilg.GetLocal(match.Groups["o"].Value);
2889 ilg.Ldloc(local);
2890 ilg.ConvertValue(local.LocalType, typeof(object));
2891 ilg.Ldstr(match.Groups["qnames"].Value);
2892 ilg.Call(method2);
2893 return;
2894 }
2895 regex = XmlSerializationILGen.NewRegex("UnknownNode[(][(]object[)](?<o>[^,]+), null[)];");
2896 match = regex.Match(elseString);
2897 if (match.Success)
2898 {
2899 ilg.Ldarg(0);
2900 LocalBuilder local2 = ilg.GetLocal(match.Groups["o"].Value);
2901 ilg.Ldloc(local2);
2902 ilg.ConvertValue(local2.LocalType, typeof(object));
2903 ilg.Load(null);
2904 ilg.Call(method2);
2905 return;
2906 }
2907 regex = XmlSerializationILGen.NewRegex("UnknownNode[(][(]object[)](?<o>[^)]+)[)];");
2908 match = regex.Match(elseString);
2909 if (match.Success)
2910 {
2911 ilg.Ldarg(0);
2912 LocalBuilder local3 = ilg.GetLocal(match.Groups["o"].Value);
2913 ilg.Ldloc(local3);
2914 ilg.ConvertValue(local3.LocalType, typeof(object));
2915 ilg.Call(method);
2916 return;
2917 }
2918 throw Globals.NotSupported("Unexpected: " + elseString);
2919 }
2920
2922 {
2923 Regex regex = XmlSerializationILGen.NewRegex("paramsRead\\[(?<index>[0-9]+)\\]");
2925 if (match.Success)
2926 {
2927 ilg.LoadArrayElement(ilg.GetLocal("paramsRead"), int.Parse(match.Groups["index"].Value, CultureInfo.InvariantCulture));
2928 return;
2929 }
2930 throw Globals.NotSupported("Unexpected: " + paramsReadSource);
2931 }
2932
2934 {
2935 Regex regex = XmlSerializationILGen.NewRegex("paramsRead\\[(?<index>[0-9]+)\\]");
2937 if (match.Success)
2938 {
2939 ilg.StoreArrayElement(ilg.GetLocal("paramsRead"), int.Parse(match.Groups["index"].Value, CultureInfo.InvariantCulture), value);
2940 return;
2941 }
2942 throw Globals.NotSupported("Unexpected: " + paramsReadSource);
2943 }
2944
2946 {
2947 if (elementElseString == "throw CreateUnknownNodeException();")
2948 {
2949 MethodInfo method = typeof(XmlSerializationReader).GetMethod("CreateUnknownNodeException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
2950 ilg.Ldarg(0);
2951 ilg.Call(method);
2952 ilg.Throw();
2953 }
2954 else
2955 {
2956 if (!elementElseString.StartsWith("UnknownNode(", StringComparison.Ordinal))
2957 {
2958 throw Globals.NotSupported("Unexpected: " + elementElseString);
2959 }
2960 ILGenElseString(elementElseString);
2961 }
2962 }
2963
2964 [RequiresUnreferencedCode("calls WriteSourceEnd")]
2965 private void ILGenSet(string source, object value)
2966 {
2967 WriteSourceBegin(source);
2968 ilg.Load(value);
2969 WriteSourceEnd(source, (value == null) ? typeof(object) : value.GetType());
2970 }
2971}
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void Add(TKey key, TValue value)
static readonly DBNull Value
Definition DBNull.cs:8
static Type GetUnderlyingType(Type enumType)
Definition Enum.cs:309
static object ToObject(Type enumType, object value)
Definition Enum.cs:874
static CultureInfo InvariantCulture
ConstructorBuilder DefineDefaultConstructor(MethodAttributes attributes)
static int DefineProperty(QCallModule module, int tkParent, string name, PropertyAttributes attributes, byte[] signature, int sigLength)
static int DefineField(QCallModule module, int tkParent, string name, byte[] signature, int sigLength, FieldAttributes attributes)
virtual Type AsType()
Definition TypeInfo.cs:106
static string XmlInternalError
Definition SR.cs:1812
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Arg_NeverValueType
Definition SR.cs:1816
static string XmlMissingMethodEnum
Definition SR.cs:1508
static string XmlSequenceHierarchy
Definition SR.cs:1800
Definition SR.cs:7
Type? GetElementType()
virtual bool IsAssignableFrom([NotNullWhen(true)] Type? c)
Definition Type.cs:1561
virtual Type MakeArrayType()
Definition Type.cs:1058
string? FullName
Definition Type.cs:47
static readonly Type[] EmptyTypes
Definition Type.cs:19
void Stelem(Type arrayElementType)
static bool IsNullableGenericType(Type type)
void ConvertValue(Type source, Type target)
LocalBuilder DeclareLocal(Type type, string name)
LocalBuilder DeclareOrGetLocal(Type type, string name)
void StoreMember(MemberInfo memberInfo)
void Ldelema(Type arrayElementType)
void New(ConstructorInfo constructorInfo)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes)
static TypeBuilder CreateTypeBuilder(ModuleBuilder moduleBuilder, string name, TypeAttributes attributes, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type parent, Type[] interfaces)
Type LoadMember(object obj, MemberInfo memberInfo)
void LoadArrayElement(object obj, object arrayIndex)
void Call(MethodInfo methodInfo)
void NewArray(Type elementType, object len)
void Stloc(Type type, string name)
object For(LocalBuilder local, object start, object end)
LocalBuilder GetLocal(string name)
bool TryGetVariable(string name, [NotNullWhen(true)] out object variable)
void LdlocAddress(LocalBuilder localBuilder)
void Ldloc(LocalBuilder localBuilder)
static void CheckValidIdentifier([NotNull] string ident)
static string MakeValidInternal(string identifier)
static string GetCSharpName(string name)
static Exception NotSupported(string msg)
Definition Globals.cs:5
static MemberMapping[] GetSettableMembers(StructMapping structMapping)
Definition TypeScope.cs:628
MethodBuilder EnsureMethodBuilder(TypeBuilder typeBuilder, string methodName, MethodAttributes attributes, Type returnType, Type[] parameterTypes)
static bool IsWildcard(SpecialMapping mapping)
MethodBuilderInfo GetMethodBuilder(string methodName)
Member(XmlSerializationReaderILGen outerClass, string source, string arraySource, string arrayName, int i, MemberMapping mapping, string choiceSource)
Member(XmlSerializationReaderILGen outerClass, string source, string arrayName, int i, MemberMapping mapping, string choiceSource)
Member(XmlSerializationReaderILGen outerClass, string source, string arrayName, int i, MemberMapping mapping, bool multiRef)
Member(XmlSerializationReaderILGen outerClass, string source, string arrayName, int i, MemberMapping mapping)
Member(XmlSerializationReaderILGen outerClass, string source, string arraySource, string arrayName, int i, MemberMapping mapping, bool multiRef, string choiceSource)
Member(XmlSerializationReaderILGen outerClass, string source, string arraySource, string arrayName, int i, MemberMapping mapping)
void WriteCreateInstance(string source, bool ctorInaccessible, Type type)
void WriteArrayLocalDecl(string typeName, string variableName, string initValue, TypeDesc arrayTypeDesc)
string WriteHashtable(EnumMapping mapping, string typeName, out MethodBuilder get_TableName)
void WriteAttributes(Member[] members, Member anyAttribute, string elseCall, LocalBuilder firstParam)
string GetChoiceIdentifierSource(MemberMapping mapping, string parent, TypeDesc parentTypeDesc)
string GetArraySource(TypeDesc typeDesc, string arrayName, bool multiRef)
void GenerateEnd(string[] methods, XmlMapping[] xmlMappings, Type[] types)
void WriteDerivedTypes(StructMapping mapping, bool isTypedReturn, string returnTypeName)
void WriteDerivedSerializable(SerializableMapping head, SerializableMapping mapping, string source, bool isWrappedAny)
void WriteLocalDecl(string variableName, SourceInfo initValue)
void WriteQNameEqual(string source, string name, string ns)
void WriteSourceEnd(string source, Type elementType, Type stackType)
void WriteArray(string source, string arrayName, ArrayMapping arrayMapping, bool readOnly, bool isNullable, int fixupIndex, int elementIndex)
void WriteMemberElements(Member[] members, string elementElseString, string elseString, Member anyElement, Member anyText)
void WriteXmlNodeEqual(string source, string name, string ns)
string GenerateMembersElement(XmlMembersMapping xmlMembersMapping)
void WriteUnknownNode(string func, string node, ElementAccessor e, bool anyIfs)
void InitializeValueTypes(string arrayName, MemberMapping[] mappings)
XmlSerializationReaderILGen(TypeScope[] scopes, string access, string className)
void WriteMemberElementsIf(Member[] members, Member anyElement, string elementElseString)
void WriteElement(string source, string arrayName, string choiceSource, ElementAccessor element, ChoiceIdentifierAccessor choice, string checkSpecified, bool checkForNull, bool readOnly, int fixupIndex, int elementIndex)
void ILGenParamsReadSource(string paramsReadSource, bool value)
string GetChoiceIdentifierSource(MemberMapping[] mappings, MemberMapping member)
void WriteXmlNodeEqual(string source, string name, string ns, bool doAndIf)
void WriteMemberElementsElse(Member anyElement, string elementElseString)
readonly Dictionary< string, FieldBuilder > _idNameFields
string GenerateLiteralMembersElement(XmlMembersMapping xmlMembersMapping)
string GetArraySource(TypeDesc typeDesc, string arrayName)