1
Fork 0

Use explicit drop impl

This commit is contained in:
bjorn3 2021-06-09 14:47:01 +02:00
parent 2bf839e870
commit e1aa45b64d

View file

@ -93,15 +93,20 @@ mod boxed_resolver {
pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>); pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>);
struct BoxedResolverInner {
session: Lrc<Session>,
resolver_arenas: Option<ResolverArenas<'static>>,
resolver: Option<Resolver<'static>>,
_pin: PhantomPinned,
}
// Note: Drop order is important to prevent dangling references. Resolver must be dropped first, // Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
// then resolver_arenas and finally session. // 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 impl Drop for BoxedResolverInner {
// ManuallyDrop for as long as the fields are not reordered. fn drop(&mut self) {
struct BoxedResolverInner { self.resolver.take();
resolver: Option<Resolver<'static>>, self.resolver_arenas.take();
resolver_arenas: ResolverArenas<'static>, }
session: Lrc<Session>,
_pin: PhantomPinned,
} }
impl BoxedResolver { impl BoxedResolver {
@ -114,7 +119,7 @@ mod boxed_resolver {
{ {
let mut boxed_resolver = Box::new(BoxedResolverInner { let mut boxed_resolver = Box::new(BoxedResolverInner {
session, session,
resolver_arenas: Resolver::arenas(), resolver_arenas: Some(Resolver::arenas()),
resolver: None, resolver: None,
_pin: PhantomPinned, _pin: PhantomPinned,
}); });
@ -122,7 +127,7 @@ mod boxed_resolver {
let (crate_, resolver) = make_resolver( let (crate_, resolver) = make_resolver(
std::mem::transmute::<&Session, &Session>(&boxed_resolver.session), std::mem::transmute::<&Session, &Session>(&boxed_resolver.session),
std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>( std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>(
&boxed_resolver.resolver_arenas, boxed_resolver.resolver_arenas.as_ref().unwrap(),
), ),
)?; )?;
boxed_resolver.resolver = boxed_resolver.resolver =