From 143b8816a3cc478ec8d214efade98245eb5b3c82 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Wed, 1 Apr 2020 14:29:55 +0200 Subject: [PATCH] Stop leaking memory. --- src/librustc_query_system/query/caches.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/librustc_query_system/query/caches.rs b/src/librustc_query_system/query/caches.rs index d921bcdcdd3..e2fe6f7207b 100644 --- a/src/librustc_query_system/query/caches.rs +++ b/src/librustc_query_system/query/caches.rs @@ -143,16 +143,13 @@ impl<'tcx, K: Eq + Hash, V: 'tcx> CacheSelector for ArenaCacheSelector<'tc } pub struct ArenaCache<'tcx, K, V> { - arena: WorkerLocal<&'tcx TypedArena<(V, DepNodeIndex)>>, - phantom: PhantomData, + arena: WorkerLocal>, + phantom: PhantomData<(K, &'tcx V)>, } impl<'tcx, K, V> Default for ArenaCache<'tcx, K, V> { fn default() -> Self { - ArenaCache { - arena: WorkerLocal::new(|_| &*Box::leak(Box::new(TypedArena::default()))), - phantom: PhantomData, - } + ArenaCache { arena: WorkerLocal::new(|_| TypedArena::default()), phantom: PhantomData } } } @@ -162,7 +159,8 @@ impl<'tcx, K: Eq + Hash, V: 'tcx> QueryStorage for ArenaCache<'tcx, K, V> { fn store_nocache(&self, value: Self::Value) -> Self::Stored { let value = self.arena.alloc((value, DepNodeIndex::INVALID)); - &value.0 + let value = unsafe { &*(&value.0 as *const _) }; + &value } } @@ -204,6 +202,7 @@ fn complete( index: DepNodeIndex, ) -> Self::Stored { let value = self.arena.alloc((value, index)); + let value = unsafe { &*(value as *const _) }; lock_sharded_storage.insert(key, value); &value.0 }