Skip to content

Commit 3664d35

Browse files
committed
Fixed crash
1 parent 46ad322 commit 3664d35

File tree

2 files changed

+11
-20
lines changed

2 files changed

+11
-20
lines changed

src/BenchmarkDotNet/Toolchains/InProcess.Emit.Implementation/ConsumableTypeInfo.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ public ConsumableTypeInfo(Type methodReturnType)
2929
throw new InvalidOperationException("Bug: (WorkloadMethodReturnType == null");
3030

3131
var consumableField = default(FieldInfo);
32-
if (WorkloadMethodReturnType == typeof(void))
32+
if (IsAwaitable)
33+
{
34+
OverheadMethodReturnType = WorkloadMethodReturnType;
35+
}
36+
else if (WorkloadMethodReturnType == typeof(void))
3337
{
3438
IsVoid = true;
3539
OverheadMethodReturnType = WorkloadMethodReturnType;

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

+6-19
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ public override MethodBuilder EmitActionImpl(RunnableEmitter runnableEmitter, st
9393
{
9494
MethodBuilder actionImpl = actionKind switch
9595
{
96-
RunnableActionKind.Overhead => EmitWorkloadActionImpl(runnableEmitter),
97-
RunnableActionKind.Workload => EmitOverheadActionImpl(runnableEmitter),
96+
RunnableActionKind.Overhead => EmitOverheadActionImpl(runnableEmitter),
97+
RunnableActionKind.Workload => EmitWorkloadActionImpl(runnableEmitter),
9898
_ => throw new ArgumentOutOfRangeException(nameof(actionKind), actionKind, null),
9999
};
100100

@@ -195,8 +195,6 @@ class Perfolizer.Horology.IClock clock
195195
ilBuilder.Emit(OpCodes.Call, runnableEmitter.startClockMethod);
196196
ilBuilder.Emit(OpCodes.Stfld, startedClockField);
197197

198-
var exitExceptionBlockLabel = ilBuilder.DefineLabel();
199-
200198
// try { ... }
201199
ilBuilder.BeginExceptionBlock();
202200
{
@@ -217,12 +215,10 @@ class Perfolizer.Horology.IClock clock
217215
*/
218216
ilBuilder.Emit(OpCodes.Ldarg_0);
219217
ilBuilder.Emit(OpCodes.Ldfld, actionDelegateField);
220-
ilBuilder.EmitInstanceCallThisValueOnStack(null, actionInvokeMethod, argLocals);
221218
ilBuilder.Emit(OpCodes.Callvirt, actionInvokeMethod);
219+
ilBuilder.EmitStloc(valueLocal);
222220
}
223221
ilBuilder.EmitLoopEndFromFldTo0(loopStartLabel, loopHeadLabel, repeatsRemainingField, indexLocal);
224-
225-
ilBuilder.Emit(OpCodes.Leave_S, exitExceptionBlockLabel);
226222
}
227223
// catch (System.Exception) { ... }
228224
ilBuilder.BeginCatchBlock(typeof(Exception));
@@ -239,7 +235,6 @@ class Perfolizer.Horology.IClock clock
239235
ilBuilder.Emit(OpCodes.Rethrow);
240236
}
241237
ilBuilder.EndExceptionBlock();
242-
ilBuilder.MarkLabel(exitExceptionBlockLabel);
243238

244239
/*
245240
// return new System.Threading.Tasks.ValueTask<Perfolizer.Horology.ClockSpan>(startedClock.GetElapsed());
@@ -380,7 +375,6 @@ instance void __RunTask () cil managed
380375
var indexLocal = ilBuilder.DeclareLocal(typeof(long));
381376
var exceptionLocal = ilBuilder.DeclareLocal(typeof(Exception));
382377

383-
var exitExceptionBlockLabel = ilBuilder.DefineLabel();
384378
var returnLabel = ilBuilder.DefineLabel();
385379

386380
// try { ... }
@@ -450,16 +444,14 @@ instance void __RunTask () cil managed
450444
IL_0046: pop
451445
*/
452446
ilBuilder.Emit(OpCodes.Ldarg_0);
453-
ilBuilder.Emit(OpCodes.Ldfld, currentAwaiterField);
447+
ilBuilder.Emit(OpCodes.Ldflda, currentAwaiterField);
454448
ilBuilder.Emit(OpCodes.Call, getResultMethod);
455449
if (getResultMethod.ReturnType != typeof(void))
456450
{
457451
ilBuilder.Emit(OpCodes.Pop);
458452
}
459453
}
460454
ilBuilder.EmitLoopEndFromFldTo0(loopStartLabel, loopHeadLabel, repeatsRemainingField, indexLocal);
461-
462-
ilBuilder.Emit(OpCodes.Leave_S, exitExceptionBlockLabel);
463455
}
464456
// catch (System.Exception) { ... }
465457
ilBuilder.BeginCatchBlock(typeof(Exception));
@@ -479,7 +471,6 @@ instance void __RunTask () cil managed
479471
ilBuilder.Emit(OpCodes.Leave_S, returnLabel);
480472
}
481473
ilBuilder.EndExceptionBlock();
482-
ilBuilder.MarkLabel(exitExceptionBlockLabel);
483474

