Use explicit drop impl
This commit is contained in:
parent
2bf839e870
commit
e1aa45b64d
1 changed files with 14 additions and 9 deletions
|
@ -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 =
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue