about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2021-06-01 10:49:42 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2021-06-08 19:24:17 +0200
commit5e148200d457ef7f6740990d15b7b9c534e3aaeb (patch)
treefe01a047e7d5f0da253559502c015da2f2237ae8
parent86c2d1a2a7cb98bf5ff75e8236dea924c7a12638 (diff)
downloadrust-5e148200d457ef7f6740990d15b7b9c534e3aaeb.tar.gz
rust-5e148200d457ef7f6740990d15b7b9c534e3aaeb.zip
Use a submodule as safety boundary for BoxedResolver
-rw-r--r--compiler/rustc_interface/src/passes.rs115
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()),
         }
     }
 }