484475
/*
485476
// var clockspan = startedClock.GetElapsed();
@@ -518,7 +509,7 @@ instance void __RunTask () cil managed
518509
IL_0094: callvirt instance void class BenchmarkDotNet.Helpers.ManualResetValueTaskSource`1<valuetype Perfolizer.Horology.ClockSpan>::SetResult(!0)
519510
*/
520511
ilBuilder.Emit(OpCodes.Ldarg_0);
521-
ilBuilder.Emit(OpCodes.Ldflda, valueTaskSourceField);
512+
ilBuilder.Emit(OpCodes.Ldfld, valueTaskSourceField);
522513
ilBuilder.EmitLdloc(clockspanLocal);
523514
ilBuilder.Emit(OpCodes.Callvirt, valueTaskSourceField.FieldType.GetMethod(nameof(Helpers.ManualResetValueTaskSource<ClockSpan>.SetResult), BindingFlagsPublicInstance));
524515

@@ -544,7 +535,6 @@ instance void __Continuation () cil managed
544535
// init locals
545536
var exceptionLocal = ilBuilder.DeclareLocal(typeof(Exception));
546537

547-
var exitExceptionBlockLabel = ilBuilder.DefineLabel();
548538
var returnLabel = ilBuilder.DefineLabel();
549539

550540
// try { ... }
@@ -558,14 +548,12 @@ instance void __Continuation () cil managed
558548
IL_000b: pop
559549
*/
560550
ilBuilder.Emit(OpCodes.Ldarg_0);
561-
ilBuilder.Emit(OpCodes.Ldfld, currentAwaiterField);
551+
ilBuilder.Emit(OpCodes.Ldflda, currentAwaiterField);
562552
ilBuilder.Emit(OpCodes.Call, getResultMethod);
563553
if (getResultMethod.ReturnType != typeof(void))
564554
{
565555
ilBuilder.Emit(OpCodes.Pop);
566556
}
567-
568-
ilBuilder.Emit(OpCodes.Leave_S, exitExceptionBlockLabel);
569557
}
570558
// catch (System.Exception e) { ... }
571559
ilBuilder.BeginCatchBlock(typeof(Exception));
@@ -585,7 +573,6 @@ instance void __Continuation () cil managed
585573
ilBuilder.Emit(OpCodes.Leave_S, returnLabel);
586574
}
587575
ilBuilder.EndExceptionBlock();
588-
ilBuilder.MarkLabel(exitExceptionBlockLabel);
589576

590577
/*
591578
// __RunTask();

0 commit comments

Comments
 (0)