Skip to content

Commit 6a98a89

Browse files
author
Mohamed Koubaa
committed
refactor
1 parent 9cdcb51 commit 6a98a89

File tree

1 file changed

+20
-45
lines changed

1 file changed

+20
-45
lines changed

src/runtime/Types/ClassObject.cs

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Diagnostics;
3+
using System.Globalization;
34
using System.Linq;
45
using System.Reflection;
6+
using System.Runtime.InteropServices;
57
using System.Runtime.Serialization;
68

79
namespace Python.Runtime
@@ -47,6 +49,20 @@ internal NewReference GetDocString()
4749
return Runtime.PyString_FromString(str);
4850
}
4951

52+
private static string ConvertFlags(Enum value)
53+
{
54+
Type primitiveType = value.GetType().GetEnumUnderlyingType();
55+
string format = "X" + (Marshal.SizeOf(primitiveType) * 2).ToString(CultureInfo.InvariantCulture);
56+
var primitive = (IFormattable)Convert.ChangeType(value, primitiveType);
57+
return "0x" + primitive.ToString(format, null);
58+
59+
}
60+
61+
private static string ConvertValue(Enum value)
62+
{
63+
Type primitiveType = value.GetType().GetEnumUnderlyingType();
64+
return Convert.ChangeType(value, primitiveType).ToString()!;
65+
}
5066

5167
/// <summary>
5268
/// given an enum, write a __repr__ string formatted in the same
@@ -56,54 +72,13 @@ internal NewReference GetDocString()
5672
/// </summary>
5773
/// <param name="inst">Instace of the enum object</param>
5874
/// <returns></returns>
59-
private static string getEnumReprString(object inst)
75+
private static string GetEnumReprString(Enum inst)
6076
{
6177
var obType = inst.GetType();
6278

63-
var integralType = obType.GetEnumUnderlyingType();
64-
var isFlags = obType.IsFlagsEnum();
65-
66-
string strValue = "";
67-
switch (Type.GetTypeCode(integralType))
68-
{
69-
case TypeCode.SByte:
70-
var valueSB = Convert.ToSByte(inst);
71-
strValue = isFlags ? "0x" + valueSB.ToString("X2") : valueSB.ToString();
72-
break;
73-
case TypeCode.Byte:
74-
var valueB = Convert.ToByte(inst);
75-
strValue = isFlags ? "0x" + valueB.ToString("X2") : valueB.ToString();
76-
break;
77-
case TypeCode.Int16:
78-
var valueI16 = Convert.ToInt16(inst);
79-
strValue = isFlags ? "0x" + valueI16.ToString("X4") : valueI16.ToString();
80-
break;
81-
case TypeCode.UInt16:
82-
var valueUI16 = Convert.ToUInt16(inst);
83-
strValue = isFlags ? "0x" + valueUI16.ToString("X4") : valueUI16.ToString();
84-
break;
85-
case TypeCode.Int32:
86-
var valueI32 = Convert.ToInt32(inst);
87-
strValue = isFlags ? "0x" + valueI32.ToString("X8") : valueI32.ToString();
88-
break;
89-
case TypeCode.UInt32:
90-
var valueUI32 = Convert.ToUInt32(inst);
91-
strValue = isFlags ? "0x" + valueUI32.ToString("X8") : valueUI32.ToString();
92-
break;
93-
case TypeCode.Int64:
94-
var valueI64 = Convert.ToInt64(inst);
95-
strValue = isFlags ? "0x" + valueI64.ToString("X16") : valueI64.ToString();
96-
break;
97-
case TypeCode.UInt64:
98-
var valueUI64 = Convert.ToUInt64(inst);
99-
strValue = isFlags ? "0x" + valueUI64.ToString("X16") : valueUI64.ToString();
100-
break;
101-
default:
102-
break;
103-
}
104-
79+
string strValue2 = obType.IsFlagsEnum() ? ConvertFlags(inst) : ConvertValue(inst);
10580

106-
var repr = $"<{obType.Name}.{inst}: {strValue}>";
81+
var repr = $"<{obType.Name}.{inst}: {strValue2}>";
10782
return repr;
10883
}
10984

@@ -118,7 +93,7 @@ private static string getEnumReprString(object inst)
11893
}
11994
if (co.inst.GetType().IsEnum)
12095
{
121-
return Runtime.PyString_FromString(getEnumReprString(co.inst));
96+
return Runtime.PyString_FromString(GetEnumReprString((Enum)co.inst));
12297
}
12398

12499
return ClassBase.tp_repr(ob);

0 commit comments

Comments
 (0)