@@ -393,7 +393,7 @@ public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(
393
393
{
394
394
IAsyncStateMachineBox box = GetStateMachineBox ( ref stateMachine ) ;
395
395
396
- // TThe null tests here ensure that the jit can optimize away the interface
396
+ // The null tests here ensure that the jit can optimize away the interface
397
397
// tests when TAwaiter is is a ref type.
398
398
if ( ( null != ( object ) default ( TAwaiter ) ) && ( awaiter is ITaskAwaiter ) )
399
399
{
@@ -405,62 +405,23 @@ public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(
405
405
ref ConfiguredTaskAwaitable . ConfiguredTaskAwaiter ta = ref Unsafe . As < TAwaiter , ConfiguredTaskAwaitable . ConfiguredTaskAwaiter > ( ref awaiter ) ;
406
406
TaskAwaiter . UnsafeOnCompletedInternal ( ta . m_task , box , ta . m_continueOnCapturedContext ) ;
407
407
}
408
-
409
- // Handle common {Configured}ValueTaskAwaiter<T> types. Unfortunately these need to be special-cased
410
- // individually, as we don't have good way to extract the task from a ValueTaskAwaiter<T> when we don't
411
- // know what the T is; we could make ValueTaskAwaiter<T> implement an IValueTaskAwaiter interface, but
412
- // calling a GetTask method on that would end up boxing the awaiter. This hard-coded list here is
413
- // somewhat arbitrary and is based on types currently in use with ValueTask<T> in coreclr/corefx.
414
- else if ( typeof ( TAwaiter ) == typeof ( ValueTaskAwaiter < int > ) )
415
- {
416
- var vta = ( ValueTaskAwaiter < int > ) ( object ) awaiter ;
417
- TaskAwaiter . UnsafeOnCompletedInternal ( vta . AsTask ( ) , box , continueOnCapturedContext : true ) ;
418
- }
419
- else if ( typeof ( TAwaiter ) == typeof ( ConfiguredValueTaskAwaitable < int > . ConfiguredValueTaskAwaiter ) )
420
- {
421
- var vta = ( ConfiguredValueTaskAwaitable < int > . ConfiguredValueTaskAwaiter ) ( object ) awaiter ;
422
- TaskAwaiter . UnsafeOnCompletedInternal ( vta . AsTask ( ) , box , vta . _continueOnCapturedContext ) ;
423
- }
424
- else if ( typeof ( TAwaiter ) == typeof ( ConfiguredValueTaskAwaitable < System . IO . Stream > . ConfiguredValueTaskAwaiter ) )
425
- {
426
- var vta = ( ConfiguredValueTaskAwaitable < System . IO . Stream > . ConfiguredValueTaskAwaiter ) ( object ) awaiter ;
427
- TaskAwaiter . UnsafeOnCompletedInternal ( vta . AsTask ( ) , box , vta . _continueOnCapturedContext ) ;
428
- }
429
- else if ( typeof ( TAwaiter ) == typeof ( ConfiguredValueTaskAwaitable < ArraySegment < byte > > . ConfiguredValueTaskAwaiter ) )
408
+ else if ( ( null != ( object ) default ( TAwaiter ) ) && ( awaiter is IValueTaskAwaiter ) )
430
409
{
431
- var vta = ( ConfiguredValueTaskAwaitable < ArraySegment < byte > > . ConfiguredValueTaskAwaiter ) ( object ) awaiter ;
432
- TaskAwaiter . UnsafeOnCompletedInternal ( vta . AsTask ( ) , box , vta . _continueOnCapturedContext ) ;
410
+ bool continueOnCapturedContent = true ;
411
+ Task task = ( ( IValueTaskAwaiter ) awaiter ) . GetTask ( ref continueOnCapturedContent ) ;
412
+ TaskAwaiter . UnsafeOnCompletedInternal ( task , box , continueOnCapturedContent ) ;
433
413
}
434
- else if ( typeof ( TAwaiter ) == typeof ( ConfiguredValueTaskAwaitable < object > . ConfiguredValueTaskAwaiter ) )
435
- {
436
- var vta = ( ConfiguredValueTaskAwaitable < object > . ConfiguredValueTaskAwaiter ) ( object ) awaiter ;
437
- TaskAwaiter . UnsafeOnCompletedInternal ( vta . AsTask ( ) , box , vta . _continueOnCapturedContext ) ;
438
- }
439
-
440
414
// The awaiter isn't specially known. Fall back to doing a normal await.
441
415
else
442
416
{
443
- // TODO https://github.com/dotnet/coreclr/issues/14177:
444
- // Move the code back into this method once the JIT is able to
445
- // elide it successfully when one of the previous branches is hit.
446
- AwaitArbitraryAwaiterUnsafeOnCompleted ( ref awaiter , box ) ;
447
- }
448
- }
449
-
450
- /// <summary>Schedules the specified state machine to be pushed forward when the specified awaiter completes.</summary>
451
- /// <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
452
- /// <param name="awaiter">The awaiter.</param>
453
- /// <param name="box">The state machine box.</param>
454
- private static void AwaitArbitraryAwaiterUnsafeOnCompleted < TAwaiter > ( ref TAwaiter awaiter , IAsyncStateMachineBox box )
455
- where TAwaiter : ICriticalNotifyCompletion
456
- {
457
- try
458
- {
459
- awaiter . UnsafeOnCompleted ( box . MoveNextAction ) ;
460
- }
461
- catch ( Exception e )
462
- {
463
- AsyncMethodBuilderCore . ThrowAsync ( e , targetContext : null ) ;
417
+ try
418
+ {
419
+ awaiter . UnsafeOnCompleted ( box . MoveNextAction ) ;
420
+ }
421
+ catch ( Exception e )
422
+ {
423
+ AsyncMethodBuilderCore . ThrowAsync ( e , targetContext : null ) ;
424
+ }
464
425
}
465
426
}
466
427
0 commit comments