From c4f5f0d45f8ed4516f2e2eb3da5881eb3f7459f3 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 8 Jun 2023 18:28:10 -0400 Subject: [PATCH] Remove `Unsafe.SkipInit`, just use `default`. --- .../Code/DeclarationsProvider.cs | 13 +----- .../Emitters/ConsumableConsumeEmitter.cs | 42 ------------------- .../Toolchains/Roslyn/Generator.cs | 4 +- 3 files changed, 2 insertions(+), 57 deletions(-) diff --git a/src/BenchmarkDotNet/Code/DeclarationsProvider.cs b/src/BenchmarkDotNet/Code/DeclarationsProvider.cs index 995fd3f557..4b8f349962 100644 --- a/src/BenchmarkDotNet/Code/DeclarationsProvider.cs +++ b/src/BenchmarkDotNet/Code/DeclarationsProvider.cs @@ -86,18 +86,7 @@ public override string ConsumeField : null; public override string OverheadImplementation - { - get - { - var type = WorkloadMethodReturnType; - // ByRefLike types and pointers use default, everything else uses Unsafe.SkipInit. - if (type.IsByRefLike() || type.IsPointer) - { - return $"return default({type.GetCorrectCSharpTypeName()});"; - } - return $"System.Runtime.CompilerServices.Unsafe.SkipInit(out {type.GetCorrectCSharpTypeName()} value);\nreturn value;"; - } - } + => $"return default({WorkloadMethodReturnType.GetCorrectCSharpTypeName()});"; public override string ReturnsDefinition => Consumer.IsConsumable(WorkloadMethodReturnType) || Consumer.HasConsumableField(WorkloadMethodReturnType, out _) diff --git a/src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/ConsumableConsumeEmitter.cs b/src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/ConsumableConsumeEmitter.cs index 2bc87cc487..790ca54482 100644 --- a/src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/ConsumableConsumeEmitter.cs +++ b/src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/ConsumableConsumeEmitter.cs @@ -78,48 +78,6 @@ protected override void OnEmitCtorBodyOverride(ConstructorBuilder constructorBui ilBuilder.Emit(OpCodes.Stfld, consumerField); } - public override void EmitOverheadImplementation(ILGenerator ilBuilder, Type returnType) - { - // ByRefLike types and pointers use default, everything else uses Unsafe.SkipInit. - if (returnType.IsByRefLike() || returnType.IsPointer) - { - /* - // return default; - IL_0000: ldc.i4.0 - IL_0001: ret - */ - // optional local if default(T) uses .initobj - var optionalLocalForInitobj = ilBuilder.DeclareOptionalLocalForReturnDefault(returnType); - ilBuilder.EmitReturnDefault(returnType, optionalLocalForInitobj); - return; - } - - /* - // System.Runtime.CompilerServices.Unsafe.SkipInit(out BenchmarkDotNet.Samples.CustomWithConsumable value); - // return value; - .locals init ( - [0] valuetype BenchmarkDotNet.Samples.CustomWithConsumable - ) - - IL_0000: ldloca.s 0 - IL_0002: call void Unsafe::SkipInit(!!0&) - IL_0007: ldloc.0 - IL_0008: ret - */ - var local = ilBuilder.DeclareLocal(returnType); - ilBuilder.EmitLdloca(local); - ilBuilder.Emit(OpCodes.Call, GetGenericSkipInitMethod(returnType)); - ilBuilder.EmitLdloc(local); - ilBuilder.Emit(OpCodes.Ret); - } - - private static MethodInfo GetGenericSkipInitMethod(Type skipInitType) - { - return typeof(Unsafe).GetMethods(BindingFlags.Static | BindingFlags.Public) - .Single(m => m.Name == nameof(Unsafe.SkipInit) && m.IsGenericMethodDefinition && m.ReturnType == typeof(void) && m.GetParameters().Single().IsOut) - .MakeGenericMethod(skipInitType); - } - protected override void EmitActionBeforeCallOverride(ILGenerator ilBuilder) { /* diff --git a/src/BenchmarkDotNet/Toolchains/Roslyn/Generator.cs b/src/BenchmarkDotNet/Toolchains/Roslyn/Generator.cs index 3730081e92..0718d6b8cb 100644 --- a/src/BenchmarkDotNet/Toolchains/Roslyn/Generator.cs +++ b/src/BenchmarkDotNet/Toolchains/Roslyn/Generator.cs @@ -2,7 +2,6 @@ using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.CompilerServices; using BenchmarkDotNet.Extensions; using BenchmarkDotNet.Portability; using BenchmarkDotNet.Running; @@ -57,8 +56,7 @@ internal static IEnumerable GetAllReferences(BenchmarkCase benchmarkCa new[] { benchmarkCase.Descriptor.Type.GetTypeInfo().Assembly, // this assembly does not has to have a reference to BenchmarkDotNet (e.g. custom framework for benchmarking that internally uses BenchmarkDotNet - typeof(BenchmarkCase).Assembly, // BenchmarkDotNet - typeof(Unsafe).Assembly // Unsafe + typeof(BenchmarkCase).Assembly // BenchmarkDotNet }) .Distinct(); }