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; - // 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; @@ -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 { 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, [] defined_lang_items: DefinedLangItems(CrateNum) -> Rc>, [] missing_lang_items: MissingLangItems(CrateNum) -> Rc>, + [] 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 { 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) };