From 48a8351e27fad3d1c399efa1121cd066c54a4081 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 27 Jun 2022 16:10:42 +0200 Subject: [PATCH] Use Unsafe.SizeOf when taking the size of a managed type. --- .../TestCases/ILPretty/Unsafe.cs | 8 ++++---- .../CSharp/ExpressionBuilder.cs | 19 ++++++++++++++++--- .../TypeSystem/TypeSystemExtensions.cs | 3 +++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Unsafe.cs b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Unsafe.cs index 1a126fd9c..c853317bc 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Unsafe.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Unsafe.cs @@ -207,9 +207,9 @@ namespace System.Runtime.CompilerServices } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe static int SizeOf() + public static int SizeOf() { - return sizeof(T); + return Unsafe.SizeOf(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -307,7 +307,7 @@ namespace System.Runtime.CompilerServices [MethodImpl(MethodImplOptions.AggressiveInlining)] public unsafe static void* Add(void* source, int elementOffset) { - return (byte*)source + (nint)elementOffset * (nint)sizeof(T); + return (byte*)source + (nint)elementOffset * (nint)Unsafe.SizeOf(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -343,7 +343,7 @@ namespace System.Runtime.CompilerServices [MethodImpl(MethodImplOptions.AggressiveInlining)] public unsafe static void* Subtract(void* source, int elementOffset) { - return (byte*)source - (nint)elementOffset * (nint)sizeof(T); + return (byte*)source - (nint)elementOffset * (nint)Unsafe.SizeOf(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 6c1d6f9be..b278907bf 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -648,9 +648,22 @@ namespace ICSharpCode.Decompiler.CSharp protected internal override TranslatedExpression VisitSizeOf(SizeOf inst, TranslationContext context) { - return new SizeOfExpression(ConvertType(inst.Type)) - .WithILInstruction(inst) - .WithRR(new SizeOfResolveResult(compilation.FindType(KnownTypeCode.Int32), inst.Type, null)); + if (inst.Type.IsUnmanagedType(allowGenerics: settings.IntroduceUnmanagedConstraint)) + { + return new SizeOfExpression(ConvertType(inst.Type)) + .WithILInstruction(inst) + .WithRR(new SizeOfResolveResult(compilation.FindType(KnownTypeCode.Int32), inst.Type, null)); + } + else + { + return CallUnsafeIntrinsic( + name: "SizeOf", + arguments: Array.Empty(), + returnType: compilation.FindType(KnownTypeCode.Int32), + inst: inst, + typeArguments: new[] { inst.Type } + ); + } } protected internal override TranslatedExpression VisitLdTypeToken(LdTypeToken inst, TranslationContext context) diff --git a/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs b/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs index f714be673..122f794e6 100644 --- a/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs +++ b/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs @@ -290,13 +290,16 @@ namespace ICSharpCode.Decompiler.TypeSystem { if (types.Contains(f.Type)) { + types.Remove(type); return false; } if (!IsUnmanagedTypeInternal(f.Type)) { + types.Remove(type); return false; } } + types.Remove(type); return true; } return false;