Skip to content

Commit e9c957c

Browse files
committed
Reorder checks so the 1st looks less special-casey
* As the previous commit showed, the `IsGenericParameter` check must have priority... probably not just over enums, but over any other value types, too. * The `IsEnum` check can be put behind `IsValueType` so it does not run for non-value types.
1 parent 18b514c commit e9c957c

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

src/Castle.Core/DynamicProxy/Generators/Emitters/OpCodeUtil.cs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ internal abstract class OpCodeUtil
2727
/// </summary>
2828
public static void EmitLoadIndirectOpCodeForType(ILGenerator gen, Type type)
2929
{
30-
if (type.IsEnum && !type.IsGenericParameter)
31-
{
32-
EmitLoadIndirectOpCodeForType(gen, GetUnderlyingTypeOfEnum(type));
33-
return;
34-
}
35-
3630
if (type.IsByRef)
3731
{
3832
throw new NotSupportedException("Cannot load ByRef values");
@@ -48,13 +42,20 @@ public static void EmitLoadIndirectOpCodeForType(ILGenerator gen, Type type)
4842

4943
gen.Emit(opCode);
5044
}
51-
else if (type.IsValueType)
45+
else if (type.IsGenericParameter)
5246
{
5347
gen.Emit(OpCodes.Ldobj, type);
5448
}
55-
else if (type.IsGenericParameter)
49+
else if (type.IsValueType)
5650
{
57-
gen.Emit(OpCodes.Ldobj, type);
51+
if (type.IsEnum)
52+
{
53+
EmitLoadIndirectOpCodeForType(gen, GetUnderlyingTypeOfEnum(type));
54+
}
55+
else
56+
{
57+
gen.Emit(OpCodes.Ldobj, type);
58+
}
5859
}
5960
else
6061
{
@@ -107,12 +108,6 @@ public static void EmitLoadOpCodeForDefaultValueOfType(ILGenerator gen, Type typ
107108
/// </summary>
108109
public static void EmitStoreIndirectOpCodeForType(ILGenerator gen, Type type)
109110
{
110-
if (type.IsEnum && !type.IsGenericParameter)
111-
{
112-
EmitStoreIndirectOpCodeForType(gen, GetUnderlyingTypeOfEnum(type));
113-
return;
114-
}
115-
116111
if (type.IsByRef)
117112
{
118113
throw new NotSupportedException("Cannot store ByRef values");
@@ -128,13 +123,20 @@ public static void EmitStoreIndirectOpCodeForType(ILGenerator gen, Type type)
128123

129124
gen.Emit(opCode);
130125
}
131-
else if (type.IsValueType)
126+
else if (type.IsGenericParameter)
132127
{
133128
gen.Emit(OpCodes.Stobj, type);
134129
}
135-
else if (type.IsGenericParameter)
130+
else if (type.IsValueType)
136131
{
137-
gen.Emit(OpCodes.Stobj, type);
132+
if (type.IsEnum)
133+
{
134+
EmitStoreIndirectOpCodeForType(gen, GetUnderlyingTypeOfEnum(type));
135+
}
136+
else
137+
{
138+
gen.Emit(OpCodes.Stobj, type);
139+
}
138140
}
139141
else
140142
{

0 commit comments

Comments
 (0)