@@ -56,51 +56,6 @@ unsafe impl Send for ResumeTy {}
5656#[ unstable( feature = "gen_future" , issue = "50547" ) ]
5757unsafe impl Sync for ResumeTy { }
5858
59- /// Wrap a generator in a future.
60- ///
61- /// This function returns a `GenFuture` underneath, but hides it in `impl Trait` to give
62- /// better error messages (`impl Future` rather than `GenFuture<[closure.....]>`).
63- // This is `const` to avoid extra errors after we recover from `const async fn`
64- #[ doc( hidden) ]
65- #[ unstable( feature = "gen_future" , issue = "50547" ) ]
66- #[ rustc_const_unstable( feature = "gen_future" , issue = "50547" ) ]
67- #[ inline]
68- pub const fn from_generator < T > ( gen : T ) -> impl Future < Output = T :: Return >
69- where
70- T : crate :: ops:: Generator < ResumeTy , Yield = ( ) > ,
71- {
72- use crate :: {
73- ops:: { Generator , GeneratorState } ,
74- pin:: Pin ,
75- task:: Poll ,
76- } ;
77-
78- #[ rustc_diagnostic_item = "gen_future" ]
79- struct GenFuture < T : Generator < ResumeTy , Yield = ( ) > > ( T ) ;
80-
81- // We rely on the fact that async/await futures are immovable in order to create
82- // self-referential borrows in the underlying generator.
83- impl < T : Generator < ResumeTy , Yield = ( ) > > !Unpin for GenFuture < T > { }
84-
85- impl < T : Generator < ResumeTy , Yield = ( ) > > Future for GenFuture < T > {
86- type Output = T :: Return ;
87- #[ track_caller]
88- fn poll ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Self :: Output > {
89- // SAFETY: Safe because we're !Unpin + !Drop, and this is just a field projection.
90- let gen = unsafe { Pin :: map_unchecked_mut ( self , |s| & mut s. 0 ) } ;
91-
92- // Resume the generator, turning the `&mut Context` into a `NonNull` raw pointer. The
93- // `.await` lowering will safely cast that back to a `&mut Context`.
94- match gen. resume ( ResumeTy ( NonNull :: from ( cx) . cast :: < Context < ' static > > ( ) ) ) {
95- GeneratorState :: Yielded ( ( ) ) => Poll :: Pending ,
96- GeneratorState :: Complete ( x) => Poll :: Ready ( x) ,
97- }
98- }
99- }
100-
101- GenFuture ( gen)
102- }
103-
10459#[ lang = "get_context" ]
10560#[ doc( hidden) ]
10661#[ unstable( feature = "gen_future" , issue = "50547" ) ]
0 commit comments