@@ -29,18 +29,19 @@ A syntactical example of a generator is:
2929#![feature(generators, generator_trait)]
3030
3131use std :: ops :: {Generator , GeneratorState };
32+ use std :: pin :: Pin ;
3233
3334fn main () {
3435 let mut generator = || {
3536 yield 1 ;
3637 return " foo"
3738 };
3839
39- match unsafe { generator . resume () } {
40+ match Pin :: new ( & mut generator ) . resume () {
4041 GeneratorState :: Yielded (1 ) => {}
4142 _ => panic! (" unexpected value from resume" ),
4243 }
43- match unsafe { generator . resume () } {
44+ match Pin :: new ( & mut generator ) . resume () {
4445 GeneratorState :: Complete (" foo" ) => {}
4546 _ => panic! (" unexpected value from resume" ),
4647 }
@@ -60,6 +61,7 @@ prints all numbers in order:
6061#![feature(generators, generator_trait)]
6162
6263use std :: ops :: Generator ;
64+ use std :: pin :: Pin ;
6365
6466fn main () {
6567 let mut generator = || {
@@ -69,9 +71,9 @@ fn main() {
6971 };
7072
7173 println! (" 1" );
72- unsafe { generator . resume () } ;
74+ Pin :: new ( & mut generator ) . resume ();
7375 println! (" 3" );
74- unsafe { generator . resume () } ;
76+ Pin :: new ( & mut generator ) . resume ();
7577 println! (" 5" );
7678}
7779```
@@ -86,13 +88,14 @@ Feedback on the design and usage is always appreciated!
8688The ` Generator ` trait in ` std::ops ` currently looks like:
8789
8890```
89- # #![feature(generator_trait)]
91+ # #![feature(arbitrary_self_types, generator_trait)]
9092# use std::ops::GeneratorState;
93+ # use std::pin::Pin;
9194
9295pub trait Generator {
9396 type Yield;
9497 type Return;
95- unsafe fn resume(&mut self ) -> GeneratorState<Self::Yield, Self::Return>;
98+ fn resume(self: Pin< &mut Self> ) -> GeneratorState<Self::Yield, Self::Return>;
9699}
97100```
98101
@@ -167,6 +170,7 @@ Let's take a look at an example to see what's going on here:
167170#![feature(generators, generator_trait)]
168171
169172use std :: ops :: Generator ;
173+ use std :: pin :: Pin ;
170174
171175fn main () {
172176 let ret = " foo" ;
@@ -175,17 +179,18 @@ fn main() {
175179 return ret
176180 };
177181
178- unsafe { generator . resume () } ;
179- unsafe { generator . resume () } ;
182+ Pin :: new ( & mut generator ) . resume ();
183+ Pin :: new ( & mut generator ) . resume ();
180184}
181185```
182186
183187This generator literal will compile down to something similar to:
184188
185189``` rust
186- #![feature(generators, generator_trait)]
190+ #![feature(arbitrary_self_types, generators, generator_trait)]
187191
188192use std :: ops :: {Generator , GeneratorState };
193+ use std :: pin :: Pin ;
189194
190195fn main () {
191196 let ret = " foo" ;
@@ -200,9 +205,9 @@ fn main() {
200205 type Yield = i32 ;
201206 type Return = & 'static str ;
202207
203- unsafe fn resume (& mut self ) -> GeneratorState <i32 , & 'static str > {
208+ fn resume (mut self : Pin < & mut Self > ) -> GeneratorState <i32 , & 'static str > {
204209 use std :: mem;
205- match mem :: replace (self , __Generator :: Done ) {
210+ match mem :: replace (& mut * self , __Generator :: Done ) {
206211 __Generator :: Start (s ) => {
207212 * self = __Generator :: Yield1 (s );
208213 GeneratorState :: Yielded (1 )
@@ -223,8 +228,8 @@ fn main() {
223228 __Generator :: Start (ret )
224229 };
225230
226- unsafe { generator . resume () } ;
227- unsafe { generator . resume () } ;
231+ Pin :: new ( & mut generator ) . resume ();
232+ Pin :: new ( & mut generator ) . resume ();
228233}
229234```
230235
0 commit comments