Browse Source

Avoid redundant casts + adjust NoExtensionMethods ugly test.

pull/2150/head
Daniel Grunwald 5 years ago
parent
commit
5c6b9897c1
  1. 15
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs
  2. 8
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoExtensionMethods.Expected.cs
  3. 8
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

15
ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs

@ -509,5 +509,20 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -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;
}
}
}

8
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoExtensionMethods.Expected.cs

@ -9,9 +9,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly @@ -9,9 +9,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly
internal static class NoExtensionMethods
{
[Extension]
internal static Func<T> AsFunc<T>(T value) where T : class
internal unsafe static Func<T> AsFunc<T>(T value) where T : class
{
return new Func<T>(value, __ldftn(Return));
return new Func<T>(value, (nint)(delegate*<T, T>)(&Return));
}
[Extension]
@ -25,9 +25,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly @@ -25,9 +25,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly
return Return;
}
internal static Func<object> ExtensionMethodBoundToNull()
internal unsafe static Func<object> ExtensionMethodBoundToNull()
{
return new Func<object>(null, __ldftn(Return));
return new Func<object>(null, (nint)(delegate*<object, object>)(&Return));
}
}
}

8
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -328,7 +328,9 @@ namespace ICSharpCode.Decompiler.CSharp @@ -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 @@ -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)

Loading…
Cancel
Save