@@ -591,83 +591,89 @@ private static bool QueueContinuationFollowUpActionIfNecessary<T, TOps>(T task,
591591#pragma warning disable CA1859
592592 // When a Task-returning thunk gets a continuation result
593593 // it calls here to make a Task that awaits on the current async state.
594- private static Task < T ? > FinalizeTaskReturningThunk < T > ( Continuation continuation , Exception ex )
594+ private static Task < T ? > FinalizeTaskReturningThunk < T > ( Continuation continuation )
595595 {
596- if ( continuation is not null )
597- {
598- Continuation finalContinuation = new Continuation ( ) ;
599-
600- // Note that the exact location the return value is placed is tied
601- // into getAsyncResumptionStub in the VM, so do not change this
602- // without also changing that code (and the JIT).
603- if ( RuntimeHelpers . IsReferenceOrContainsReferences < T > ( ) )
604- {
605- finalContinuation . Flags = CorInfoContinuationFlags . CORINFO_CONTINUATION_RESULT_IN_GCDATA | CorInfoContinuationFlags . CORINFO_CONTINUATION_NEEDS_EXCEPTION ;
606- finalContinuation . GCData = new object [ 1 ] ;
607- }
608- else
609- {
610- finalContinuation . Flags = CorInfoContinuationFlags . CORINFO_CONTINUATION_NEEDS_EXCEPTION ;
611- finalContinuation . Data = new byte [ Unsafe . SizeOf < T > ( ) ] ;
612- }
596+ Continuation finalContinuation = new Continuation ( ) ;
613597
614- continuation . Next = finalContinuation ;
615-
616- ThunkTask < T ? > result = new ( ) ;
617- result . HandleSuspended ( continuation ) ;
618- return result ;
598+ // Note that the exact location the return value is placed is tied
599+ // into getAsyncResumptionStub in the VM, so do not change this
600+ // without also changing that code (and the JIT).
601+ if ( RuntimeHelpers . IsReferenceOrContainsReferences < T > ( ) )
602+ {
603+ finalContinuation . Flags = CorInfoContinuationFlags . CORINFO_CONTINUATION_RESULT_IN_GCDATA | CorInfoContinuationFlags . CORINFO_CONTINUATION_NEEDS_EXCEPTION ;
604+ finalContinuation . GCData = new object [ 1 ] ;
619605 }
620606 else
621607 {
622- Task < T ? > task = new ( ) ;
623- // Tail of AsyncTaskMethodBuilderT.SetException
624- bool successfullySet = ex is OperationCanceledException oce ?
625- task . TrySetCanceled ( oce . CancellationToken , oce ) :
626- task . TrySetException ( ex ) ;
627-
628- Debug . Assert ( successfullySet ) ;
629- return task ;
608+ finalContinuation . Flags = CorInfoContinuationFlags . CORINFO_CONTINUATION_NEEDS_EXCEPTION ;
609+ finalContinuation . Data = new byte [ Unsafe . SizeOf < T > ( ) ] ;
630610 }
611+
612+ continuation . Next = finalContinuation ;
613+
614+ ThunkTask < T ? > result = new ( ) ;
615+ result . HandleSuspended ( continuation ) ;
616+ return result ;
631617 }
632618
633- private static Task FinalizeTaskReturningThunk ( Continuation continuation , Exception ex )
619+ private static Task FinalizeTaskReturningThunk ( Continuation continuation )
634620 {
635- if ( continuation is not null )
621+ Continuation finalContinuation = new Continuation
636622 {
637- Continuation finalContinuation = new Continuation
638- {
639- Flags = CorInfoContinuationFlags . CORINFO_CONTINUATION_NEEDS_EXCEPTION ,
640- } ;
641- continuation . Next = finalContinuation ;
623+ Flags = CorInfoContinuationFlags . CORINFO_CONTINUATION_NEEDS_EXCEPTION ,
624+ } ;
625+ continuation . Next = finalContinuation ;
642626
643- ThunkTask result = new ( ) ;
644- result . HandleSuspended ( continuation ) ;
645- return result ;
646- }
647- else
648- {
649- Debug . Assert ( ex is not null ) ;
650- Task task = new ( ) ;
651- // Tail of AsyncTaskMethodBuilderT.SetException
652- bool successfullySet = ex is OperationCanceledException oce ?
653- task . TrySetCanceled ( oce . CancellationToken , oce ) :
654- task . TrySetException ( ex ) ;
655-
656- Debug . Assert ( successfullySet ) ;
657- return task ;
658- }
627+ ThunkTask result = new ( ) ;
628+ result . HandleSuspended ( continuation ) ;
629+ return result ;
659630 }
660631
661- private static ValueTask < T ? > FinalizeValueTaskReturningThunk < T > ( Continuation continuation , Exception ex )
632+ private static ValueTask < T ? > FinalizeValueTaskReturningThunk < T > ( Continuation continuation )
662633 {
663634 // We only come to these methods in the expensive case (already
664635 // suspended), so ValueTask optimization here is not relevant.
665- return new ValueTask < T ? > ( FinalizeTaskReturningThunk < T > ( continuation , ex ) ) ;
636+ return new ValueTask < T ? > ( FinalizeTaskReturningThunk < T > ( continuation ) ) ;
637+ }
638+
639+ private static ValueTask FinalizeValueTaskReturningThunk ( Continuation continuation )
640+ {
641+ return new ValueTask ( FinalizeTaskReturningThunk ( continuation ) ) ;
642+ }
643+
644+ private static Task < T ? > TaskFromException < T > ( Exception ex )
645+ {
646+ Task < T ? > task = new ( ) ;
647+ bool successfullySet = ex is OperationCanceledException oce ?
648+ task . TrySetCanceled ( oce . CancellationToken , oce ) :
649+ task . TrySetException ( ex ) ;
650+
651+ Debug . Assert ( successfullySet ) ;
652+ return task ;
653+ }
654+
655+ private static Task TaskFromException ( Exception ex )
656+ {
657+ Task task = new ( ) ;
658+ // Tail of AsyncTaskMethodBuilderT.SetException
659+ bool successfullySet = ex is OperationCanceledException oce ?
660+ task . TrySetCanceled ( oce . CancellationToken , oce ) :
661+ task . TrySetException ( ex ) ;
662+
663+ Debug . Assert ( successfullySet ) ;
664+ return task ;
665+ }
666+
667+ private static ValueTask ValueTaskFromException ( Exception ex )
668+ {
669+ // We only come to these methods in the expensive case (exception),
670+ // so ValueTask optimization here is not relevant.
671+ return new ValueTask ( TaskFromException ( ex ) ) ;
666672 }
667673
668- private static ValueTask FinalizeValueTaskReturningThunk ( Continuation continuation , Exception ex )
674+ private static ValueTask < T ? > ValueTaskFromException < T > ( Exception ex )
669675 {
670- return new ValueTask ( FinalizeTaskReturningThunk ( continuation , ex ) ) ;
676+ return new ValueTask < T ? > ( TaskFromException < T > ( ex ) ) ;
671677 }
672678
673679 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
0 commit comments