Skip to content

Commit 5e14820

Browse files
committed
Use a submodule as safety boundary for BoxedResolver
1 parent 86c2d1a commit 5e14820

File tree

1 file changed

+60
-55
lines changed

1 file changed

+60
-55
lines changed

compiler/rustc_interface/src/passes.rs

+60-55
Original file line numberDiff line numberDiff line change
@@ -86,66 +86,71 @@ fn count_nodes(krate: &ast::Crate) -> usize {
8686
counter.count
8787
}
8888

89-
pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>);
90-
91-
// Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
92-
// then resolver_arenas and finally session.
93-
// The drop order is defined to be from top to bottom in RFC1857, so there is no need for
94-
// ManuallyDrop for as long as the fields are not reordered.
95-
struct BoxedResolverInner {
96-
resolver: Option<Resolver<'static>>,
97-
resolver_arenas: ResolverArenas<'static>,
98-
session: Lrc<Session>,
99-
_pin: PhantomPinned,
100-
}
89+
pub use boxed_resolver::BoxedResolver;
90+
mod boxed_resolver {
91+
use super::*;
92+
93+
pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>);
94+
95+
// Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
96+
// then resolver_arenas and finally session.
97+
// The drop order is defined to be from top to bottom in RFC1857, so there is no need for
98+
// ManuallyDrop for as long as the fields are not reordered.
99+
struct BoxedResolverInner {
100+
resolver: Option<Resolver<'static>>,
101+
resolver_arenas: ResolverArenas<'static>,
102+
session: Lrc<Session>,
103+
_pin: PhantomPinned,
104+
}
101105

102-
impl BoxedResolver {
103-
fn new<F>(session: Lrc<Session>, make_resolver: F) -> Result<(ast::Crate, Self)>
104-
where
105-
F: for<'a> FnOnce(
106-
&'a Session,
107-
&'a ResolverArenas<'a>,
108-
) -> Result<(ast::Crate, Resolver<'a>)>,
109-
{
110-
let mut boxed_resolver = Box::new(BoxedResolverInner {
111-
session,
112-
resolver_arenas: Resolver::arenas(),
113-
resolver: None,
114-
_pin: PhantomPinned,
115-
});
116-
unsafe {
117-
let (crate_, resolver) = make_resolver(
118-
std::mem::transmute::<&Session, &Session>(&boxed_resolver.session),
119-
std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>(
120-
&boxed_resolver.resolver_arenas,
121-
),
122-
)?;
123-
boxed_resolver.resolver =
124-
Some(std::mem::transmute::<Resolver<'_>, Resolver<'_>>(resolver));
125-
Ok((crate_, BoxedResolver(Pin::new_unchecked(boxed_resolver))))
106+
impl BoxedResolver {
107+
pub(super) fn new<F>(session: Lrc<Session>, make_resolver: F) -> Result<(ast::Crate, Self)>
108+
where
109+
F: for<'a> FnOnce(
110+
&'a Session,
111+
&'a ResolverArenas<'a>,
112+
) -> Result<(ast::Crate, Resolver<'a>)>,
113+
{
114+
let mut boxed_resolver = Box::new(BoxedResolverInner {
115+
session,
116+
resolver_arenas: Resolver::arenas(),
117+
resolver: None,
118+
_pin: PhantomPinned,
119+
});
120+
unsafe {
121+
let (crate_, resolver) = make_resolver(
122+
std::mem::transmute::<&Session, &Session>(&boxed_resolver.session),
123+
std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>(
124+
&boxed_resolver.resolver_arenas,
125+
),
126+
)?;
127+
boxed_resolver.resolver =
128+
Some(std::mem::transmute::<Resolver<'_>, Resolver<'_>>(resolver));
129+
Ok((crate_, BoxedResolver(Pin::new_unchecked(boxed_resolver))))
130+
}
126131
}
127-
}
128132

129-
pub fn access<F: for<'a> FnOnce(&mut Resolver<'a>) -> R, R>(&mut self, f: F) -> R {
130-
let mut resolver = unsafe {
131-
self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
132-
};
133-
f((&mut *resolver).as_mut().unwrap())
134-
}
133+
pub fn access<F: for<'a> FnOnce(&mut Resolver<'a>) -> R, R>(&mut self, f: F) -> R {
134+
let mut resolver = unsafe {
135+
self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
136+
};
137+
f((&mut *resolver).as_mut().unwrap())
138+
}
135139

136-
pub fn to_resolver_outputs(resolver: Rc<RefCell<BoxedResolver>>) -> ResolverOutputs {
137-
match Rc::try_unwrap(resolver) {
138-
Ok(resolver) => {
139-
let mut resolver = resolver.into_inner();
140-
let mut resolver = unsafe {
141-
resolver
142-
.0
143-
.as_mut()
144-
.map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
145-
};
146-
resolver.take().unwrap().into_outputs()
140+
pub fn to_resolver_outputs(resolver: Rc<RefCell<BoxedResolver>>) -> ResolverOutputs {
141+
match Rc::try_unwrap(resolver) {
142+
Ok(resolver) => {
143+
let mut resolver = resolver.into_inner();
144+
let mut resolver = unsafe {
145+
resolver
146+
.0
147+
.as_mut()
148+
.map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
149+
};
150+
resolver.take().unwrap().into_outputs()
151+
}
152+
Err(resolver) => resolver.borrow_mut().access(|resolver| resolver.clone_outputs()),
147153
}
148-
Err(resolver) => resolver.borrow_mut().access(|resolver| resolver.clone_outputs()),
149154
}
150155
}
151156
}

0 commit comments

Comments
 (0)