@@ -434,7 +434,7 @@ private void DefineFields()
434
434
435
435
Type argLocalsType ;
436
436
Type argFieldType ;
437
- MethodInfo ? opConversion = null ;
437
+ MethodInfo opConversion = null ;
438
438
if ( parameterType . IsByRef )
439
439
{
440
440
argLocalsType = parameterType ;
@@ -582,42 +582,28 @@ private MethodInfo EmitWorkloadImplementation(string methodName)
582
582
workloadInvokeMethod . ReturnParameter ,
583
583
args ) ;
584
584
args = methodBuilder . GetEmitParameters ( args ) ;
585
- var callResultType = consumableInfo . OriginMethodReturnType ;
586
- var awaiterType = consumableInfo . GetAwaiterMethod ? . ReturnType
587
- ?? throw new InvalidOperationException ( $ "Bug: { nameof ( consumableInfo . GetAwaiterMethod ) } is null") ;
588
585
589
586
var ilBuilder = methodBuilder . GetILGenerator ( ) ;
590
587
591
588
/*
592
- .locals init (
593
- [0] valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<int32>
594
- )
595
- */
596
- var callResultLocal =
597
- ilBuilder . DeclareOptionalLocalForInstanceCall ( callResultType , consumableInfo . GetAwaiterMethod ) ;
598
- var awaiterLocal =
599
- ilBuilder . DeclareOptionalLocalForInstanceCall ( awaiterType , consumableInfo . GetResultMethod ) ;
600
-
601
- /*
602
- // return TaskSample(arg0). ... ;
603
- IL_0000: ldarg.0
604
- IL_0001: ldarg.1
605
- IL_0002: call instance class [mscorlib]System.Threading.Tasks.Task`1<int32> [BenchmarkDotNet]BenchmarkDotNet.Samples.SampleBenchmark::TaskSample(int64)
606
- */
589
+ IL_0026: ldarg.0
590
+ IL_0027: ldloc.0
591
+ IL_0028: ldloc.1
592
+ IL_0029: ldloc.2
593
+ IL_002a: ldloc.3
594
+ IL_002b: call instance class [System.Private.CoreLib]System.Threading.Tasks.Task`1<object> BenchmarkDotNet.Helpers.Runnable_0::WorkloadMethod(string, string, string, string)
595
+ */
607
596
if ( ! Descriptor . WorkloadMethod . IsStatic )
608
597
ilBuilder . Emit ( OpCodes . Ldarg_0 ) ;
609
598
ilBuilder . EmitLdargs ( args ) ;
610
599
ilBuilder . Emit ( OpCodes . Call , Descriptor . WorkloadMethod ) ;
611
600
612
601
/*
613
- // ... .GetAwaiter().GetResult();
614
- IL_0007: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<!0> class [mscorlib]System.Threading.Tasks.Task`1<int32>::GetAwaiter()
615
- IL_000c: stloc.0
616
- IL_000d: ldloca.s 0
617
- IL_000f: call instance !0 valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<int32>::GetResult()
618
- */
619
- ilBuilder . EmitInstanceCallThisValueOnStack ( callResultLocal , consumableInfo . GetAwaiterMethod ) ;
620
- ilBuilder . EmitInstanceCallThisValueOnStack ( awaiterLocal , consumableInfo . GetResultMethod ) ;
602
+ // BenchmarkDotNet.Helpers.AwaitHelper.GetResult(...);
603
+ IL_000e: call !!0 BenchmarkDotNet.Helpers.AwaitHelper::GetResult<int32>(valuetype [System.Runtime]System.Threading.Tasks.ValueTask`1<!!0>)
604
+ */
605
+
606
+ ilBuilder . Emit ( OpCodes . Call , consumableInfo . GetResultMethod ) ;
621
607
622
608
/*
623
609
IL_0014: ret
@@ -833,19 +819,6 @@ .locals init (
833
819
var skipFirstArg = workloadMethod . IsStatic ;
834
820
var argLocals = EmitDeclareArgLocals ( ilBuilder , skipFirstArg ) ;
835
821
836
- LocalBuilder ? callResultLocal = null ;
837
- LocalBuilder ? awaiterLocal = null ;
838
- if ( consumableInfo . IsAwaitable )
839
- {
840
- var callResultType = consumableInfo . OriginMethodReturnType ;
841
- var awaiterType = consumableInfo . GetAwaiterMethod ? . ReturnType
842
- ?? throw new InvalidOperationException ( $ "Bug: { nameof ( consumableInfo . GetAwaiterMethod ) } is null") ;
843
- callResultLocal =
844
- ilBuilder . DeclareOptionalLocalForInstanceCall ( callResultType , consumableInfo . GetAwaiterMethod ) ;
845
- awaiterLocal =
846
- ilBuilder . DeclareOptionalLocalForInstanceCall ( awaiterType , consumableInfo . GetResultMethod ) ;
847
- }
848
-
849
822
consumeEmitter . DeclareDisassemblyDiagnoserLocals ( ilBuilder ) ;
850
823
851
824
var notElevenLabel = ilBuilder . DefineLabel ( ) ;
@@ -870,29 +843,27 @@ .locals init (
870
843
EmitLoadArgFieldsToLocals ( ilBuilder , argLocals , skipFirstArg ) ;
871
844
872
845
/*
873
- // return TaskSample(_argField) ... ;
874
- IL_0011: ldarg.0
875
- IL_0012: ldloc.0
876
- IL_0013: call instance class [mscorlib]System.Threading.Tasks.Task`1<int32> [BenchmarkDotNet]BenchmarkDotNet.Samples.SampleBenchmark::TaskSample(int64)
877
- IL_0018: ret
846
+ IL_0026: ldarg.0
847
+ IL_0027: ldloc.0
848
+ IL_0028: ldloc.1
849
+ IL_0029: ldloc.2
850
+ IL_002a: ldloc.3
851
+ IL_002b: call instance class [System.Private.CoreLib]System.Threading.Tasks.Task`1<object> BenchmarkDotNet.Helpers.Runnable_0::WorkloadMethod(string, string, string, string)
878
852
*/
879
-
880
853
if ( ! workloadMethod . IsStatic )
854
+ {
881
855
ilBuilder . Emit ( OpCodes . Ldarg_0 ) ;
856
+ }
882
857
ilBuilder . EmitLdLocals ( argLocals ) ;
883
858
ilBuilder . Emit ( OpCodes . Call , workloadMethod ) ;
884
859
885
860
if ( consumableInfo . IsAwaitable )
886
861
{
887
862
/*
888
- // ... .GetAwaiter().GetResult();
889
- IL_0007: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<!0> class [mscorlib]System.Threading.Tasks.Task`1<int32>::GetAwaiter()
890
- IL_000c: stloc.0
891
- IL_000d: ldloca.s 0
892
- IL_000f: call instance !0 valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<int32>::GetResult()
893
- */
894
- ilBuilder . EmitInstanceCallThisValueOnStack ( callResultLocal , consumableInfo . GetAwaiterMethod ) ;
895
- ilBuilder . EmitInstanceCallThisValueOnStack ( awaiterLocal , consumableInfo . GetResultMethod ) ;
863
+ // BenchmarkDotNet.Helpers.AwaitHelper.GetResult(...);
864
+ IL_000e: call !!0 BenchmarkDotNet.Helpers.AwaitHelper::GetResult<int32>(valuetype [System.Runtime]System.Threading.Tasks.ValueTask`1<!!0>)
865
+ */
866
+ ilBuilder . Emit ( OpCodes . Call , consumableInfo . GetResultMethod ) ;
896
867
}
897
868
898
869
/*
0 commit comments