Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ WriteStructMethod()

void System.Xml.Serialization.XmlSerializationWriterILGen.WriteStructMethod ( StructMapping mapping)
inlineprivate

Definition at line 757 of file XmlSerializationWriterILGen.cs.

758 {
759 base.MethodNames.TryGetValue(mapping, out var value);
760 ilg = new CodeGenerator(typeBuilder);
761 List<Type> list = new List<Type>(5);
763 list.Add(typeof(string));
764 list2.Add("n");
765 list.Add(typeof(string));
766 list2.Add("ns");
767 list.Add(mapping.TypeDesc.Type);
768 list2.Add("o");
769 if (mapping.TypeDesc.IsNullable)
770 {
771 list.Add(typeof(bool));
772 list2.Add("isNullable");
773 }
774 list.Add(typeof(bool));
775 list2.Add("needType");
776 ilg.BeginMethod(typeof(void), GetMethodBuilder(value), list.ToArray(), list2.ToArray(), MethodAttributes.Private | MethodAttributes.HideBySig);
777 if (mapping.TypeDesc.IsNullable)
778 {
779 ilg.If(ilg.GetArg("o"), Cmp.EqualTo, null);
780 ilg.If(ilg.GetArg("isNullable"), Cmp.EqualTo, true);
781 MethodInfo method = typeof(XmlSerializationWriter).GetMethod("WriteNullTagLiteral", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
782 {
783 typeof(string),
784 typeof(string)
785 });
786 ilg.Ldarg(0);
787 ilg.Ldarg("n");
788 ilg.Ldarg("ns");
789 ilg.Call(method);
790 ilg.EndIf();
792 ilg.EndIf();
793 }
794 ilg.If(ilg.GetArg("needType"), Cmp.NotEqualTo, true);
796 MethodInfo method2 = typeof(object).GetMethod("GetType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
797 ArgBuilder arg = ilg.GetArg("o");
799 ilg.ConvertAddress(arg.ArgType, typeof(object));
801 ilg.Stloc(local);
802 WriteTypeCompare("t", mapping.TypeDesc.Type);
803 ilg.If();
805 if (mapping.TypeDesc.IsRoot)
806 {
808 }
809 ilg.Else();
810 if (mapping.TypeDesc.IsRoot)
811 {
812 MethodInfo method3 = typeof(XmlSerializationWriter).GetMethod("WriteTypedPrimitive", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[4]
813 {
814 typeof(string),
815 typeof(string),
816 typeof(object),
817 typeof(bool)
818 });
819 ilg.Ldarg(0);
820 ilg.Ldarg("n");
821 ilg.Ldarg("ns");
822 ilg.Ldarg("o");
826 }
827 else
828 {
829 MethodInfo method4 = typeof(XmlSerializationWriter).GetMethod("CreateUnknownTypeException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(object) });
830 ilg.Ldarg(0);
831 ilg.Ldarg(arg);
832 ilg.ConvertValue(arg.ArgType, typeof(object));
834 ilg.Throw();
835 }
836 ilg.EndIf();
837 ilg.EndIf();
838 if (!mapping.TypeDesc.IsAbstract)
839 {
840 if (mapping.TypeDesc.Type != null && typeof(XmlSchemaObject).IsAssignableFrom(mapping.TypeDesc.Type))
841 {
842 MethodInfo method5 = typeof(XmlSerializationWriter).GetMethod("set_EscapeName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(bool) });
843 ilg.Ldarg(0);
846 }
847 string text = null;
848 MemberMapping[] allMembers = TypeScope.GetAllMembers(mapping, memberInfos);
849 int num = FindXmlnsIndex(allMembers);
850 if (num >= 0)
851 {
852 MemberMapping memberMapping = allMembers[num];
853 CodeIdentifier.CheckValidIdentifier(memberMapping.Name);
854 text = base.RaCodeGen.GetStringForMember("o", memberMapping.Name, mapping.TypeDesc);
855 }
856 ilg.Ldarg(0);
857 ilg.Ldarg("n");
858 ilg.Ldarg("ns");
859 ArgBuilder arg2 = ilg.GetArg("o");
860 ilg.Ldarg(arg2);
861 ilg.ConvertValue(arg2.ArgType, typeof(object));
863 if (text == null)
864 {
865 ilg.Load(null);
866 }
867 else
868 {
870 }
871 MethodInfo method6 = typeof(XmlSerializationWriter).GetMethod("WriteStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[5]
872 {
873 typeof(string),
874 typeof(string),
875 typeof(object),
876 typeof(bool),
877 typeof(XmlSerializerNamespaces)
878 });
880 if (!mapping.TypeDesc.IsRoot)
881 {
882 ilg.If(ilg.GetArg("needType"), Cmp.EqualTo, true);
883 MethodInfo method7 = typeof(XmlSerializationWriter).GetMethod("WriteXsiType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
884 {
885 typeof(string),
886 typeof(string)
887 });
888 ilg.Ldarg(0);
889 ilg.Ldstr(GetCSharpString(mapping.TypeName));
890 ilg.Ldstr(GetCSharpString(mapping.Namespace));
892 ilg.EndIf();
893 }
894 foreach (MemberMapping memberMapping2 in allMembers)
895 {
896 if (memberMapping2.Attribute != null)
897 {
898 CodeIdentifier.CheckValidIdentifier(memberMapping2.Name);
899 if (memberMapping2.CheckShouldPersist)
900 {
902 ilg.Call(memberMapping2.CheckShouldPersistMethodInfo);
903 ilg.If();
904 }
905 if (memberMapping2.CheckSpecified != 0)
906 {
907 string stringForMember = base.RaCodeGen.GetStringForMember("o", memberMapping2.Name + "Specified", mapping.TypeDesc);
909 ilg.If();
910 }
911 WriteMember(base.RaCodeGen.GetSourceForMember("o", memberMapping2, mapping.TypeDesc, ilg), memberMapping2.Attribute, memberMapping2.TypeDesc, "o");
912 if (memberMapping2.CheckSpecified != 0)
913 {
914 ilg.EndIf();
915 }
916 if (memberMapping2.CheckShouldPersist)
917 {
918 ilg.EndIf();
919 }
920 }
921 }
922 foreach (MemberMapping memberMapping3 in allMembers)
923 {
924 if (memberMapping3.Xmlns == null)
925 {
926 CodeIdentifier.CheckValidIdentifier(memberMapping3.Name);
928 if (flag)
929 {
931 ilg.Call(memberMapping3.CheckShouldPersistMethodInfo);
932 ilg.If();
933 }
934 if (memberMapping3.CheckSpecified != 0)
935 {
936 string stringForMember2 = base.RaCodeGen.GetStringForMember("o", memberMapping3.Name + "Specified", mapping.TypeDesc);
938 ilg.If();
939 }
940 string choiceSource = null;
941 if (memberMapping3.ChoiceIdentifier != null)
942 {
943 CodeIdentifier.CheckValidIdentifier(memberMapping3.ChoiceIdentifier.MemberName);
944 choiceSource = base.RaCodeGen.GetStringForMember("o", memberMapping3.ChoiceIdentifier.MemberName, mapping.TypeDesc);
945 }
946 WriteMember(base.RaCodeGen.GetSourceForMember("o", memberMapping3, memberMapping3.MemberInfo, mapping.TypeDesc, ilg), choiceSource, memberMapping3.ElementsSortedByDerivation, memberMapping3.Text, memberMapping3.ChoiceIdentifier, memberMapping3.TypeDesc, writeAccessors: true);
947 if (memberMapping3.CheckSpecified != 0)
948 {
949 ilg.EndIf();
950 }
951 if (flag)
952 {
953 ilg.EndIf();
954 }
955 }
956 }
957 WriteEndElement("o");
958 }
959 ilg.EndMethod();
960 }
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void Add(TKey key, TValue value)
void ConvertAddress(Type source, Type target)
void ConvertValue(Type source, Type target)
LocalBuilder DeclareLocal(Type type, string name)
void LdargAddress(ArgBuilder argBuilder)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes)
void Call(MethodInfo methodInfo)
void Stloc(Type type, string name)
MethodBuilderInfo GetMethodBuilder(string methodName)
void WriteMember(SourceInfo source, AttributeAccessor attribute, TypeDesc memberTypeDesc, string parent)

References System.Collections.Generic.Dictionary< TKey, TValue >.Add(), System.Xml.Serialization.CodeGenerator.BeginMethod(), System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.CodeIdentifier.CheckValidIdentifier(), System.Xml.Serialization.CodeGenerator.ConvertAddress(), System.Xml.Serialization.CodeGenerator.ConvertValue(), System.Xml.Serialization.CodeGenerator.DeclareLocal(), System.Xml.Dictionary, System.Xml.Serialization.CodeGenerator.Else(), System.Type.EmptyTypes, System.Xml.Serialization.CodeGenerator.EndIf(), System.Xml.Serialization.CodeGenerator.EndMethod(), System.Xml.Serialization.XmlSerializationWriterILGen.FindXmlnsIndex(), System.Xml.Serialization.TypeScope.GetAllMembers(), System.Xml.Serialization.CodeGenerator.GetArg(), System.Xml.Serialization.XmlSerializationILGen.GetCSharpString(), System.Xml.Serialization.XmlSerializationILGen.GetMethodBuilder(), System.Xml.Serialization.CodeGenerator.GotoMethodEnd(), System.Xml.Serialization.CodeGenerator.If(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Xml.Serialization.XmlSerializationILGen.ILGenLoad(), System.Xml.Serialization.CodeGenerator.Ldarg(), System.Xml.Serialization.CodeGenerator.LdargAddress(), System.Xml.Serialization.CodeGenerator.Ldc(), System.Xml.Serialization.CodeGenerator.Ldstr(), System.list, System.Xml.Serialization.CodeGenerator.Load(), System.Xml.Serialization.XmlSerializationILGen.memberInfos, System.Xml.Serialization.CodeGenerator.Stloc(), System.text, System.Xml.Serialization.CodeGenerator.Throw(), System.Collections.Generic.Dictionary< TKey, TValue >.TryGetValue(), System.Xml.Serialization.XmlSerializationILGen.typeBuilder, System.value, System.Xml.Serialization.XmlSerializationWriterILGen.WriteDerivedTypes(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteEndElement(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteEnumAndArrayTypes(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteMember(), and System.Xml.Serialization.XmlSerializationWriterILGen.WriteTypeCompare().

Referenced by System.Xml.Serialization.XmlSerializationWriterILGen.GenerateMethod().