Skip to content

Commit e20aea3

Browse files
committed
Remove Unsafe.SkipInit, just use default.
1 parent 149ea7a commit e20aea3

File tree

3 files changed

+2
-56
lines changed

3 files changed

+2
-56
lines changed

src/BenchmarkDotNet/Code/DeclarationsProvider.cs

+1-12
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,7 @@ public override string ConsumeField
8686
: null;
8787

8888
public override string OverheadImplementation
89-
{
90-
get
91-
{
92-
var type = WorkloadMethodReturnType;
93-
// ByRefLike types and pointers use default, everything else uses Unsafe.SkipInit.
94-
if (type.IsByRefLike() || type.IsPointer)
95-
{
96-
return $"return default({type.GetCorrectCSharpTypeName()});";
97-
}
98-
return $"System.Runtime.CompilerServices.Unsafe.SkipInit(out {type.GetCorrectCSharpTypeName()} value);\nreturn value;";
99-
}
100-
}
89+
=> $"return default({WorkloadMethodReturnType.GetCorrectCSharpTypeName()});";
10190

10291
public override string ReturnsDefinition
10392
=> Consumer.IsConsumable(WorkloadMethodReturnType) || Consumer.HasConsumableField(WorkloadMethodReturnType, out _)

src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/ConsumableConsumeEmitter.cs

-42
Original file line numberDiff line numberDiff line change
@@ -78,48 +78,6 @@ protected override void OnEmitCtorBodyOverride(ConstructorBuilder constructorBui
7878
ilBuilder.Emit(OpCodes.Stfld, consumerField);
7979
}
8080

81-
public override void EmitOverheadImplementation(ILGenerator ilBuilder, Type returnType)
82-
{
83-
// ByRefLike types and pointers use default, everything else uses Unsafe.SkipInit.
84-
if (returnType.IsByRefLike() || returnType.IsPointer)
85-
{
86-
/*
87-
// return default;
88-
IL_0000: ldc.i4.0
89-
IL_0001: ret
90-
*/
91-
// optional local if default(T) uses .initobj
92-
var optionalLocalForInitobj = ilBuilder.DeclareOptionalLocalForReturnDefault(returnType);
93-
ilBuilder.EmitReturnDefault(returnType, optionalLocalForInitobj);
94-
return;
95-
}
96-
97-
/*
98-
// System.Runtime.CompilerServices.Unsafe.SkipInit(out BenchmarkDotNet.Samples.CustomWithConsumable value);
99-
// return value;
100-
.locals init (
101-
[0] valuetype BenchmarkDotNet.Samples.CustomWithConsumable
102-
)
103-
104-
IL_0000: ldloca.s 0
105-
IL_0002: call void Unsafe::SkipInit<valuetype BenchmarkDotNet.Samples.CustomWithConsumable>(!!0&)
106-
IL_0007: ldloc.0
107-
IL_0008: ret
108-
*/
109-
var local = ilBuilder.DeclareLocal(returnType);
110-
ilBuilder.EmitLdloca(local);
111-
ilBuilder.Emit(OpCodes.Call, GetGenericSkipInitMethod(returnType));
112-
ilBuilder.EmitLdloc(local);
113-
ilBuilder.Emit(OpCodes.Ret);
114-
}
115-
116-
private static MethodInfo GetGenericSkipInitMethod(Type skipInitType)
117-
{
118-
return typeof(Unsafe).GetMethods(BindingFlags.Static | BindingFlags.Public)
119-
.Single(m => m.Name == nameof(Unsafe.SkipInit) && m.IsGenericMethodDefinition && m.ReturnType == typeof(void) && m.GetParameters().Single().IsOut)
120-
.MakeGenericMethod(skipInitType);
121-
}
122-
12381
protected override void EmitActionBeforeCallOverride(ILGenerator ilBuilder)
12482
{
12583
/*

src/BenchmarkDotNet/Toolchains/Roslyn/Generator.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ internal static IEnumerable<Assembly> GetAllReferences(BenchmarkCase benchmarkCa
5757
new[]
5858
{
5959
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
60-
typeof(BenchmarkCase).Assembly, // BenchmarkDotNet
61-
typeof(Unsafe).Assembly // Unsafe
60+
typeof(BenchmarkCase).Assembly // BenchmarkDotNet
6261
})
6362
.Distinct();
6463
}

0 commit comments

Comments
 (0)