]> git.lizzy.rs Git - rust.git/commitdiff
metadata: Add is_exported_symbol() method to CrateStore.
authorMichael Woerister <michaelwoerister@posteo.net>
Mon, 9 Jan 2017 14:46:24 +0000 (09:46 -0500)
committerMichael Woerister <michaelwoerister@posteo.net>
Mon, 9 Jan 2017 15:06:58 +0000 (10:06 -0500)
src/librustc/middle/cstore.rs
src/librustc_metadata/creader.rs
src/librustc_metadata/cstore.rs
src/librustc_metadata/cstore_impl.rs
src/librustc_metadata/decoder.rs

index 7151e5226cab0cb3f365d3b8a63d07af06706403..19dafcd887ea812ed166c8a6000c16e24b1c14e5 100644 (file)
@@ -211,6 +211,7 @@ fn custom_coerce_unsized_kind(&self, def: DefId)
     fn is_foreign_item(&self, did: DefId) -> bool;
     fn is_dllimport_foreign_item(&self, def: DefId) -> bool;
     fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool;
+    fn is_exported_symbol(&self, def_id: DefId) -> bool;
 
     // crate metadata
     fn dylib_dependency_formats(&self, cnum: CrateNum)
@@ -368,6 +369,7 @@ fn is_default_impl(&self, impl_did: DefId) -> bool { bug!("is_default_impl") }
     fn is_foreign_item(&self, did: DefId) -> bool { bug!("is_foreign_item") }
     fn is_dllimport_foreign_item(&self, id: DefId) -> bool { false }
     fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool { false }
+    fn is_exported_symbol(&self, def_id: DefId) -> bool { false }
 
     // crate metadata
     fn dylib_dependency_formats(&self, cnum: CrateNum)
index 724c164b3b41af747310df2a02c2917b6fb30310..8f7b9c24cbf8a5c4adc8de1a62f3f2b00c40def1 100644 (file)
@@ -302,10 +302,13 @@ fn register_crate(&mut self,
             crate_root.def_path_table.decode(&metadata)
         });
 
+        let exported_symbols = crate_root.exported_symbols.decode(&metadata).collect();
+
         let mut cmeta = cstore::CrateMetadata {
             name: name,
             extern_crate: Cell::new(None),
             def_path_table: def_path_table,
+            exported_symbols: exported_symbols,
             proc_macros: crate_root.macro_derive_registrar.map(|_| {
                 self.load_derive_macros(&crate_root, dylib.clone().map(|p| p.0), span)
             }),
index efc19abb33e1b5fdb34928a940b18eff6897c471..761041ad7198aa6cdd3d146d3199280bc6d5998b 100644 (file)
@@ -80,6 +80,8 @@ pub struct CrateMetadata {
     /// compilation support.
     pub def_path_table: DefPathTable,
 
+    pub exported_symbols: FxHashSet<DefIndex>,
+
     pub dep_kind: Cell<DepKind>,
     pub source: CrateSource,
 
index 3d025e984b0400f903e76fe76a10ff2947647da4..1dcb1689d49e109084e66bbf945d27391113b9f2 100644 (file)
@@ -226,6 +226,10 @@ fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool
         self.do_is_statically_included_foreign_item(def_id)
     }
 
+    fn is_exported_symbol(&self, def_id: DefId) -> bool {
+        self.get_crate_data(def_id.krate).exported_symbols.contains(&def_id.index)
+    }
+
     fn is_dllimport_foreign_item(&self, def_id: DefId) -> bool {
         if def_id.krate == LOCAL_CRATE {
             self.dllimport_foreign_items.borrow().contains(&def_id.index)
@@ -467,8 +471,12 @@ fn is_item_mir_available(&self, def: DefId) -> bool {
     }
 
     fn can_have_local_instance<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId) -> bool {
-        self.dep_graph.read(DepNode::MetaData(def));
-        def.is_local() || self.get_crate_data(def.krate).can_have_local_instance(tcx, def.index)
+        if def.is_local() {
+            true
+        } else {
+            self.dep_graph.read(DepNode::MetaData(def));
+            self.get_crate_data(def.krate).can_have_local_instance(tcx, def.index)
+        }
     }
 
     fn crates(&self) -> Vec<CrateNum>
index f3a673898b25c10c112c67b14001057f7b945a3c..3add92191df97233a815b2feb56967ca555a5cae 100644 (file)
@@ -1031,7 +1031,7 @@ pub fn get_fn_arg_names(&self, id: DefIndex) -> Vec<ast::Name> {
     }
 
     pub fn get_exported_symbols(&self) -> Vec<DefId> {
-        self.root.exported_symbols.decode(self).map(|index| self.local_def_id(index)).collect()
+        self.exported_symbols.iter().map(|&index| self.local_def_id(index)).collect()
     }
 
     pub fn get_macro(&self, id: DefIndex) -> (ast::Name, MacroDef) {