Skip to content

Commit

Permalink
Fixed bug with different behaviour on .NET and .NET Core.
Browse files Browse the repository at this point in the history
  • Loading branch information
Konard committed Nov 7, 2019
1 parent e57418a commit fb05e83
Showing 1 changed file with 12 additions and 36 deletions.
48 changes: 12 additions & 36 deletions Platform.Reflection/ILGeneratorExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,38 +38,11 @@ public static class ILGeneratorExtensions
}
if (NumericType<TSource>.BitsSize > NumericType<TTarget>.BitsSize)
{
generator.ConvertToInteger(targetType);
generator.ConvertToInteger<TSource>(targetType, extendSign: false);
}
else
{
if (sourceType == typeof(uint) && targetType == typeof(long) && !extendSign)
{
generator.Emit(OpCodes.Conv_U8);
}
#if NETFRAMEWORK
else if (sourceType == typeof(uint) && targetType == typeof(long) && extendSign)
{
generator.Emit(OpCodes.Conv_I8);
}
else if (sourceType == typeof(byte) || sourceType == typeof(ushort))
{
if (targetType == typeof(long))
{
if (extendSign)
{
generator.Emit(OpCodes.Conv_I8);
}
else
{
generator.Emit(OpCodes.Conv_U8);
}
}
}
else
{
generator.ConvertToInteger(targetType);
}
#endif
generator.ConvertToInteger<TSource>(targetType, extendSign);
}
if (targetType == typeof(float))
{
Expand Down Expand Up @@ -111,7 +84,7 @@ private static void ConvertToBoolean<TSource>(this ILGenerator generator)
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void ConvertToInteger(this ILGenerator generator, Type targetType)
private static void ConvertToInteger<TSource>(this ILGenerator generator, Type targetType, bool extendSign)
{
if (targetType == typeof(sbyte))
{
Expand All @@ -137,13 +110,16 @@ private static void ConvertToInteger(this ILGenerator generator, Type targetType
{
generator.Emit(OpCodes.Conv_U4);
}
else if (targetType == typeof(long))
{
generator.Emit(OpCodes.Conv_I8);
}
else if (targetType == typeof(ulong))
else if (targetType == typeof(long) || targetType == typeof(ulong))
{
generator.Emit(OpCodes.Conv_U8);
if (NumericType<TSource>.IsSigned || extendSign)
{
generator.Emit(OpCodes.Conv_I8);
}
else
{
generator.Emit(OpCodes.Conv_U8);
}
}
}

Expand Down

0 comments on commit fb05e83

Please sign in to comment.