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
int num = value.Integers[index]; int num = value.Integers[index];
num.ToString(); 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
internal static class NoExtensionMethods internal static class NoExtensionMethods
{ {
[Extension] [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] [Extension]
@ -25,9 +25,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly
return Return; 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
// Direct cast only works correctly for IntPtr -> long. // Direct cast only works correctly for IntPtr -> long.
// IntPtr -> int works correctly only in checked context. // IntPtr -> int works correctly only in checked context.
// Everything else can be worked around by casting via long. // 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); var convertVia = expressionBuilder.settings.NativeIntegers ? SpecialType.NInt : compilation.FindType(KnownTypeCode.Int64);
return this.ConvertTo(convertVia, expressionBuilder, checkForOverflow) return this.ConvertTo(convertVia, expressionBuilder, checkForOverflow)
@ -340,7 +342,9 @@ namespace ICSharpCode.Decompiler.CSharp
// Direct cast only works correctly for UIntPtr -> ulong. // Direct cast only works correctly for UIntPtr -> ulong.
// UIntPtr -> uint works correctly only in checked context. // UIntPtr -> uint works correctly only in checked context.
// Everything else can be worked around by casting via ulong. // 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); var convertVia = expressionBuilder.settings.NativeIntegers ? SpecialType.NUInt : compilation.FindType(KnownTypeCode.UInt64);
return this.ConvertTo(convertVia, expressionBuilder, checkForOverflow) return this.ConvertTo(convertVia, expressionBuilder, checkForOverflow)

Loading…
Cancel
Save