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

◆ WriteMember() [1/2]

void System.Xml.Serialization.XmlSerializationWriterILGen.WriteMember ( SourceInfo source,
AttributeAccessor attribute,
TypeDesc memberTypeDesc,
string parent )
inlineprivate

Definition at line 972 of file XmlSerializationWriterILGen.cs.

973 {
974 if (memberTypeDesc.IsAbstract)
975 {
976 return;
977 }
978 if (memberTypeDesc.IsArrayLike)
979 {
980 string text = "a" + memberTypeDesc.Name;
981 string text2 = "ai" + memberTypeDesc.Name;
982 string text3 = "i";
983 string cSharpName = memberTypeDesc.CSharpName;
984 ilg.EnterScope();
986 if (memberTypeDesc.IsNullable)
987 {
989 ilg.Load(null);
990 ilg.If(Cmp.NotEqualTo);
991 }
992 if (attribute.IsList)
993 {
994 if (CanOptimizeWriteListSequence(memberTypeDesc.ArrayElementTypeDesc))
995 {
996 string value = ((attribute.Form == XmlSchemaForm.Qualified) ? attribute.Namespace : string.Empty);
997 MethodInfo method = typeof(XmlSerializationWriter).GetMethod("get_Writer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
998 MethodInfo method2 = typeof(XmlWriter).GetMethod("WriteStartAttribute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[3]
999 {
1000 typeof(string),
1001 typeof(string),
1002 typeof(string)
1003 });
1004 ilg.Ldarg(0);
1005 ilg.Call(method);
1006 ilg.Load(null);
1009 ilg.Call(method2);
1010 }
1011 else
1012 {
1014 ConstructorInfo constructor = typeof(StringBuilder).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1016 ilg.Stloc(local);
1017 }
1018 }
1019 TypeDesc arrayElementTypeDesc = memberTypeDesc.ArrayElementTypeDesc;
1020 if (memberTypeDesc.IsEnumerable)
1021 {
1022 throw Globals.NotSupported("Also fail in IEnumerable member with XmlAttributeAttribute");
1023 }
1025 ilg.For(local2, 0, ilg.GetLocal(text));
1026 WriteLocalDecl(text2, base.RaCodeGen.GetStringForArrayMember(text, text3, memberTypeDesc), arrayElementTypeDesc.Type);
1027 if (attribute.IsList)
1028 {
1029 Type returnType = typeof(string);
1030 string name;
1032 if (CanOptimizeWriteListSequence(memberTypeDesc.ArrayElementTypeDesc))
1033 {
1034 ilg.Ldloc(text3);
1035 ilg.Ldc(0);
1036 ilg.If(Cmp.NotEqualTo);
1037 MethodInfo method3 = typeof(XmlSerializationWriter).GetMethod("get_Writer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1038 MethodInfo method4 = typeof(XmlWriter).GetMethod("WriteString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1039 ilg.Ldarg(0);
1040 ilg.Call(method3);
1041 ilg.Ldstr(" ");
1042 ilg.Call(method4);
1043 ilg.EndIf();
1044 ilg.Ldarg(0);
1045 name = "WriteValue";
1046 typeFromHandle = typeof(XmlSerializationWriter);
1047 }
1048 else
1049 {
1050 MethodInfo method5 = typeof(StringBuilder).GetMethod("Append", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
1051 ilg.Ldloc(text3);
1052 ilg.Ldc(0);
1053 ilg.If(Cmp.NotEqualTo);
1054 ilg.Ldloc("sb");
1055 ilg.Ldstr(" ");
1056 ilg.Call(method5);
1057 ilg.Pop();
1058 ilg.EndIf();
1059 ilg.Ldloc("sb");
1060 name = "Append";
1062 }
1063 if (attribute.Mapping is EnumMapping)
1064 {
1065 WriteEnumValue((EnumMapping)attribute.Mapping, new SourceInfo(text2, text2, null, arrayElementTypeDesc.Type, ilg), out returnType);
1066 }
1067 else
1068 {
1070 }
1071 MethodInfo method6 = typeFromHandle.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { returnType });
1072 ilg.Call(method6);
1073 if (method6.ReturnType != typeof(void))
1074 {
1075 ilg.Pop();
1076 }
1077 }
1078 else
1079 {
1080 WriteAttribute(new SourceInfo(text2, text2, null, null, ilg), attribute, parent);
1081 }
1082 if (memberTypeDesc.IsEnumerable)
1083 {
1084 throw Globals.NotSupported("Also fail in whidbey IEnumerable member with XmlAttributeAttribute");
1085 }
1086 ilg.EndFor();
1087 if (attribute.IsList)
1088 {
1089 if (CanOptimizeWriteListSequence(memberTypeDesc.ArrayElementTypeDesc))
1090 {
1091 MethodInfo method7 = typeof(XmlSerializationWriter).GetMethod("get_Writer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1092 MethodInfo method8 = typeof(XmlWriter).GetMethod("WriteEndAttribute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1093 ilg.Ldarg(0);
1094 ilg.Call(method7);
1095 ilg.Call(method8);
1096 }
1097 else
1098 {
1099 MethodInfo method9 = typeof(StringBuilder).GetMethod("get_Length", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1100 ilg.Ldloc("sb");
1101 ilg.Call(method9);
1102 ilg.Ldc(0);
1103 ilg.If(Cmp.NotEqualTo);
1104 List<Type> list = new List<Type>();
1105 ilg.Ldarg(0);
1107 list.Add(typeof(string));
1108 string text4 = ((attribute.Form == XmlSchemaForm.Qualified) ? attribute.Namespace : string.Empty);
1109 if (text4 != null)
1110 {
1112 list.Add(typeof(string));
1113 }
1114 MethodInfo method10 = typeof(object).GetMethod("ToString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1115 ilg.Ldloc("sb");
1116 ilg.Call(method10);
1117 list.Add(typeof(string));
1118 MethodInfo method11 = typeof(XmlSerializationWriter).GetMethod("WriteAttribute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, list.ToArray());
1119 ilg.Call(method11);
1120 ilg.EndIf();
1121 }
1122 }
1123 if (memberTypeDesc.IsNullable)
1124 {
1125 ilg.EndIf();
1126 }
1127 ilg.ExitScope();
1128 }
1129 else
1130 {
1132 }
1133 }
void Add(TKey key, TValue value)
LocalBuilder DeclareOrGetLocal(Type type, string name)
void New(ConstructorInfo constructorInfo)
void Call(MethodInfo methodInfo)
void Stloc(Type type, string name)
object For(LocalBuilder local, object start, object end)
LocalBuilder GetLocal(string name)
void Ldloc(LocalBuilder localBuilder)
void WriteAttribute(SourceInfo source, AttributeAccessor attribute, string parent)
void WriteArrayLocalDecl(string typeName, string variableName, SourceInfo initValue, TypeDesc arrayTypeDesc)
void WriteEnumValue(EnumMapping mapping, SourceInfo source, out Type returnType)
void WritePrimitiveValue(TypeDesc typeDesc, SourceInfo source, out Type returnType)
void WriteLocalDecl(string variableName, string initValue, Type type)

References System.Collections.Generic.Dictionary< TKey, TValue >.Add(), System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.XmlSerializationWriterILGen.CanOptimizeWriteListSequence(), System.Xml.Serialization.CodeGenerator.DeclareOrGetLocal(), System.Xml.Dictionary, System.Type.EmptyTypes, System.Xml.Serialization.CodeGenerator.EndFor(), System.Xml.Serialization.CodeGenerator.EndIf(), System.Xml.Serialization.CodeGenerator.EnterScope(), System.Xml.Serialization.CodeGenerator.ExitScope(), System.Xml.Serialization.CodeGenerator.For(), System.Xml.Serialization.XmlSerializationILGen.GetCSharpString(), System.Xml.Serialization.CodeGenerator.GetLocal(), System.Xml.Serialization.CodeGenerator.If(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Xml.Serialization.CodeGenerator.Ldarg(), System.Xml.Serialization.CodeGenerator.Ldc(), System.Xml.Serialization.CodeGenerator.Ldloc(), System.Xml.Serialization.CodeGenerator.Ldstr(), System.list, System.Xml.Serialization.CodeGenerator.Load(), System.Xml.Serialization.CodeGenerator.New(), System.Xml.Serialization.Globals.NotSupported(), System.Xml.Serialization.CodeGenerator.Pop(), System.source, System.Xml.Serialization.CodeGenerator.Stloc(), System.text, System.value, System.Xml.Serialization.XmlSerializationWriterILGen.WriteArrayLocalDecl(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteAttribute(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteEnumValue(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteLocalDecl(), and System.Xml.Serialization.XmlSerializationWriterILGen.WritePrimitiveValue().

Referenced by System.Xml.Serialization.XmlSerializationWriterILGen.GenerateMembersElement(), System.Xml.Serialization.XmlSerializationWriterILGen.GenerateTypeElement(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteEnumAndArrayTypes(), and System.Xml.Serialization.XmlSerializationWriterILGen.WriteStructMethod().