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

◆ WriteEnumMethod()

void System.Xml.Serialization.XmlSerializationWriterILGen.WriteEnumMethod ( EnumMapping mapping)
inlineprivate

Definition at line 508 of file XmlSerializationWriterILGen.cs.

509 {
510 base.MethodNames.TryGetValue(mapping, out var value);
511 List<Type> list = new List<Type>();
513 list.Add(mapping.TypeDesc.Type);
514 list2.Add("v");
515 ilg = new CodeGenerator(typeBuilder);
516 ilg.BeginMethod(typeof(string), GetMethodBuilder(value), list.ToArray(), list2.ToArray(), MethodAttributes.Private | MethodAttributes.HideBySig);
518 ilg.Load(null);
520 ConstantMapping[] constants = mapping.Constants;
521 if (constants.Length != 0)
522 {
528 LocalBuilder localBuilder2 = ilg.DeclareLocal(mapping.TypeDesc.Type, "localTmp");
529 ilg.Ldarg("v");
531 foreach (ConstantMapping constantMapping in constants)
532 {
533 if (hashSet.Add(constantMapping.Value))
534 {
537 ilg.Ldc(Enum.ToObject(mapping.TypeDesc.Type, constantMapping.Value));
538 ilg.Beq(label3);
541 }
542 }
543 if (mapping.IsFlags)
544 {
545 ilg.Br(label);
546 for (int j = 0; j < list3.Count; j++)
547 {
549 ilg.Ldc(list4[j]);
551 ilg.Br(label2);
552 }
554 base.RaCodeGen.ILGenForEnumLongValue(ilg, "v");
555 LocalBuilder localBuilder3 = ilg.DeclareLocal(typeof(string[]), "strArray");
556 ilg.NewArray(typeof(string), constants.Length);
558 for (int k = 0; k < constants.Length; k++)
559 {
560 ConstantMapping constantMapping2 = constants[k];
562 ilg.Ldc(k);
564 ilg.Stelem(typeof(string));
565 }
567 LocalBuilder localBuilder4 = ilg.DeclareLocal(typeof(long[]), "longArray");
568 ilg.NewArray(typeof(long), constants.Length);
570 for (int l = 0; l < constants.Length; l++)
571 {
572 ConstantMapping constantMapping3 = constants[l];
574 ilg.Ldc(l);
575 ilg.Ldc(constantMapping3.Value);
576 ilg.Stelem(typeof(long));
577 }
579 ilg.Ldstr(GetCSharpString(mapping.TypeDesc.FullName));
580 MethodInfo method = typeof(XmlSerializationWriter).GetMethod("FromEnum", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[4]
581 {
582 typeof(long),
583 typeof(string[]),
584 typeof(long[]),
585 typeof(string)
586 });
587 ilg.Call(method);
589 ilg.Br(label2);
590 }
591 else
592 {
593 ilg.Br(label);
594 for (int m = 0; m < list3.Count; m++)
595 {
597 ilg.Ldc(list4[m]);
599 ilg.Br(label2);
600 }
601 MethodInfo method2 = typeof(CultureInfo).GetMethod("get_InvariantCulture", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
602 MethodInfo method3 = typeof(long).GetMethod("ToString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(IFormatProvider) });
603 MethodInfo method4 = typeof(XmlSerializationWriter).GetMethod("CreateInvalidEnumValueException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
604 {
605 typeof(object),
606 typeof(string)
607 });
609 ilg.Ldarg(0);
610 ilg.Ldarg("v");
611 ilg.ConvertValue(mapping.TypeDesc.Type, typeof(long));
617 ilg.Ldstr(GetCSharpString(mapping.TypeDesc.FullName));
619 ilg.Throw();
620 }
622 }
624 ilg.EndMethod();
625 }
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void Add(TKey key, TValue value)
void Stelem(Type arrayElementType)
void ConvertValue(Type source, Type target)
LocalBuilder DeclareLocal(Type type, string name)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes)
void Call(MethodInfo methodInfo)
void NewArray(Type elementType, object len)
void Stloc(Type type, string name)
void LdlocAddress(LocalBuilder localBuilder)
void Ldloc(LocalBuilder localBuilder)
MethodBuilderInfo GetMethodBuilder(string methodName)

References System.Collections.Generic.Dictionary< TKey, TValue >.Add(), System.Xml.Serialization.CodeGenerator.BeginMethod(), System.Xml.Serialization.CodeGenerator.Beq(), System.Xml.Serialization.CodeGenerator.Br(), System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.CodeGenerator.ConvertValue(), System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Xml.Serialization.CodeGenerator.DeclareLocal(), System.Xml.Serialization.CodeGenerator.DefineLabel(), System.Xml.Dictionary, System.Type.EmptyTypes, System.Xml.Serialization.CodeGenerator.EndMethod(), System.Xml.Serialization.XmlSerializationILGen.GetCSharpString(), System.Xml.Serialization.XmlSerializationILGen.GetMethodBuilder(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Xml.Serialization.CodeGenerator.Ldarg(), System.Xml.Serialization.CodeGenerator.Ldc(), System.Xml.Serialization.CodeGenerator.Ldloc(), System.Xml.Serialization.CodeGenerator.LdlocAddress(), System.Xml.Serialization.CodeGenerator.Ldstr(), System.list, System.Xml.Serialization.CodeGenerator.Load(), System.Xml.Serialization.CodeGenerator.MarkLabel(), System.Xml.Serialization.CodeGenerator.NewArray(), System.Xml.Serialization.CodeGenerator.Stelem(), System.Xml.Serialization.CodeGenerator.Stloc(), System.Xml.Serialization.CodeGenerator.Throw(), System.Enum.ToObject(), System.Collections.Generic.Dictionary< TKey, TValue >.TryGetValue(), System.Xml.Serialization.XmlSerializationILGen.typeBuilder, and System.value.

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