@@ -59,55 +59,64 @@ public bool IsCompleted
5959 /// <summary>Schedules the continuation action for the <see cref="ConfiguredValueTaskAwaitable"/>.</summary>
6060 public void OnCompleted ( Action continuation )
6161 {
62- if ( _value . ObjectIsTask )
62+ object obj = _value . _obj ;
63+ Debug . Assert ( obj == null || obj is Task || obj is IValueTaskSource ) ;
64+
65+ if ( obj is Task t )
6366 {
64- _value . UnsafeGetTask ( ) . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
67+ t . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
6568 }
66- else if ( _value . _obj != null )
69+ else if ( obj != null )
6770 {
68- _value . UnsafeGetValueTaskSource ( ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
71+ Unsafe . As < IValueTaskSource > ( obj ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
6972 ValueTaskSourceOnCompletedFlags . FlowExecutionContext |
70- ( _value . ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ) ;
73+ ( _value . _continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ) ;
7174 }
7275 else
7376 {
74- ValueTask . CompletedTask . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
77+ ValueTask . CompletedTask . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
7578 }
7679 }
7780
7881 /// <summary>Schedules the continuation action for the <see cref="ConfiguredValueTaskAwaitable"/>.</summary>
7982 public void UnsafeOnCompleted ( Action continuation )
8083 {
81- if ( _value . ObjectIsTask )
84+ object obj = _value . _obj ;
85+ Debug . Assert ( obj == null || obj is Task || obj is IValueTaskSource ) ;
86+
87+ if ( obj is Task t )
8288 {
83- _value . UnsafeGetTask ( ) . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
89+ t . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
8490 }
85- else if ( _value . _obj != null )
91+ else if ( obj != null )
8692 {
87- _value . UnsafeGetValueTaskSource ( ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
88- _value . ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
93+ Unsafe . As < IValueTaskSource > ( obj ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
94+ _value . _continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
8995 }
9096 else
9197 {
92- ValueTask . CompletedTask . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
98+ ValueTask . CompletedTask . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
9399 }
94100 }
95101
96102#if CORECLR
97103 void IStateMachineBoxAwareAwaiter . AwaitUnsafeOnCompleted ( IAsyncStateMachineBox box )
98104 {
99- if ( _value . ObjectIsTask )
105+ object obj = _value . _obj ;
106+ Debug . Assert ( obj == null || obj is Task || obj is IValueTaskSource ) ;
107+
108+ if ( obj is Task t )
100109 {
101- TaskAwaiter . UnsafeOnCompletedInternal ( _value . UnsafeGetTask ( ) , box , _value . ContinueOnCapturedContext ) ;
110+ TaskAwaiter . UnsafeOnCompletedInternal ( t , box , _value . _continueOnCapturedContext ) ;
102111 }
103- else if ( _value . _obj != null )
112+ else if ( obj != null )
104113 {
105- _value . UnsafeGetValueTaskSource ( ) . OnCompleted ( ValueTaskAwaiter . s_invokeAsyncStateMachineBox , box , _value . _token ,
106- _value . ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
114+ Unsafe . As < IValueTaskSource > ( obj ) . OnCompleted ( ValueTaskAwaiter . s_invokeAsyncStateMachineBox , box , _value . _token ,
115+ _value . _continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
107116 }
108117 else
109118 {
110- TaskAwaiter . UnsafeOnCompletedInternal ( Task . CompletedTask , box , _value . ContinueOnCapturedContext ) ;
119+ TaskAwaiter . UnsafeOnCompletedInternal ( Task . CompletedTask , box , _value . _continueOnCapturedContext ) ;
111120 }
112121 }
113122#endif
@@ -161,55 +170,64 @@ public bool IsCompleted
161170 /// <summary>Schedules the continuation action for the <see cref="ConfiguredValueTaskAwaitable{TResult}"/>.</summary>
162171 public void OnCompleted ( Action continuation )
163172 {
164- if ( _value . ObjectIsTask )
173+ object obj = _value . _obj ;
174+ Debug . Assert ( obj == null || obj is Task < TResult > || obj is IValueTaskSource < TResult > ) ;
175+
176+ if ( obj is Task < TResult > t )
165177 {
166- _value . UnsafeGetTask ( ) . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
178+ t . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
167179 }
168- else if ( _value . _obj != null )
180+ else if ( obj != null )
169181 {
170- _value . UnsafeGetValueTaskSource ( ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
182+ Unsafe . As < IValueTaskSource < TResult > > ( obj ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
171183 ValueTaskSourceOnCompletedFlags . FlowExecutionContext |
172- ( _value . ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ) ;
184+ ( _value . _continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ) ;
173185 }
174186 else
175187 {
176- ValueTask . CompletedTask . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
188+ ValueTask . CompletedTask . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . OnCompleted ( continuation ) ;
177189 }
178190 }
179191
180192 /// <summary>Schedules the continuation action for the <see cref="ConfiguredValueTaskAwaitable{TResult}"/>.</summary>
181193 public void UnsafeOnCompleted ( Action continuation )
182194 {
183- if ( _value . ObjectIsTask )
195+ object obj = _value . _obj ;
196+ Debug . Assert ( obj == null || obj is Task < TResult > || obj is IValueTaskSource < TResult > ) ;
197+
198+ if ( obj is Task < TResult > t )
184199 {
185- _value . UnsafeGetTask ( ) . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
200+ t . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
186201 }
187- else if ( _value . _obj != null )
202+ else if ( obj != null )
188203 {
189- _value . UnsafeGetValueTaskSource ( ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
190- _value . ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
204+ Unsafe . As < IValueTaskSource < TResult > > ( obj ) . OnCompleted ( ValueTaskAwaiter . s_invokeActionDelegate , continuation , _value . _token ,
205+ _value . _continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
191206 }
192207 else
193208 {
194- ValueTask . CompletedTask . ConfigureAwait ( _value . ContinueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
209+ ValueTask . CompletedTask . ConfigureAwait ( _value . _continueOnCapturedContext ) . GetAwaiter ( ) . UnsafeOnCompleted ( continuation ) ;
195210 }
196211 }
197212
198213#if CORECLR
199214 void IStateMachineBoxAwareAwaiter . AwaitUnsafeOnCompleted ( IAsyncStateMachineBox box )
200215 {
201- if ( _value . ObjectIsTask )
216+ object obj = _value . _obj ;
217+ Debug . Assert ( obj == null || obj is Task < TResult > || obj is IValueTaskSource < TResult > ) ;
218+
219+ if ( obj is Task < TResult > t )
202220 {
203- TaskAwaiter . UnsafeOnCompletedInternal ( _value . UnsafeGetTask ( ) , box , _value . ContinueOnCapturedContext ) ;
221+ TaskAwaiter . UnsafeOnCompletedInternal ( t , box , _value . _continueOnCapturedContext ) ;
204222 }
205- else if ( _value . _obj != null )
223+ else if ( obj != null )
206224 {
207- _value . UnsafeGetValueTaskSource ( ) . OnCompleted ( ValueTaskAwaiter . s_invokeAsyncStateMachineBox , box , _value . _token ,
208- _value . ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
225+ Unsafe . As < IValueTaskSource < TResult > > ( obj ) . OnCompleted ( ValueTaskAwaiter . s_invokeAsyncStateMachineBox , box , _value . _token ,
226+ _value . _continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags . UseSchedulingContext : ValueTaskSourceOnCompletedFlags . None ) ;
209227 }
210228 else
211229 {
212- TaskAwaiter . UnsafeOnCompletedInternal ( Task . CompletedTask , box , _value . ContinueOnCapturedContext ) ;
230+ TaskAwaiter . UnsafeOnCompletedInternal ( Task . CompletedTask , box , _value . _continueOnCapturedContext ) ;
213231 }
214232 }
215233#endif
0 commit comments