about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMark-Simulacrum <mark.simulacrum@gmail.com>2016-11-25 21:54:48 -0700
committerMark-Simulacrum <mark.simulacrum@gmail.com>2016-11-28 18:09:15 -0700
commit8b82fd7a94313140d8c745bb8cc647a953e07d9e (patch)
tree0a1d6dea9f05473277f7e45cc77332c7971cf590
parenta79c80d0b0f3fa15111ba88fe7260f86ff6df410 (diff)
downloadrust-8b82fd7a94313140d8c745bb8cc647a953e07d9e.tar.gz
rust-8b82fd7a94313140d8c745bb8cc647a953e07d9e.zip
Remove allocation in push_type_params
-rw-r--r--src/librustc_trans/trans_item.rs20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/librustc_trans/trans_item.rs b/src/librustc_trans/trans_item.rs
index 979c2206fc1..322c5eb6e18 100644
--- a/src/librustc_trans/trans_item.rs
+++ b/src/librustc_trans/trans_item.rs
@@ -36,6 +36,7 @@ use glue;
 use abi::{Abi, FnType};
 use back::symbol_names;
 use std::fmt::Write;
+use std::iter;
 
 #[derive(PartialEq, Eq, Clone, Copy, Debug, Hash)]
 pub enum TransItem<'tcx> {
@@ -410,7 +411,7 @@ impl<'a, 'tcx> DefPathBasedNames<'a, 'tcx> {
             ty::TyFloat(ast::FloatTy::F64) => output.push_str("f64"),
             ty::TyAdt(adt_def, substs) => {
                 self.push_def_path(adt_def.did, output);
-                self.push_type_params(substs, &[], output);
+                self.push_type_params(substs, iter::empty(), output);
             },
             ty::TyTuple(component_types) => {
                 output.push('(');
@@ -461,7 +462,7 @@ impl<'a, 'tcx> DefPathBasedNames<'a, 'tcx> {
                 if let Some(principal) = trait_data.principal() {
                     self.push_def_path(principal.def_id(), output);
                     self.push_type_params(principal.skip_binder().substs,
-                        &trait_data.projection_bounds().collect::<Vec<_>>()[..],
+                        trait_data.projection_bounds(),
                         output);
                 }
             },
@@ -513,7 +514,7 @@ impl<'a, 'tcx> DefPathBasedNames<'a, 'tcx> {
                 self.push_def_path(def_id, output);
                 let generics = self.tcx.item_generics(self.tcx.closure_base_def_id(def_id));
                 let substs = closure_substs.substs.truncate_to(self.tcx, generics);
-                self.push_type_params(substs, &[], output);
+                self.push_type_params(substs, iter::empty(), output);
             }
             ty::TyError |
             ty::TyInfer(_) |
@@ -553,11 +554,14 @@ impl<'a, 'tcx> DefPathBasedNames<'a, 'tcx> {
         output.pop();
     }
 
-    pub fn push_type_params(&self,
+    fn push_type_params<I>(&self,
                             substs: &Substs<'tcx>,
-                            projections: &[ty::PolyExistentialProjection<'tcx>],
-                            output: &mut String) {
-        if substs.types().next().is_none() && projections.is_empty() {
+                            projections: I,
+                            output: &mut String)
+        where I: Iterator<Item=ty::PolyExistentialProjection<'tcx>>
+    {
+        let mut projections = projections.peekable();
+        if substs.types().next().is_none() && projections.peek().is_none() {
             return;
         }
 
@@ -587,6 +591,6 @@ impl<'a, 'tcx> DefPathBasedNames<'a, 'tcx> {
                                    instance: Instance<'tcx>,
                                    output: &mut String) {
         self.push_def_path(instance.def, output);
-        self.push_type_params(instance.substs, &[], output);
+        self.push_type_params(instance.substs, iter::empty(), output);
     }
 }