diff --git a/src/BenchmarkDotNet/Engines/Consumer.cs b/src/BenchmarkDotNet/Engines/Consumer.cs index 015b3a952d..f35c466c63 100644 --- a/src/BenchmarkDotNet/Engines/Consumer.cs +++ b/src/BenchmarkDotNet/Engines/Consumer.cs @@ -30,8 +30,6 @@ private static readonly HashSet SupportedTypes private double doubleHolder; private long longHolder; private ulong ulongHolder; - private string stringHolder; - private object objectHolder; private IntPtr ptrHolder; private UIntPtr uptrHolder; @@ -97,16 +95,16 @@ private static readonly HashSet SupportedTypes [MethodImpl(MethodImplOptions.AggressiveInlining)] [PublicAPI] - public void Consume(string stringValue) => Volatile.Write(ref stringHolder, stringValue); + public void Consume(string stringValue) => DeadCodeEliminationHelper.KeepAliveWithoutBoxing(stringValue); [MethodImpl(MethodImplOptions.AggressiveInlining)] [PublicAPI] - public void Consume(object objectValue) => Volatile.Write(ref objectHolder, objectValue); + public void Consume(object objectValue) => DeadCodeEliminationHelper.KeepAliveWithoutBoxing(objectValue); [MethodImpl(MethodImplOptions.AggressiveInlining)] [PublicAPI] public void Consume(T objectValue) where T : class // class constraint prevents from boxing structs - => Volatile.Write(ref objectHolder, objectValue); + => DeadCodeEliminationHelper.KeepAliveWithoutBoxing(objectValue); [MethodImpl(MethodImplOptions.AggressiveInlining)] public unsafe void Consume(T* ptrValue) where T: unmanaged => Volatile.Write(ref ptrHolder, (IntPtr)ptrValue); @@ -141,15 +139,10 @@ public void Consume(in T value) Volatile.Write(ref longHolder, (long)(object)value); else if (typeof(T) == typeof(ulong)) Volatile.Write(ref ulongHolder, (ulong)(object)value); - else if (default(T) == null) - objectHolder = (object) value; else - ValueTypesConsumer(value); // non-primitive value types + DeadCodeEliminationHelper.KeepAliveWithoutBoxingReadonly(value); // non-primitive and nullable value types } - [MethodImpl(MethodImplOptions.NoInlining)] - private void ValueTypesConsumer(in T _) { } - internal static bool IsConsumable(Type type) => SupportedTypes.Contains(type) || type.GetTypeInfo().IsClass || type.GetTypeInfo().IsInterface;