Skip to content

Commit

Permalink
Use Type.GetTypeCode() instead of private extension (#57540)
Browse files Browse the repository at this point in the history
* Use official Type.GetTypeCode() instead of the extension that was added to fill the gap in the earlier days of .Net Core.
* Bring reflection-based serializer in line with RefEmit behavior for 'object' serialization.
  • Loading branch information
StephenMolloy authored Aug 17, 2021
1 parent 4699992 commit 078af6b
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 156 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,6 @@
<Compile Include="System\Xml\Serialization\Configuration\DateTimeSerializationSection.cs" />
<Compile Include="System\Xml\Extensions\ExtensionMethods.cs" />
<Compile Include="System\Xml\Serialization\Globals.cs" />
<Compile Include="System\Xml\Serialization\TypeCode.cs" />
</ItemGroup>
<!-- Embedded DTD files -->
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,7 @@ private OpCode GetLdindOpCode(TypeCode typeCode)

internal void Ldobj(Type type)
{
OpCode opCode = GetLdindOpCode(type.GetTypeCode());
OpCode opCode = GetLdindOpCode(Type.GetTypeCode(type));
if (!opCode.Equals(OpCodes.Nop))
{
_ilGen!.Emit(opCode);
Expand Down Expand Up @@ -781,7 +781,7 @@ internal void Ldc(object o)
}
else
{
switch (valueType.GetTypeCode())
switch (Type.GetTypeCode(valueType))
{
case TypeCode.Boolean:
Ldc((bool)o);
Expand Down Expand Up @@ -1037,7 +1037,7 @@ internal void Ldelem(Type arrayElementType)
}
else
{
OpCode opCode = GetLdelemOpCode(arrayElementType.GetTypeCode());
OpCode opCode = GetLdelemOpCode(Type.GetTypeCode(arrayElementType));
Debug.Assert(!opCode.Equals(OpCodes.Nop));
if (opCode.Equals(OpCodes.Nop))
throw new InvalidOperationException(SR.Format(SR.ArrayTypeIsNotSupported, arrayElementType.AssemblyQualifiedName));
Expand Down Expand Up @@ -1083,7 +1083,7 @@ internal void Stelem(Type arrayElementType)
Stelem(Enum.GetUnderlyingType(arrayElementType));
else
{
OpCode opCode = GetStelemOpCode(arrayElementType.GetTypeCode());
OpCode opCode = GetStelemOpCode(Type.GetTypeCode(arrayElementType));
if (opCode.Equals(OpCodes.Nop))
throw new InvalidOperationException(SR.Format(SR.ArrayTypeIsNotSupported, arrayElementType.AssemblyQualifiedName));
_ilGen!.Emit(opCode);
Expand Down Expand Up @@ -1197,7 +1197,7 @@ private void InternalConvert(Type source, Type target, bool isAddress)
{
if (source.IsValueType)
{
OpCode opCode = GetConvOpCode(target.GetTypeCode());
OpCode opCode = GetConvOpCode(Type.GetTypeCode(target));
if (opCode.Equals(OpCodes.Nop))
{
throw new CodeGeneratorConversionException(source, target, isAddress, "NoConversionPossibleTo");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -668,52 +668,27 @@ private void WriteStructMethod(StructMapping mapping, string n, string? ns, obje
[RequiresUnreferencedCode("calls WriteMember")]
private bool WriteEnumAndArrayTypes(StructMapping structMapping, object o, string n, string? ns)
{
if (o is Enum)
{
Writer.WriteStartElement(n, ns);
Type objType = o.GetType();

EnumMapping? enumMapping = null;
Type enumType = o.GetType();
foreach (var m in _mapping.Scope!.TypeMappings)
foreach (var m in _mapping.Scope!.TypeMappings)
{
if (m is EnumMapping em && em.TypeDesc!.Type == objType)
{
if (m is EnumMapping em && em.TypeDesc!.Type == enumType)
{
enumMapping = em;
break;
}
Writer.WriteStartElement(n, ns);
WriteXsiType(em.TypeName!, ns);
Writer.WriteString(WriteEnumMethod(em, o));
Writer.WriteEndElement();
return true;
}

if (enumMapping == null)
throw new InvalidOperationException(SR.XmlInternalError);

WriteXsiType(enumMapping.TypeName!, ns);
Writer.WriteString(WriteEnumMethod(enumMapping, o));
Writer.WriteEndElement();
return true;
}

if (o is Array)
{
Writer.WriteStartElement(n, ns);
ArrayMapping? arrayMapping = null;
Type arrayType = o.GetType();
foreach (var m in _mapping.Scope!.TypeMappings)
if (m is ArrayMapping am && am.TypeDesc!.Type == objType)
{
if (m is ArrayMapping am && am.TypeDesc!.Type == arrayType)
{
arrayMapping = am;
break;
}
Writer.WriteStartElement(n, ns);
WriteXsiType(am.TypeName!, ns);
WriteMember(o, null, am.ElementsSortedByDerivation!, null, null, am.TypeDesc!, true);
Writer.WriteEndElement();
return true;
}

if (arrayMapping == null)
throw new InvalidOperationException(SR.XmlInternalError);

WriteXsiType(arrayMapping.TypeName!, ns);
WriteMember(o, null, arrayMapping.ElementsSortedByDerivation!, null, null, arrayMapping.TypeDesc!, true);
Writer.WriteEndElement();

return true;
}

return false;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,7 @@ internal static bool IsKnownType(Type type)
if (type.IsEnum)
return false;

switch (type.GetTypeCode())
switch (Type.GetTypeCode(type))
{
case TypeCode.String: return true;
case TypeCode.Int32: return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ private XmlQualifiedName GetPrimitiveTypeName(Type type)
string typeName;
string typeNs = XmlSchema.Namespace;

switch (type.GetTypeCode())
switch (Type.GetTypeCode(type))
{
case TypeCode.String: typeName = "string"; break;
case TypeCode.Int32: typeName = "int"; break;
Expand Down Expand Up @@ -254,7 +254,7 @@ protected void WriteTypedPrimitive(string? name, string? ns, object o, bool xsiT
Type t = o.GetType();
bool wroteStartElement = false;

switch (t.GetTypeCode())
switch (Type.GetTypeCode(t))
{
case TypeCode.String:
value = (string)o;
Expand Down Expand Up @@ -1312,7 +1312,7 @@ protected void WritePotentiallyReferencingElement(string? n, string? ns, object?
return;
}
Type t = o.GetType();
if (t.GetTypeCode() == TypeCode.Object && !(o is Guid) && (t != typeof(XmlQualifiedName)) && !(o is XmlNode[]) && (t != typeof(byte[])))
if (Type.GetTypeCode(t) == TypeCode.Object && !(o is Guid) && (t != typeof(XmlQualifiedName)) && !(o is XmlNode[]) && (t != typeof(byte[])))
{
if ((suppressReference || _soap12) && !IsIdDefined(o))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -835,7 +835,7 @@ private void SerializePrimitive(XmlWriter xmlWriter, object? o, XmlSerializerNam
{
XmlSerializationPrimitiveWriter writer = new XmlSerializationPrimitiveWriter();
writer.Init(xmlWriter, namespaces, null, null, null);
switch (_primitiveType!.GetTypeCode())
switch (Type.GetTypeCode(_primitiveType))
{
case TypeCode.String:
writer.Write_string(o);
Expand Down Expand Up @@ -917,7 +917,7 @@ private void SerializePrimitive(XmlWriter xmlWriter, object? o, XmlSerializerNam
XmlSerializationPrimitiveReader reader = new XmlSerializationPrimitiveReader();
reader.Init(xmlReader, events, null, null);
object? o;
switch (_primitiveType!.GetTypeCode())
switch (Type.GetTypeCode(_primitiveType))
{
case TypeCode.String:
o = reader.Read_string();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,20 @@ public static void Xml_EnumAsMember()
Assert.StrictEqual(x.P1, y.P1);
}

#if !XMLSERIALIZERGENERATORTESTS
[Fact]
public static void Xml_EnumAsObject()
{
object o = MyEnum.Three;
object o2 = SerializeAndDeserialize<object>(o,
@"<?xml version=""1.0"" encoding=""utf-8""?>
<anyType xmlns:q1=""http://www.w3.org/2001/XMLSchema"" p2:type=""q1:int"" xmlns:p2=""http://www.w3.org/2001/XMLSchema-instance"">2</anyType>");
Assert.NotNull(o2);
Assert.StrictEqual((int)o, o2);
Assert.Equal(MyEnum.Three, (MyEnum)o2);
}
#endif

[Fact]
public static void Xml_DCClassWithEnumAndStruct()
{
Expand Down

0 comments on commit 078af6b

Please sign in to comment.