From fb05e839fcee554ae72a0e260f63a3dbc087c8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=20=D0=94=D1=8C=D1=8F=D1=87=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Thu, 7 Nov 2019 11:31:04 +0300 Subject: [PATCH] Fixed bug with different behaviour on .NET and .NET Core. --- Platform.Reflection/ILGeneratorExtensions.cs | 48 +++++--------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/Platform.Reflection/ILGeneratorExtensions.cs b/Platform.Reflection/ILGeneratorExtensions.cs index fbbfd04..21eb445 100644 --- a/Platform.Reflection/ILGeneratorExtensions.cs +++ b/Platform.Reflection/ILGeneratorExtensions.cs @@ -38,38 +38,11 @@ public static class ILGeneratorExtensions } if (NumericType.BitsSize > NumericType.BitsSize) { - generator.ConvertToInteger(targetType); + generator.ConvertToInteger(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(targetType, extendSign); } if (targetType == typeof(float)) { @@ -111,7 +84,7 @@ private static void ConvertToBoolean(this ILGenerator generator) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void ConvertToInteger(this ILGenerator generator, Type targetType) + private static void ConvertToInteger(this ILGenerator generator, Type targetType, bool extendSign) { if (targetType == typeof(sbyte)) { @@ -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.IsSigned || extendSign) + { + generator.Emit(OpCodes.Conv_I8); + } + else + { + generator.Emit(OpCodes.Conv_U8); + } } }