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

◆ WriteAttribute()

void System.Xml.Serialization.XmlSerializationReaderILGen.WriteAttribute ( Member member)
inlineprivate

Definition at line 1685 of file XmlSerializationReaderILGen.cs.

1686 {
1687 AttributeAccessor attribute = member.Mapping.Attribute;
1688 if (attribute.Mapping is SpecialMapping)
1689 {
1690 SpecialMapping specialMapping = (SpecialMapping)attribute.Mapping;
1691 if (specialMapping.TypeDesc.Kind == TypeKind.Attribute)
1692 {
1693 WriteSourceBegin(member.ArraySource);
1694 ilg.Ldloc("attr");
1695 WriteSourceEnd(member.ArraySource, member.Mapping.TypeDesc.IsArrayLike ? member.Mapping.TypeDesc.ArrayElementTypeDesc.Type : member.Mapping.TypeDesc.Type);
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 {
1712 ilg.IsInst(typeof(XmlAttribute));
1713 }
1714 ilg.If();
1715 WriteSourceBegin(member.ArraySource);
1716 ilg.Ldloc(local);
1717 ilg.ConvertValue(local.LocalType, typeof(XmlAttribute));
1718 WriteSourceEnd(member.ArraySource, member.Mapping.TypeDesc.IsArrayLike ? member.Mapping.TypeDesc.ArrayElementTypeDesc.Type : member.Mapping.TypeDesc.Type);
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]");
1742 WriteSourceEnd(arraySource, member.Mapping.TypeDesc.ArrayElementTypeDesc.Type);
1743 ilg.EndFor();
1744 }
1745 else
1746 {
1747 WriteSourceBegin(member.ArraySource);
1748 WritePrimitive(attribute.Mapping, attribute.IsList ? "vals[i]" : "Reader.Value");
1749 WriteSourceEnd(member.ArraySource, member.Mapping.TypeDesc.IsArrayLike ? member.Mapping.TypeDesc.ArrayElementTypeDesc.Type : member.Mapping.TypeDesc.Type);
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 {
1757 ILGenParamsReadSource(member.ParamsReadSource, value: true);
1758 }
1759 }
static string XmlInternalError
Definition SR.cs:1812
Definition SR.cs:7
void ConvertValue(Type source, Type target)
LocalBuilder DeclareOrGetLocal(Type type, string name)
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)
string GetArraySource(TypeDesc typeDesc, string arrayName)

References System.Xml.Serialization.TypeDesc.ArrayElementTypeDesc, System.Xml.Serialization.XmlSerializationReaderILGen.Member.ArrayName, System.Xml.Serialization.XmlSerializationReaderILGen.Member.ArraySource, System.Xml.Serialization.AccessorMapping.Attribute, System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.MemberMapping.CheckSpecified, System.Xml.Serialization.XmlSerializationReaderILGen.Member.CheckSpecifiedSource, System.Xml.Serialization.CodeGenerator.Cne(), System.Xml.Serialization.CodeGenerator.ConvertValue(), 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.For(), System.Xml.Serialization.XmlSerializationReaderILGen.GetArraySource(), System.Xml.Serialization.CodeGenerator.GetLocal(), System.Xml.Serialization.CodeGenerator.If(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Xml.Serialization.XmlSerializationReaderILGen.ILGenParamsReadSource(), System.Xml.Serialization.XmlSerializationReaderILGen.ILGenSet(), System.Xml.Serialization.TypeDesc.IsArrayLike, System.Xml.Serialization.CodeGenerator.IsInst(), System.Xml.Serialization.CodeGenerator.Ldarg(), System.Xml.Serialization.CodeGenerator.Ldloc(), System.Xml.Serialization.CodeGenerator.Load(), System.Xml.Serialization.XmlSerializationReaderILGen.Member.Mapping, System.Xml.Serialization.XmlSerializationReaderILGen.Member.ParamsReadSource, System.Xml.Serialization.CodeGenerator.Stloc(), System.Xml.Serialization.TypeDesc.Type, System.Xml.Serialization.AccessorMapping.TypeDesc, System.value, System.Xml.Serialization.XmlSerializationReaderILGen.WritePrimitive(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteSourceBegin(), System.Xml.Serialization.XmlSerializationReaderILGen.WriteSourceEnd(), and System.SR.XmlInternalError.

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