diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2021-06-01 10:49:42 +0200 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2021-06-08 19:24:17 +0200 |
| commit | 5e148200d457ef7f6740990d15b7b9c534e3aaeb (patch) | |
| tree | fe01a047e7d5f0da253559502c015da2f2237ae8 | |
| parent | 86c2d1a2a7cb98bf5ff75e8236dea924c7a12638 (diff) | |
| download | rust-5e148200d457ef7f6740990d15b7b9c534e3aaeb.tar.gz rust-5e148200d457ef7f6740990d15b7b9c534e3aaeb.zip | |
Use a submodule as safety boundary for BoxedResolver
| -rw-r--r-- | compiler/rustc_interface/src/passes.rs | 115 |
1 files changed, 60 insertions, 55 deletions
diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 19fa5043295..a6115762a82 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -86,66 +86,71 @@ fn count_nodes(krate: &ast::Crate) -> usize { counter.count } -pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>); - -// Note: Drop order is important to prevent dangling references. Resolver must be dropped first, -// then resolver_arenas and finally session. -// The drop order is defined to be from top to bottom in RFC1857, so there is no need for -// ManuallyDrop for as long as the fields are not reordered. -struct BoxedResolverInner { - resolver: Option<Resolver<'static>>, - resolver_arenas: ResolverArenas<'static>, - session: Lrc<Session>, - _pin: PhantomPinned, -} +pub use boxed_resolver::BoxedResolver; +mod boxed_resolver { + use super::*; + + pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>); + + // Note: Drop order is important to prevent dangling references. Resolver must be dropped first, + // then resolver_arenas and finally session. + // The drop order is defined to be from top to bottom in RFC1857, so there is no need for + // ManuallyDrop for as long as the fields are not reordered. + struct BoxedResolverInner { + resolver: Option<Resolver<'static>>, + resolver_arenas: ResolverArenas<'static>, + session: Lrc<Session>, + _pin: PhantomPinned, + } -impl BoxedResolver { - fn new<F>(session: Lrc<Session>, make_resolver: F) -> Result<(ast::Crate, Self)> - where - F: for<'a> FnOnce( - &'a Session, - &'a ResolverArenas<'a>, - ) -> Result<(ast::Crate, Resolver<'a>)>, - { - let mut boxed_resolver = Box::new(BoxedResolverInner { - session, - resolver_arenas: Resolver::arenas(), - resolver: None, - _pin: PhantomPinned, - }); - unsafe { - let (crate_, resolver) = make_resolver( - std::mem::transmute::<&Session, &Session>(&boxed_resolver.session), - std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>( - &boxed_resolver.resolver_arenas, - ), - )?; - boxed_resolver.resolver = - Some(std::mem::transmute::<Resolver<'_>, Resolver<'_>>(resolver)); - Ok((crate_, BoxedResolver(Pin::new_unchecked(boxed_resolver)))) + impl BoxedResolver { + pub(super) fn new<F>(session: Lrc<Session>, make_resolver: F) -> Result<(ast::Crate, Self)> + where + F: for<'a> FnOnce( + &'a Session, + &'a ResolverArenas<'a>, + ) -> Result<(ast::Crate, Resolver<'a>)>, + { + let mut boxed_resolver = Box::new(BoxedResolverInner { + session, + resolver_arenas: Resolver::arenas(), + resolver: None, + _pin: PhantomPinned, + }); + unsafe { + let (crate_, resolver) = make_resolver( + std::mem::transmute::<&Session, &Session>(&boxed_resolver.session), + std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>( + &boxed_resolver.resolver_arenas, + ), + )?; + boxed_resolver.resolver = + Some(std::mem::transmute::<Resolver<'_>, Resolver<'_>>(resolver)); + Ok((crate_, BoxedResolver(Pin::new_unchecked(boxed_resolver)))) + } } - } - pub fn access<F: for<'a> FnOnce(&mut Resolver<'a>) -> R, R>(&mut self, f: F) -> R { - let mut resolver = unsafe { - self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver) - }; - f((&mut *resolver).as_mut().unwrap()) - } + pub fn access<F: for<'a> FnOnce(&mut Resolver<'a>) -> R, R>(&mut self, f: F) -> R { + let mut resolver = unsafe { + self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver) + }; + f((&mut *resolver).as_mut().unwrap()) + } - pub fn to_resolver_outputs(resolver: Rc<RefCell<BoxedResolver>>) -> ResolverOutputs { - match Rc::try_unwrap(resolver) { - Ok(resolver) => { - let mut resolver = resolver.into_inner(); - let mut resolver = unsafe { - resolver - .0 - .as_mut() - .map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver) - }; - resolver.take().unwrap().into_outputs() + pub fn to_resolver_outputs(resolver: Rc<RefCell<BoxedResolver>>) -> ResolverOutputs { + match Rc::try_unwrap(resolver) { + Ok(resolver) => { + let mut resolver = resolver.into_inner(); + let mut resolver = unsafe { + resolver + .0 + .as_mut() + .map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver) + }; + resolver.take().unwrap().into_outputs() + } + Err(resolver) => resolver.borrow_mut().access(|resolver| resolver.clone_outputs()), } - Err(resolver) => resolver.borrow_mut().access(|resolver| resolver.clone_outputs()), } } } |
