From 233fa659f455e84cdf5ba74d8cda6e9fb3f6245b Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 10 Apr 2022 22:15:09 +0300 Subject: rustc_metadata: Do not encode unnecessary module children --- compiler/rustc_data_structures/src/lib.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'compiler/rustc_data_structures/src') diff --git a/compiler/rustc_data_structures/src/lib.rs b/compiler/rustc_data_structures/src/lib.rs index 1a3fe652521..47d7d9a1c71 100644 --- a/compiler/rustc_data_structures/src/lib.rs +++ b/compiler/rustc_data_structures/src/lib.rs @@ -14,6 +14,8 @@ #![feature(control_flow_enum)] #![feature(core_intrinsics)] #![feature(extend_one)] +#![feature(generator_trait)] +#![feature(generators)] #![feature(let_else)] #![feature(hash_raw_entry)] #![feature(maybe_uninit_uninit_array)] @@ -113,6 +115,9 @@ pub mod unhash; pub use ena::undo_log; pub use ena::unify; +use std::ops::{Generator, GeneratorState}; +use std::pin::Pin; + pub struct OnDrop(pub F); impl OnDrop { @@ -131,6 +136,26 @@ impl Drop for OnDrop { } } +struct IterFromGenerator(G); + +impl + Unpin> Iterator for IterFromGenerator { + type Item = G::Yield; + + fn next(&mut self) -> Option { + match Pin::new(&mut self.0).resume(()) { + GeneratorState::Yielded(n) => Some(n), + GeneratorState::Complete(_) => None, + } + } +} + +/// An adapter for turning a generator closure into an iterator, similar to `iter::from_fn`. +pub fn iter_from_generator + Unpin>( + generator: G, +) -> impl Iterator { + IterFromGenerator(generator) +} + // See comments in src/librustc_middle/lib.rs #[doc(hidden)] pub fn __noop_fix_for_27438() {} -- cgit 1.4.1-3-g733a5