about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2017-08-31 11:12:05 -0700
committerAlex Crichton <alex@alexcrichton.com>2017-09-05 07:37:58 -0700
commit84ae4b75be371844f9afb9f464f5064840ac3f9c (patch)
treec4b7474d493149b7b1d2f895b7ed7c1f39c6e3f9
parent953490ddfa0561b21e56db6000fc2b3810ec0a91 (diff)
downloadrust-84ae4b75be371844f9afb9f464f5064840ac3f9c.tar.gz
rust-84ae4b75be371844f9afb9f464f5064840ac3f9c.zip
rustc: Migrate `CrateStore::item_body` to a query
This commit migrates the `item_body` method on `CrateStore` to a query instead
to enable better tracking of dependencies and whatnot.
-rw-r--r--src/librustc/dep_graph/dep_node.rs1
-rw-r--r--src/librustc/middle/cstore.rs11
-rw-r--r--src/librustc/ty/maps.rs1
-rw-r--r--src/librustc_const_eval/eval.rs4
-rw-r--r--src/librustc_const_eval/pattern.rs2
-rw-r--r--src/librustc_metadata/cstore_impl.rs23
-rw-r--r--src/librustdoc/clean/inline.rs2
7 files changed, 14 insertions, 30 deletions
diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs
index 1c52725c910..d6aa9cb341e 100644
--- a/src/librustc/dep_graph/dep_node.rs
+++ b/src/librustc/dep_graph/dep_node.rs
@@ -563,6 +563,7 @@ define_dep_nodes!( <'tcx>
     [] GetLangItems,
     [] DefinedLangItems(CrateNum),
     [] MissingLangItems(CrateNum),
+    [] ItemBody(DefId),
 );
 
 trait DepNodeParams<'a, 'gcx: 'tcx + 'a, 'tcx: 'a> : fmt::Debug {
diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs
index b7fdfe4a635..f71a08280c6 100644
--- a/src/librustc/middle/cstore.rs
+++ b/src/librustc/middle/cstore.rs
@@ -42,7 +42,6 @@ use syntax::ext::base::SyntaxExtension;
 use syntax::symbol::Symbol;
 use syntax_pos::Span;
 use rustc_back::target::Target;
-use hir;
 
 pub use self::NativeLibraryKind::*;
 
@@ -258,10 +257,6 @@ pub trait CrateStore {
     fn load_macro_untracked(&self, did: DefId, sess: &Session) -> LoadedMacro;
     fn extern_mod_stmt_cnum_untracked(&self, emod_id: ast::NodeId) -> Option<CrateNum>;
 
-    // misc. metadata
-    fn item_body<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId)
-                           -> &'tcx hir::Body;
-
     // This is basically a 1-based range of ints, which is a little
     // silly - I may fix that.
     fn crates(&self) -> Vec<CrateNum>;
@@ -350,12 +345,6 @@ impl CrateStore for DummyCrateStore {
     }
     fn load_macro_untracked(&self, did: DefId, sess: &Session) -> LoadedMacro { bug!("load_macro") }
 
-    // misc. metadata
-    fn item_body<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId)
-                           -> &'tcx hir::Body {
-        bug!("item_body")
-    }
-
     // This is basically a 1-based range of ints, which is a little
     // silly - I may fix that.
     fn crates(&self) -> Vec<CrateNum> { vec![] }
diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs
index fc7dcb16ea0..751beb4d0e9 100644
--- a/src/librustc/ty/maps.rs
+++ b/src/librustc/ty/maps.rs
@@ -1315,6 +1315,7 @@ define_maps! { <'tcx>
     [] get_lang_items: get_lang_items_node(CrateNum) -> Rc<LanguageItems>,
     [] defined_lang_items: DefinedLangItems(CrateNum) -> Rc<Vec<(DefIndex, usize)>>,
     [] missing_lang_items: MissingLangItems(CrateNum) -> Rc<Vec<LangItem>>,
+    [] item_body: ItemBody(DefId) -> &'tcx hir::Body,
 }
 
 fn type_param_predicates<'tcx>((item_id, param_id): (DefId, DefId)) -> DepConstructor<'tcx> {
diff --git a/src/librustc_const_eval/eval.rs b/src/librustc_const_eval/eval.rs
index c7def0b834c..d9371807197 100644
--- a/src/librustc_const_eval/eval.rs
+++ b/src/librustc_const_eval/eval.rs
@@ -354,7 +354,7 @@ fn eval_const_expr_partial<'a, 'tcx>(cx: &ConstContext<'a, 'tcx>,
             }
           } else {
             if tcx.is_const_fn(def_id) {
-                tcx.sess.cstore.item_body(tcx, def_id)
+                tcx.item_body(def_id)
             } else {
                 signal!(e, TypeckError)
             }
@@ -774,7 +774,7 @@ fn const_eval<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
         tcx.mir_const_qualif(def_id);
         tcx.hir.body(tcx.hir.body_owned_by(id))
     } else {
-        tcx.sess.cstore.item_body(tcx, def_id)
+        tcx.item_body(def_id)
     };
     ConstContext::new(tcx, key.param_env.and(substs), tables).eval(&body.value)
 }
diff --git a/src/librustc_const_eval/pattern.rs b/src/librustc_const_eval/pattern.rs
index ba79f775ef7..a4040834cf5 100644
--- a/src/librustc_const_eval/pattern.rs
+++ b/src/librustc_const_eval/pattern.rs
@@ -609,7 +609,7 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> {
                         let body = if let Some(id) = self.tcx.hir.as_local_node_id(def_id) {
                             self.tcx.hir.body(self.tcx.hir.body_owned_by(id))
                         } else {
-                            self.tcx.sess.cstore.item_body(self.tcx, def_id)
+                            self.tcx.item_body(def_id)
                         };
                         let pat = self.lower_const_expr(&body.value, pat_id, span);
                         self.tables = old_tables;
diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs
index 16cbc52ced9..7675a4f6e5f 100644
--- a/src/librustc_metadata/cstore_impl.rs
+++ b/src/librustc_metadata/cstore_impl.rs
@@ -214,6 +214,14 @@ provide! { <'tcx> tcx, def_id, other, cdata,
     }
     defined_lang_items => { Rc::new(cdata.get_lang_items(&tcx.dep_graph)) }
     missing_lang_items => { Rc::new(cdata.get_missing_lang_items(&tcx.dep_graph)) }
+
+    item_body => {
+        if let Some(cached) = tcx.hir.get_inlined_body_untracked(def_id) {
+            return cached;
+        }
+        debug!("item_body({:?}): inlining item", def_id);
+        cdata.item_body(tcx, def_id.index)
+    }
 }
 
 pub fn provide_local<'tcx>(providers: &mut Providers<'tcx>) {
@@ -397,21 +405,6 @@ impl CrateStore for cstore::CStore {
         })
     }
 
-    fn item_body<'a, 'tcx>(&self,
-                           tcx: TyCtxt<'a, 'tcx, 'tcx>,
-                           def_id: DefId)
-                           -> &'tcx hir::Body {
-        self.read_dep_node(def_id);
-
-        if let Some(cached) = tcx.hir.get_inlined_body_untracked(def_id) {
-            return cached;
-        }
-
-        debug!("item_body({:?}): inlining item", def_id);
-
-        self.get_crate_data(def_id.krate).item_body(tcx, def_id.index)
-    }
-
     fn crates(&self) -> Vec<CrateNum>
     {
         let mut result = vec![];
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs
index fcd0e58a985..d3b4d30208b 100644
--- a/src/librustdoc/clean/inline.rs
+++ b/src/librustdoc/clean/inline.rs
@@ -474,7 +474,7 @@ impl hir::print::PpAnn for InlinedConst {
 }
 
 fn print_inlined_const(cx: &DocContext, did: DefId) -> String {
-    let body = cx.tcx.sess.cstore.item_body(cx.tcx, did);
+    let body = cx.tcx.item_body(did);
     let inlined = InlinedConst {
         nested_bodies: cx.tcx.item_body_nested_bodies(did)
     };