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

◆ WriteLiteralStructMethod()

void System.Xml.Serialization.XmlSerializationReaderILGen.WriteLiteralStructMethod ( StructMapping structMapping)
inlineprivate

Definition at line 1125 of file XmlSerializationReaderILGen.cs.

1126 {
1127 base.MethodNames.TryGetValue(structMapping, out var value);
1128 string cSharpName = structMapping.TypeDesc.CSharpName;
1129 ilg = new CodeGenerator(typeBuilder);
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);
1140 LocalBuilder localBuilder = ilg.DeclareLocal(typeof(XmlQualifiedName), "xsiType");
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 {
1184 throw Globals.NotSupported(System.SR.Arg_NeverValueType);
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 }
1281 MemberMapping[] settableMembers = TypeScope.GetSettableMembers(structMapping, memberInfos);
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 {
1291 MemberMapping memberMapping = settableMembers[i];
1292 CodeIdentifier.CheckValidIdentifier(memberMapping.Name);
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 }
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void Add(TKey key, TValue value)
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Arg_NeverValueType
Definition SR.cs:1816
static string XmlSequenceHierarchy
Definition SR.cs:1800
Definition SR.cs:7
LocalBuilder DeclareLocal(Type type, string name)
void New(ConstructorInfo constructorInfo)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes)
void Call(MethodInfo methodInfo)
void Stloc(Type type, string name)
LocalBuilder GetLocal(string name)
void Ldloc(LocalBuilder localBuilder)
MethodBuilderInfo GetMethodBuilder(string methodName)
void WriteAttributes(Member[] members, Member anyAttribute, string elseCall, LocalBuilder firstParam)
void WriteDerivedTypes(StructMapping mapping, bool isTypedReturn, string returnTypeName)
void WriteQNameEqual(string source, string name, string ns)
void WriteMemberElements(Member[] members, string elementElseString, string elseString, Member anyElement, Member anyText)
string GetChoiceIdentifierSource(MemberMapping[] mappings, MemberMapping member)

References System.Collections.Generic.Dictionary< TKey, TValue >.Add(), System.SR.Arg_NeverValueType, System.Xml.Serialization.CodeGenerator.BeginMethod(), System.Xml.Serialization.CodeGenerator.Br(), System.Xml.Serialization.CodeGenerator.Br_S(), System.Xml.Serialization.CodeGenerator.Brtrue(), System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.CodeGenerator.Ceq(), System.Xml.Serialization.CodeIdentifier.CheckValidIdentifier(), System.Xml.Serialization.CodeGenerator.DeclareLocal(), System.Xml.Serialization.CodeGenerator.DefineLabel(), System.Xml.Dictionary, System.Xml.Serialization.CodeGenerator.Else(), System.Type.EmptyTypes, System.Xml.Serialization.CodeGenerator.EndIf(), System.Xml.Serialization.CodeGenerator.EndMethod(), System.Xml.Serialization.XmlSerializationReaderILGen.ExpectedElements(), System.SR.Format(), System.Xml.Serialization.XmlSerializationReaderILGen.GetChoiceIdentifierSource(), System.Xml.Serialization.XmlSerializationILGen.GetCSharpString(), System.Xml.Serialization.CodeGenerator.GetLocal(), System.Xml.Serialization.XmlSerializationILGen.GetMethodBuilder(), System.Xml.Serialization.TypeScope.GetSettableMembers(), System.Text.RegularExpressions.i, System.Xml.Serialization.CodeGenerator.If(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Xml.Serialization.XmlSerializationReaderILGen.IsSequence(), 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.MarkLabel(), System.Xml.Serialization.XmlSerializationILGen.memberInfos, System.Xml.Serialization.CodeGenerator.New(), System.Xml.Serialization.Globals.NotSupported(), System.Xml.Serialization.CodeGenerator.Pop(), System.Xml.Serialization.CodeGenerator.ReturnLabel, System.Xml.Serialization.CodeGenerator.ReturnLocal, 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.XmlSerializationReaderILGen.WriteAttributes(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteCreateMapping(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteDerivedTypes(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteEnumAndArrayTypes(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteMemberBegin(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteMemberElements(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteMemberEnd(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteParamsRead(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteQNameEqual(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteWhileLoopEnd(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteWhileNotLoopStart(), and System.SR.XmlSequenceHierarchy.

Referenced by System.Xml.Serialization.XmlSerializationReaderILGen.WriteStructMethod().