]> git.lizzy.rs Git - rust.git/commitdiff
rustc: use AccumulateVec in Substs::for_item.
authorEduard-Mihai Burtescu <edy.burt@gmail.com>
Wed, 16 May 2018 09:37:36 +0000 (12:37 +0300)
committerEduard-Mihai Burtescu <edy.burt@gmail.com>
Mon, 21 May 2018 09:13:19 +0000 (12:13 +0300)
src/librustc/ty/subst.rs

index 57401ac19f3c565bf614877e783b8cb09f14481c..f44e1533f520a11792b82121f8c1d84c7d4139b0 100644 (file)
@@ -17,6 +17,7 @@
 use serialize::{self, Encodable, Encoder, Decodable, Decoder};
 use syntax_pos::{Span, DUMMY_SP};
 use rustc_data_structures::accumulate_vec::AccumulateVec;
+use rustc_data_structures::array_vec::ArrayVec;
 
 use core::intrinsics;
 use std::fmt;
@@ -176,7 +177,12 @@ pub fn for_item<F>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
     where F: FnMut(&ty::GenericParamDef, &[Kind<'tcx>]) -> Kind<'tcx>
     {
         let defs = tcx.generics_of(def_id);
-        let mut substs = Vec::with_capacity(defs.count());
+        let count = defs.count();
+        let mut substs = if count <= 8 {
+            AccumulateVec::Array(ArrayVec::new())
+        } else {
+            AccumulateVec::Heap(Vec::with_capacity(count))
+        };
         Substs::fill_item(&mut substs, tcx, defs, &mut mk_kind);
         tcx.intern_substs(&substs)
     }
@@ -188,14 +194,15 @@ pub fn extend_to<F>(&self,
                         -> &'tcx Substs<'tcx>
     where F: FnMut(&ty::GenericParamDef, &[Kind<'tcx>]) -> Kind<'tcx>
     {
-        let defs = tcx.generics_of(def_id);
-        let mut result = Vec::with_capacity(defs.count());
-        result.extend(self[..].iter().cloned());
-        Substs::fill_single(&mut result, defs, &mut mk_kind);
-        tcx.intern_substs(&result)
+        Substs::for_item(tcx, def_id, |param, substs| {
+            match self.get(param.index as usize) {
+                Some(&kind) => kind,
+                None => mk_kind(param, substs),
+            }
+        })
     }
 
-    fn fill_item<F>(substs: &mut Vec<Kind<'tcx>>,
+    fn fill_item<F>(substs: &mut AccumulateVec<[Kind<'tcx>; 8]>,
                     tcx: TyCtxt<'a, 'gcx, 'tcx>,
                     defs: &ty::Generics,
                     mk_kind: &mut F)
@@ -209,7 +216,7 @@ fn fill_item<F>(substs: &mut Vec<Kind<'tcx>>,
         Substs::fill_single(substs, defs, mk_kind)
     }
 
-    fn fill_single<F>(substs: &mut Vec<Kind<'tcx>>,
+    fn fill_single<F>(substs: &mut AccumulateVec<[Kind<'tcx>; 8]>,
                       defs: &ty::Generics,
                       mk_kind: &mut F)
     where F: FnMut(&ty::GenericParamDef, &[Kind<'tcx>]) -> Kind<'tcx>
@@ -217,7 +224,10 @@ fn fill_single<F>(substs: &mut Vec<Kind<'tcx>>,
         for param in &defs.params {
             let kind = mk_kind(param, substs);
             assert_eq!(param.index as usize, substs.len());
-            substs.push(kind);
+            match *substs {
+                AccumulateVec::Array(ref mut arr) => arr.push(kind),
+                AccumulateVec::Heap(ref mut vec) => vec.push(kind),
+            }
         }
     }