Skip to content

Commit

Permalink
Queryify item_body_nested_bodies
Browse files Browse the repository at this point in the history
  • Loading branch information
cramertj committed May 1, 2017
1 parent 526d399 commit 05b2081
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 23 deletions.
5 changes: 0 additions & 5 deletions src/librustc/middle/cstore.rs
Expand Up @@ -35,7 +35,6 @@ use session::search_paths::PathKind;
use util::nodemap::{NodeSet, DefIdMap};

use std::any::Any;
use std::collections::BTreeMap;
use std::path::PathBuf;
use std::rc::Rc;
use syntax::ast;
Expand Down Expand Up @@ -250,7 +249,6 @@ pub trait CrateStore {
// misc. metadata
fn item_body<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId)
-> &'tcx hir::Body;
fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body>;
fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool;

fn is_item_mir_available(&self, def: DefId) -> bool;
Expand Down Expand Up @@ -401,9 +399,6 @@ impl CrateStore for DummyCrateStore {
-> &'tcx hir::Body {
bug!("item_body")
}
fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body> {
bug!("item_body_nested_bodies")
}
fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool {
bug!("const_is_rvalue_promotable_to_static")
}
Expand Down
19 changes: 16 additions & 3 deletions src/librustc/ty/maps.rs
Expand Up @@ -24,6 +24,7 @@ use util::nodemap::NodeSet;
use rustc_data_structures::indexed_vec::IndexVec;
use std::cell::{RefCell, RefMut};
use std::mem;
use std::collections::BTreeMap;
use std::ops::Deref;
use std::rc::Rc;
use syntax_pos::{Span, DUMMY_SP};
Expand Down Expand Up @@ -291,10 +292,16 @@ impl<'tcx> QueryDescription for queries::def_span<'tcx> {
}
}

impl<'tcx> QueryDescription for queries::item_body_nested_bodies<'tcx> {
fn describe(tcx: TyCtxt, def_id: DefId) -> String {
format!("nested item bodies of `{}`", tcx.item_path_str(def_id))
}
}

macro_rules! define_maps {
(<$tcx:tt>
$($(#[$attr:meta])*
[$($pub:tt)*] $name:ident: $node:ident($K:ty) -> $V:ty),*) => {
[$($pub:tt)*] $name:ident: $node:ident($K:ty) -> $V:ty,)*) => {
pub struct Maps<$tcx> {
providers: IndexVec<CrateNum, Providers<$tcx>>,
query_stack: RefCell<Vec<(Span, Query<$tcx>)>>,
Expand Down Expand Up @@ -577,7 +584,9 @@ define_maps! { <'tcx>
[] symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName,

[] describe_def: DescribeDef(DefId) -> Option<Def>,
[] def_span: DefSpan(DefId) -> Span
[] def_span: DefSpan(DefId) -> Span,

[] item_body_nested_bodies: metadata_dep_node(DefId) -> Rc<BTreeMap<hir::BodyId, hir::Body>>,
}

fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode<DefId> {
Expand All @@ -592,6 +601,10 @@ fn reachability_dep_node(_: CrateNum) -> DepNode<DefId> {
DepNode::Reachability
}

fn metadata_dep_node(def_id: DefId) -> DepNode<DefId> {
DepNode::MetaData(def_id)
}

fn mir_shim_dep_node(instance: ty::InstanceDef) -> DepNode<DefId> {
instance.dep_node()
}
Expand All @@ -608,4 +621,4 @@ fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode<DefId> {

fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode<DefId> {
DepNode::ConstEval(def_id)
}
}
12 changes: 7 additions & 5 deletions src/librustc_metadata/cstore_impl.rs
Expand Up @@ -115,6 +115,13 @@ provide! { <'tcx> tcx, def_id, cdata
is_foreign_item => { cdata.is_foreign_item(def_id.index) }
describe_def => { cdata.get_def(def_id.index) }
def_span => { cdata.get_span(def_id.index, &tcx.sess) }
item_body_nested_bodies => {
let map: BTreeMap<_, _> = cdata.entry(def_id.index).ast.into_iter().flat_map(|ast| {
ast.decode(cdata).nested_bodies.decode(cdata).map(|body| (body.id(), body))
}).collect();

Rc::new(map)
}
}

impl CrateStore for cstore::CStore {
Expand Down Expand Up @@ -432,11 +439,6 @@ impl CrateStore for cstore::CStore {
self.get_crate_data(def_id.krate).item_body(tcx, def_id.index)
}

fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body> {
self.dep_graph.read(DepNode::MetaData(def));
self.get_crate_data(def.krate).item_body_nested_bodies(def.index)
}

fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool {
self.dep_graph.read(DepNode::MetaData(def));
self.get_crate_data(def.krate).const_is_rvalue_promotable_to_static(def.index)
Expand Down
9 changes: 1 addition & 8 deletions src/librustc_metadata/decoder.rs
Expand Up @@ -28,7 +28,6 @@ use rustc::mir::Mir;

use std::borrow::Cow;
use std::cell::Ref;
use std::collections::BTreeMap;
use std::io;
use std::mem;
use std::rc::Rc;
Expand Down Expand Up @@ -451,7 +450,7 @@ impl<'a, 'tcx> CrateMetadata {
self.root.index.lookup(self.blob.raw_bytes(), item_id)
}

fn entry(&self, item_id: DefIndex) -> Entry<'tcx> {
pub fn entry(&self, item_id: DefIndex) -> Entry<'tcx> {
match self.maybe_entry(item_id) {
None => {
bug!("entry: id not found: {:?} in crate {:?} with number {}",
Expand Down Expand Up @@ -773,12 +772,6 @@ impl<'a, 'tcx> CrateMetadata {
tcx.alloc_tables(ast.tables.decode((self, tcx)))
}

pub fn item_body_nested_bodies(&self, id: DefIndex) -> BTreeMap<hir::BodyId, hir::Body> {
self.entry(id).ast.into_iter().flat_map(|ast| {
ast.decode(self).nested_bodies.decode(self).map(|body| (body.id(), body))
}).collect()
}

pub fn const_is_rvalue_promotable_to_static(&self, id: DefIndex) -> bool {
self.entry(id).ast.expect("const item missing `ast`")
.decode(self).rvalue_promotable_to_static
Expand Down
5 changes: 3 additions & 2 deletions src/librustdoc/clean/inline.rs
Expand Up @@ -13,6 +13,7 @@
use std::collections::BTreeMap;
use std::io;
use std::iter::once;
use std::rc::Rc;

use syntax::ast;
use rustc::hir;
Expand Down Expand Up @@ -471,7 +472,7 @@ fn build_module(cx: &DocContext, did: DefId) -> clean::Module {
}

struct InlinedConst {
nested_bodies: BTreeMap<hir::BodyId, hir::Body>
nested_bodies: Rc<BTreeMap<hir::BodyId, hir::Body>>
}

impl hir::print::PpAnn for InlinedConst {
Expand All @@ -488,7 +489,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 inlined = InlinedConst {
nested_bodies: cx.tcx.sess.cstore.item_body_nested_bodies(did)
nested_bodies: cx.tcx.item_body_nested_bodies(did)
};
hir::print::to_string(&inlined, |s| s.print_expr(&body.value))
}
Expand Down

0 comments on commit 05b2081

Please sign in to comment.