rustc_metadata: use a table for super_predicates.
This commit is contained in:
parent
50ffa79589
commit
74db3e8a9e
3 changed files with 23 additions and 27 deletions
|
@ -448,7 +448,7 @@ impl<'tcx> EntryKind<'tcx> {
|
|||
EntryKind::Mod(_) => DefKind::Mod,
|
||||
EntryKind::Variant(_) => DefKind::Variant,
|
||||
EntryKind::Trait(_) => DefKind::Trait,
|
||||
EntryKind::TraitAlias(_) => DefKind::TraitAlias,
|
||||
EntryKind::TraitAlias => DefKind::TraitAlias,
|
||||
EntryKind::Enum(..) => DefKind::Enum,
|
||||
EntryKind::MacroDef(_) => DefKind::Macro(MacroKind::Bang),
|
||||
EntryKind::ForeignType => DefKind::ForeignTy,
|
||||
|
@ -575,7 +575,7 @@ impl<'a, 'tcx> CrateMetadata {
|
|||
data.is_marker,
|
||||
self.def_path_table.def_path_hash(item_id))
|
||||
},
|
||||
EntryKind::TraitAlias(_) => {
|
||||
EntryKind::TraitAlias => {
|
||||
ty::TraitDef::new(self.local_def_id(item_id),
|
||||
hir::Unsafety::Normal,
|
||||
false,
|
||||
|
@ -680,13 +680,7 @@ impl<'a, 'tcx> CrateMetadata {
|
|||
item_id: DefIndex,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> ty::GenericPredicates<'tcx> {
|
||||
let super_predicates = match self.kind(item_id) {
|
||||
EntryKind::Trait(data) => data.decode(self).super_predicates,
|
||||
EntryKind::TraitAlias(data) => data.decode(self).super_predicates,
|
||||
_ => bug!("def-index does not refer to trait or trait alias"),
|
||||
};
|
||||
|
||||
super_predicates.decode((self, tcx))
|
||||
self.root.per_def.super_predicates.get(self, item_id).unwrap().decode((self, tcx))
|
||||
}
|
||||
|
||||
crate fn get_generics(&self, item_id: DefIndex, sess: &Session) -> ty::Generics {
|
||||
|
@ -1118,7 +1112,7 @@ impl<'a, 'tcx> CrateMetadata {
|
|||
def_key.parent.and_then(|parent_index| {
|
||||
match self.kind(parent_index) {
|
||||
EntryKind::Trait(_) |
|
||||
EntryKind::TraitAlias(_) => Some(self.local_def_id(parent_index)),
|
||||
EntryKind::TraitAlias => Some(self.local_def_id(parent_index)),
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
|
|
|
@ -76,6 +76,7 @@ struct PerDefTables<'tcx> {
|
|||
generics: PerDefTable<Lazy<ty::Generics>>,
|
||||
predicates: PerDefTable<Lazy<ty::GenericPredicates<'tcx>>>,
|
||||
predicates_defined_on: PerDefTable<Lazy<ty::GenericPredicates<'tcx>>>,
|
||||
super_predicates: PerDefTable<Lazy<ty::GenericPredicates<'tcx>>>,
|
||||
|
||||
mir: PerDefTable<Lazy<mir::Body<'tcx>>>,
|
||||
promoted_mir: PerDefTable<Lazy<IndexVec<mir::Promoted, mir::Body<'tcx>>>>,
|
||||
|
@ -513,6 +514,7 @@ impl<'tcx> EncodeContext<'tcx> {
|
|||
generics: self.per_def.generics.encode(&mut self.opaque),
|
||||
predicates: self.per_def.predicates.encode(&mut self.opaque),
|
||||
predicates_defined_on: self.per_def.predicates_defined_on.encode(&mut self.opaque),
|
||||
super_predicates: self.per_def.super_predicates.encode(&mut self.opaque),
|
||||
|
||||
mir: self.per_def.mir.encode(&mut self.opaque),
|
||||
promoted_mir: self.per_def.promoted_mir.encode(&mut self.opaque),
|
||||
|
@ -835,6 +837,11 @@ impl EncodeContext<'tcx> {
|
|||
self.tcx.predicates_defined_on(def_id))
|
||||
}
|
||||
|
||||
fn encode_super_predicates(&mut self, def_id: DefId) {
|
||||
debug!("EncodeContext::encode_super_predicates({:?})", def_id);
|
||||
record!(self.per_def.super_predicates[def_id] <- self.tcx.super_predicates_of(def_id));
|
||||
}
|
||||
|
||||
fn encode_info_for_trait_item(&mut self, def_id: DefId) {
|
||||
debug!("EncodeContext::encode_info_for_trait_item({:?})", def_id);
|
||||
let tcx = self.tcx;
|
||||
|
@ -1166,18 +1173,11 @@ impl EncodeContext<'tcx> {
|
|||
paren_sugar: trait_def.paren_sugar,
|
||||
has_auto_impl: self.tcx.trait_is_auto(def_id),
|
||||
is_marker: trait_def.is_marker,
|
||||
super_predicates: self.lazy(tcx.super_predicates_of(def_id)),
|
||||
};
|
||||
|
||||
EntryKind::Trait(self.lazy(data))
|
||||
}
|
||||
hir::ItemKind::TraitAlias(..) => {
|
||||
let data = TraitAliasData {
|
||||
super_predicates: self.lazy(tcx.super_predicates_of(def_id)),
|
||||
};
|
||||
|
||||
EntryKind::TraitAlias(self.lazy(data))
|
||||
}
|
||||
hir::ItemKind::TraitAlias(..) => EntryKind::TraitAlias,
|
||||
hir::ItemKind::ExternCrate(_) |
|
||||
hir::ItemKind::Use(..) => bug!("cannot encode info for item {:?}", item),
|
||||
});
|
||||
|
@ -1269,6 +1269,13 @@ impl EncodeContext<'tcx> {
|
|||
}
|
||||
_ => {} // not *wrong* for other kinds of items, but not needed
|
||||
}
|
||||
match item.kind {
|
||||
hir::ItemKind::Trait(..) |
|
||||
hir::ItemKind::TraitAlias(..) => {
|
||||
self.encode_super_predicates(def_id);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
let mir = match item.kind {
|
||||
hir::ItemKind::Static(..) | hir::ItemKind::Const(..) => true,
|
||||
|
|
|
@ -243,6 +243,7 @@ crate struct LazyPerDefTables<'tcx> {
|
|||
pub generics: Lazy!(PerDefTable<Lazy<ty::Generics>>),
|
||||
pub predicates: Lazy!(PerDefTable<Lazy!(ty::GenericPredicates<'tcx>)>),
|
||||
pub predicates_defined_on: Lazy!(PerDefTable<Lazy!(ty::GenericPredicates<'tcx>)>),
|
||||
pub super_predicates: Lazy!(PerDefTable<Lazy!(ty::GenericPredicates<'tcx>)>),
|
||||
|
||||
pub mir: Lazy!(PerDefTable<Lazy!(mir::Body<'tcx>)>),
|
||||
pub promoted_mir: Lazy!(PerDefTable<Lazy!(IndexVec<mir::Promoted, mir::Body<'tcx>>)>),
|
||||
|
@ -273,13 +274,13 @@ crate enum EntryKind<'tcx> {
|
|||
MacroDef(Lazy<MacroDef>),
|
||||
Closure(Lazy!(ClosureData<'tcx>)),
|
||||
Generator(Lazy!(GeneratorData<'tcx>)),
|
||||
Trait(Lazy!(TraitData<'tcx>)),
|
||||
Trait(Lazy<TraitData>),
|
||||
Impl(Lazy!(ImplData<'tcx>)),
|
||||
Method(Lazy!(MethodData<'tcx>)),
|
||||
AssocType(AssocContainer),
|
||||
AssocOpaqueTy(AssocContainer),
|
||||
AssocConst(AssocContainer, ConstQualif, Lazy<RenderedConst>),
|
||||
TraitAlias(Lazy!(TraitAliasData<'tcx>)),
|
||||
TraitAlias,
|
||||
}
|
||||
|
||||
/// Additional data for EntryKind::Const and EntryKind::AssocConst
|
||||
|
@ -324,17 +325,11 @@ crate struct VariantData<'tcx> {
|
|||
}
|
||||
|
||||
#[derive(RustcEncodable, RustcDecodable)]
|
||||
crate struct TraitData<'tcx> {
|
||||
crate struct TraitData {
|
||||
pub unsafety: hir::Unsafety,
|
||||
pub paren_sugar: bool,
|
||||
pub has_auto_impl: bool,
|
||||
pub is_marker: bool,
|
||||
pub super_predicates: Lazy!(ty::GenericPredicates<'tcx>),
|
||||
}
|
||||
|
||||
#[derive(RustcEncodable, RustcDecodable)]
|
||||
crate struct TraitAliasData<'tcx> {
|
||||
pub super_predicates: Lazy!(ty::GenericPredicates<'tcx>),
|
||||
}
|
||||
|
||||
#[derive(RustcEncodable, RustcDecodable)]
|
||||
|
|
Loading…
Reference in a new issue