diff options
| author | kennytm <kennytm@gmail.com> | 2018-03-25 01:26:34 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-03-25 01:26:34 +0800 |
| commit | e2b89221f1fb3384ee707cef4bb78ab7fb6296ac (patch) | |
| tree | 42f50f0781c95afe4f1ee4d41c3a31c33828df01 /src/libcore | |
| parent | 311814a1a963247df61a2725150a2f3fb37218df (diff) | |
| parent | 57896abc38f56dce27ca9d4642c18f44be8db620 (diff) | |
| download | rust-e2b89221f1fb3384ee707cef4bb78ab7fb6296ac.tar.gz rust-e2b89221f1fb3384ee707cef4bb78ab7fb6296ac.zip | |
Rollup merge of #49194 - Zoxc:unsafe-generator, r=cramertj
Make resuming generators unsafe instead of the creation of immovable generators cc @withoutboats Fixes #47787
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/ops/generator.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/libcore/ops/generator.rs b/src/libcore/ops/generator.rs index dc7669d195c..4b70c5398be 100644 --- a/src/libcore/ops/generator.rs +++ b/src/libcore/ops/generator.rs @@ -56,11 +56,11 @@ pub enum GeneratorState<Y, R> { /// return "foo" /// }; /// -/// match generator.resume() { +/// match unsafe { generator.resume() } { /// GeneratorState::Yielded(1) => {} /// _ => panic!("unexpected return from resume"), /// } -/// match generator.resume() { +/// match unsafe { generator.resume() } { /// GeneratorState::Complete("foo") => {} /// _ => panic!("unexpected return from resume"), /// } @@ -98,6 +98,10 @@ pub trait Generator { /// generator will continue executing until it either yields or returns, at /// which point this function will return. /// + /// The function is unsafe because it can be used on an immovable generator. + /// After such a call, the immovable generator must not move again, but + /// this is not enforced by the compiler. + /// /// # Return value /// /// The `GeneratorState` enum returned from this function indicates what @@ -116,7 +120,7 @@ pub trait Generator { /// been returned previously. While generator literals in the language are /// guaranteed to panic on resuming after `Complete`, this is not guaranteed /// for all implementations of the `Generator` trait. - fn resume(&mut self) -> GeneratorState<Self::Yield, Self::Return>; + unsafe fn resume(&mut self) -> GeneratorState<Self::Yield, Self::Return>; } #[unstable(feature = "generator_trait", issue = "43122")] @@ -125,7 +129,7 @@ impl<'a, T> Generator for &'a mut T { type Yield = T::Yield; type Return = T::Return; - fn resume(&mut self) -> GeneratorState<Self::Yield, Self::Return> { + unsafe fn resume(&mut self) -> GeneratorState<Self::Yield, Self::Return> { (**self).resume() } } |
