]> git.lizzy.rs Git - rust.git/commitdiff
Fix a deadlock
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Tue, 31 Dec 2019 13:27:20 +0000 (14:27 +0100)
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Fri, 10 Jan 2020 23:33:27 +0000 (00:33 +0100)
src/librustc_mir/monomorphize/collector.rs

index 41fbfd22e50afcc284de1936119de7865b61cd41..422a1ccd9b574da6bab3e15ad826d558e4ab1388 100644 (file)
 use rustc_hir::def_id::{DefId, DefIdMap, LOCAL_CRATE};
 use rustc_hir::itemlikevisit::ItemLikeVisitor;
 use rustc_index::bit_set::GrowableBitSet;
-
+use smallvec::SmallVec;
 use std::iter;
 
 #[derive(PartialEq)]
@@ -227,9 +227,7 @@ fn new() -> InliningMap<'tcx> {
         }
     }
 
-    fn record_accesses<I>(&mut self, source: MonoItem<'tcx>, new_targets: I)
-    where
-        I: Iterator<Item = (MonoItem<'tcx>, bool)> + ExactSizeIterator,
+    fn record_accesses(&mut self, source: MonoItem<'tcx>, new_targets: &[(MonoItem<'tcx>, bool)])
     {
         assert!(!self.index.contains_key(&source));
 
@@ -240,9 +238,9 @@ fn record_accesses<I>(&mut self, source: MonoItem<'tcx>, new_targets: I)
         self.targets.reserve(new_items_count);
         self.inlines.ensure(new_items_count_total);
 
-        for (i, (target, inline)) in new_targets.enumerate() {
-            self.targets.push(target);
-            if inline {
+        for (i, (target, inline)) in new_targets.iter().enumerate() {
+            self.targets.push(*target);
+            if *inline {
                 self.inlines.insert(i + start_index);
             }
         }
@@ -403,10 +401,12 @@ fn record_accesses<'tcx>(
         mono_item.instantiation_mode(tcx) == InstantiationMode::LocalCopy
     };
 
-    let accesses =
-        callees.into_iter().map(|mono_item| (*mono_item, is_inlining_candidate(mono_item)));
+    let accesses: SmallVec<[_; 128]> = callees
+        .into_iter()
+        .map(|mono_item| (*mono_item, is_inlining_candidate(mono_item)))
+        .collect();
 
-    inlining_map.lock_mut().record_accesses(caller, accesses);
+    inlining_map.lock_mut().record_accesses(caller, &accesses);
 }
 
 fn check_recursion_limit<'tcx>(