about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2015-08-05 18:25:33 -0700
committerBrian Anderson <banderson@mozilla.com>2015-08-06 16:53:05 -0700
commitfd142bb741848236d4ab3a7655e58014d29889da (patch)
treed4e1d5c963f05cf775c2721d6f19172699998fdd
parent430a9fd4c797c50cea26157141b2408073b2ed91 (diff)
downloadrust-fd142bb741848236d4ab3a7655e58014d29889da.tar.gz
rust-fd142bb741848236d4ab3a7655e58014d29889da.zip
Cache a linear search for the #[staged_api] attribute.
This search happens a lot! Locally, compiling hyper sees the following improvements:

before

real    0m30.843s
user    0m51.644s
sys     0m2.128s

real    0m30.164s
user    0m53.320s
sys     0m2.208s

after

real    0m28.438s
user    0m51.076s
sys     0m2.276s

real    0m28.612s
user    0m51.560s
sys     0m2.192s
-rw-r--r--src/librustc/metadata/creader.rs13
-rw-r--r--src/librustc/metadata/csearch.rs11
-rw-r--r--src/librustc/metadata/cstore.rs1
3 files changed, 15 insertions, 10 deletions
diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs
index f4561d68906..bbb2d4fade1 100644
--- a/src/librustc/metadata/creader.rs
+++ b/src/librustc/metadata/creader.rs
@@ -261,6 +261,7 @@ impl<'a> CrateReader<'a> {
         let loader::Library { dylib, rlib, metadata } = lib;
 
         let cnum_map = self.resolve_crate_deps(root, metadata.as_slice(), span);
+        let staged_api = self.is_staged_api(metadata.as_slice());
 
         let cmeta = Rc::new( cstore::crate_metadata {
             name: name.to_string(),
@@ -270,6 +271,7 @@ impl<'a> CrateReader<'a> {
             cnum: cnum,
             codemap_import_info: RefCell::new(vec![]),
             span: span,
+            staged_api: staged_api
         });
 
         let source = cstore::CrateSource {
@@ -283,6 +285,17 @@ impl<'a> CrateReader<'a> {
         (cnum, cmeta, source)
     }
 
+    fn is_staged_api(&self, data: &[u8]) -> bool {
+        let attrs = decoder::get_crate_attributes(data);
+        for attr in &attrs {
+            if &attr.name()[..] == "staged_api" {
+                match attr.node.value.node { ast::MetaWord(_) => return true, _ => (/*pass*/) }
+            }
+        }
+
+        return false;
+    }
+
     fn resolve_crate(&mut self,
                      root: &Option<CratePaths>,
                      ident: &str,
diff --git a/src/librustc/metadata/csearch.rs b/src/librustc/metadata/csearch.rs
index 21d5dac7e5d..9c45ffe35a8 100644
--- a/src/librustc/metadata/csearch.rs
+++ b/src/librustc/metadata/csearch.rs
@@ -22,7 +22,6 @@ use rbml::reader;
 use std::rc::Rc;
 use syntax::ast;
 use syntax::attr;
-use syntax::attr::AttrMetaMethods;
 use syntax::diagnostic::expect;
 
 use std::collections::hash_map::HashMap;
@@ -386,15 +385,7 @@ pub fn get_stability(cstore: &cstore::CStore,
 }
 
 pub fn is_staged_api(cstore: &cstore::CStore, krate: ast::CrateNum) -> bool {
-    let cdata = cstore.get_crate_data(krate);
-    let attrs = decoder::get_crate_attributes(cdata.data());
-    for attr in &attrs {
-        if &attr.name()[..] == "staged_api" {
-            match attr.node.value.node { ast::MetaWord(_) => return true, _ => (/*pass*/) }
-        }
-    }
-
-    return false;
+    cstore.get_crate_data(krate).staged_api
 }
 
 pub fn get_repr_attrs(cstore: &cstore::CStore, def: ast::DefId)
diff --git a/src/librustc/metadata/cstore.rs b/src/librustc/metadata/cstore.rs
index 08c05b76862..19d494824cf 100644
--- a/src/librustc/metadata/cstore.rs
+++ b/src/librustc/metadata/cstore.rs
@@ -63,6 +63,7 @@ pub struct crate_metadata {
     pub cnum: ast::CrateNum,
     pub codemap_import_info: RefCell<Vec<ImportedFileMap>>,
     pub span: codemap::Span,
+    pub staged_api: bool
 }
 
 #[derive(Copy, Debug, PartialEq, Clone)]