From 5c6b9897c103bc052cd15fbae3e8ce74e3b57ffd Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 6 Sep 2020 20:40:02 +0200 Subject: [PATCH] Avoid redundant casts + adjust NoExtensionMethods ugly test. --- .../TestCases/Pretty/UnsafeCode.cs | 15 +++++++++++++++ .../TestCases/Ugly/NoExtensionMethods.Expected.cs | 8 ++++---- .../CSharp/TranslatedExpression.cs | 8 ++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs index e432bbf6a..37ce5c345 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs @@ -509,5 +509,20 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty int num = value.Integers[index]; num.ToString(); } + + private unsafe static void* CastToVoidPtr(IntPtr intptr) + { + return (void*)intptr; + } + + private unsafe static void* CastToVoidPtr(UIntPtr intptr) + { + return (void*)intptr; + } + + private unsafe static void* CastToVoidPtr(int* intptr) + { + return intptr; + } } } diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoExtensionMethods.Expected.cs b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoExtensionMethods.Expected.cs index 72d6c3b3e..8d74f61ea 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoExtensionMethods.Expected.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoExtensionMethods.Expected.cs @@ -9,9 +9,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly internal static class NoExtensionMethods { [Extension] - internal static Func AsFunc(T value) where T : class + internal unsafe static Func AsFunc(T value) where T : class { - return new Func(value, __ldftn(Return)); + return new Func(value, (nint)(delegate*)(&Return)); } [Extension] @@ -25,9 +25,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly return Return; } - internal static Func ExtensionMethodBoundToNull() + internal unsafe static Func ExtensionMethodBoundToNull() { - return new Func(null, __ldftn(Return)); + return new Func(null, (nint)(delegate*)(&Return)); } } } diff --git a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs index 24c7f2bcd..41900b0e6 100644 --- a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs +++ b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs @@ -328,7 +328,9 @@ namespace ICSharpCode.Decompiler.CSharp // Direct cast only works correctly for IntPtr -> long. // IntPtr -> int works correctly only in checked context. // Everything else can be worked around by casting via long. - if (!(targetType.IsKnownType(KnownTypeCode.Int64) || targetType.Kind == TypeKind.NInt || checkForOverflow && targetType.IsKnownType(KnownTypeCode.Int32))) + if (!(targetType.IsKnownType(KnownTypeCode.Int64) || targetType.Kind == TypeKind.NInt + || (checkForOverflow && targetType.IsKnownType(KnownTypeCode.Int32)) + || targetType.Kind.IsAnyPointer())) { var convertVia = expressionBuilder.settings.NativeIntegers ? SpecialType.NInt : compilation.FindType(KnownTypeCode.Int64); return this.ConvertTo(convertVia, expressionBuilder, checkForOverflow) @@ -340,7 +342,9 @@ namespace ICSharpCode.Decompiler.CSharp // Direct cast only works correctly for UIntPtr -> ulong. // UIntPtr -> uint works correctly only in checked context. // Everything else can be worked around by casting via ulong. - if (!(targetType.IsKnownType(KnownTypeCode.UInt64) || targetType.Kind == TypeKind.NUInt || checkForOverflow && targetType.IsKnownType(KnownTypeCode.UInt32))) + if (!(targetType.IsKnownType(KnownTypeCode.UInt64) || targetType.Kind == TypeKind.NUInt + || (checkForOverflow && targetType.IsKnownType(KnownTypeCode.UInt32)) + || targetType.Kind.IsAnyPointer())) { var convertVia = expressionBuilder.settings.NativeIntegers ? SpecialType.NUInt : compilation.FindType(KnownTypeCode.UInt64); return this.ConvertTo(convertVia, expressionBuilder, checkForOverflow)