Skip to content

Commit 76166f6

Browse files
committed
rustc_metadata: replace predicates_defined_on with explicit_predicates_of and inferred_outlives_of.
1 parent d1191bf commit 76166f6

File tree

7 files changed

+153
-35
lines changed

7 files changed

+153
-35
lines changed

src/librustc/ty/codec.rs

+54-7
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,26 @@ pub fn encode_with_shorthand<E, T, M>(encoder: &mut E,
9090
Ok(())
9191
}
9292

93-
pub fn encode_predicates<'tcx, E, C>(encoder: &mut E,
94-
predicates: &ty::GenericPredicates<'tcx>,
95-
cache: C)
96-
-> Result<(), E::Error>
93+
pub fn encode_predicates<'tcx, E, C>(
94+
encoder: &mut E,
95+
predicates: &[ty::Predicate<'tcx>],
96+
cache: C,
97+
) -> Result<(), E::Error>
98+
where E: TyEncoder,
99+
C: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap<ty::Predicate<'tcx>, usize>,
100+
{
101+
predicates.len().encode(encoder)?;
102+
for predicate in predicates {
103+
encode_with_shorthand(encoder, predicate, &cache)?;
104+
}
105+
Ok(())
106+
}
107+
108+
pub fn encode_generic_predicates<'tcx, E, C>(
109+
encoder: &mut E,
110+
predicates: &ty::GenericPredicates<'tcx>,
111+
cache: C,
112+
) -> Result<(), E::Error>
97113
where E: TyEncoder,
98114
C: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap<ty::Predicate<'tcx>, usize>,
99115
{
@@ -160,8 +176,31 @@ pub fn decode_ty<'a, 'tcx, D>(decoder: &mut D) -> Result<Ty<'tcx>, D::Error>
160176
}
161177

162178
#[inline]
163-
pub fn decode_predicates<'a, 'tcx, D>(decoder: &mut D)
164-
-> Result<ty::GenericPredicates<'tcx>, D::Error>
179+
pub fn decode_predicates<'a, 'tcx, D>(
180+
decoder: &mut D,
181+
) -> Result<Vec<ty::Predicate<'tcx>>, D::Error>
182+
where D: TyDecoder<'a, 'tcx>,
183+
'tcx: 'a,
184+
{
185+
(0..decoder.read_usize()?).map(|_| {
186+
// Handle shorthands first, if we have an usize > 0x80.
187+
if decoder.positioned_at_shorthand() {
188+
let pos = decoder.read_usize()?;
189+
assert!(pos >= SHORTHAND_OFFSET);
190+
let shorthand = pos - SHORTHAND_OFFSET;
191+
192+
decoder.with_position(shorthand, ty::Predicate::decode)
193+
} else {
194+
ty::Predicate::decode(decoder)
195+
}
196+
})
197+
.collect()
198+
}
199+
200+
#[inline]
201+
pub fn decode_generic_predicates<'a, 'tcx, D>(
202+
decoder: &mut D,
203+
) -> Result<ty::GenericPredicates<'tcx>, D::Error>
165204
where D: TyDecoder<'a, 'tcx>,
166205
'tcx: 'a,
167206
{
@@ -336,11 +375,19 @@ macro_rules! implement_ty_decoder {
336375
}
337376
}
338377

378+
impl<$($typaram),*> SpecializedDecoder<Vec<ty::Predicate<'tcx>>>
379+
for $DecoderName<$($typaram),*> {
380+
fn specialized_decode(&mut self)
381+
-> Result<Vec<ty::Predicate<'tcx>>, Self::Error> {
382+
decode_predicates(self)
383+
}
384+
}
385+
339386
impl<$($typaram),*> SpecializedDecoder<ty::GenericPredicates<'tcx>>
340387
for $DecoderName<$($typaram),*> {
341388
fn specialized_decode(&mut self)
342389
-> Result<ty::GenericPredicates<'tcx>, Self::Error> {
343-
decode_predicates(self)
390+
decode_generic_predicates(self)
344391
}
345392
}
346393

src/librustc/ty/query/on_disk_cache.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,19 @@ impl<'enc, 'a, 'tcx, E> SpecializedEncoder<ty::Ty<'tcx>> for CacheEncoder<'enc,
891891
}
892892
}
893893

894+
impl<'enc, 'a, 'tcx, E> SpecializedEncoder<Vec<ty::Predicate<'tcx>>>
895+
for CacheEncoder<'enc, 'a, 'tcx, E>
896+
where E: 'enc + ty_codec::TyEncoder
897+
{
898+
#[inline]
899+
fn specialized_encode(&mut self,
900+
predicates: &Vec<ty::Predicate<'tcx>>)
901+
-> Result<(), Self::Error> {
902+
ty_codec::encode_predicates(self, predicates,
903+
|encoder| &mut encoder.predicate_shorthands)
904+
}
905+
}
906+
894907
impl<'enc, 'a, 'tcx, E> SpecializedEncoder<ty::GenericPredicates<'tcx>>
895908
for CacheEncoder<'enc, 'a, 'tcx, E>
896909
where E: 'enc + ty_codec::TyEncoder
@@ -899,7 +912,7 @@ impl<'enc, 'a, 'tcx, E> SpecializedEncoder<ty::GenericPredicates<'tcx>>
899912
fn specialized_encode(&mut self,
900913
predicates: &ty::GenericPredicates<'tcx>)
901914
-> Result<(), Self::Error> {
902-
ty_codec::encode_predicates(self, predicates,
915+
ty_codec::encode_generic_predicates(self, predicates,
903916
|encoder| &mut encoder.predicate_shorthands)
904917
}
905918
}

src/librustc_metadata/cstore_impl.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ provide! { <'tcx> tcx, def_id, other, cdata,
9494
generics_of => {
9595
tcx.alloc_generics(cdata.get_generics(def_id.index, tcx.sess))
9696
}
97-
predicates_defined_on => { Lrc::new(cdata.get_predicates_defined_on(def_id.index, tcx)) }
97+
explicit_predicates_of => { Lrc::new(cdata.get_explicit_predicates(def_id.index, tcx)) }
98+
inferred_outlives_of => { Lrc::new(cdata.get_inferred_outlives(def_id.index, tcx)) }
9899
super_predicates_of => { Lrc::new(cdata.get_super_predicates(def_id.index, tcx)) }
99100
trait_def => {
100101
tcx.alloc_trait_def(cdata.get_trait_def(def_id.index, tcx.sess))

src/librustc_metadata/decoder.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -617,11 +617,20 @@ impl<'a, 'tcx> CrateMetadata {
617617
tcx.alloc_adt_def(did, kind, variants, repr)
618618
}
619619

620-
pub fn get_predicates_defined_on(&self,
621-
item_id: DefIndex,
622-
tcx: TyCtxt<'a, 'tcx, 'tcx>)
623-
-> ty::GenericPredicates<'tcx> {
624-
self.entry(item_id).predicates_defined_on.unwrap().decode((self, tcx))
620+
pub fn get_explicit_predicates(
621+
&self,
622+
item_id: DefIndex,
623+
tcx: TyCtxt<'a, 'tcx, 'tcx>,
624+
) -> ty::GenericPredicates<'tcx> {
625+
self.entry(item_id).explicit_predicates.unwrap().decode((self, tcx))
626+
}
627+
628+
pub fn get_inferred_outlives(
629+
&self,
630+
item_id: DefIndex,
631+
tcx: TyCtxt<'a, 'tcx, 'tcx>,
632+
) -> Vec<ty::Predicate<'tcx>> {
633+
self.entry(item_id).inferred_outlives.unwrap().decode((self, tcx))
625634
}
626635

627636
pub fn get_super_predicates(&self,

src/librustc_metadata/encoder.rs

+58-18
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,19 @@ impl<'a, 'tcx> SpecializedEncoder<interpret::AllocId> for EncodeContext<'a, 'tcx
203203
}
204204
}
205205

206+
impl<'a, 'tcx> SpecializedEncoder<Vec<ty::Predicate<'tcx>>> for EncodeContext<'a, 'tcx> {
207+
fn specialized_encode(&mut self,
208+
predicates: &Vec<ty::Predicate<'tcx>>)
209+
-> Result<(), Self::Error> {
210+
ty_codec::encode_predicates(self, predicates, |ecx| &mut ecx.predicate_shorthands)
211+
}
212+
}
213+
206214
impl<'a, 'tcx> SpecializedEncoder<ty::GenericPredicates<'tcx>> for EncodeContext<'a, 'tcx> {
207215
fn specialized_encode(&mut self,
208216
predicates: &ty::GenericPredicates<'tcx>)
209217
-> Result<(), Self::Error> {
210-
ty_codec::encode_predicates(self, predicates, |ecx| &mut ecx.predicate_shorthands)
218+
ty_codec::encode_generic_predicates(self, predicates, |ecx| &mut ecx.predicate_shorthands)
211219
}
212220
}
213221

@@ -613,7 +621,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
613621
LazySeq::empty()
614622
},
615623
generics: Some(self.encode_generics(def_id)),
616-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
624+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
625+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
617626

618627
mir: self.encode_optimized_mir(def_id),
619628
}
@@ -668,7 +677,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
668677
LazySeq::empty()
669678
},
670679
generics: Some(self.encode_generics(def_id)),
671-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
680+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
681+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
672682

673683
mir: self.encode_optimized_mir(def_id),
674684
}
@@ -705,7 +715,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
705715
inherent_impls: LazySeq::empty(),
706716
variances: LazySeq::empty(),
707717
generics: None,
708-
predicates_defined_on: None,
718+
explicit_predicates: None,
719+
inferred_outlives: None,
709720

710721
mir: None
711722
}
@@ -745,7 +756,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
745756
inherent_impls: LazySeq::empty(),
746757
variances: LazySeq::empty(),
747758
generics: Some(self.encode_generics(def_id)),
748-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
759+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
760+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
749761

750762
mir: None,
751763
}
@@ -804,7 +816,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
804816
LazySeq::empty()
805817
},
806818
generics: Some(self.encode_generics(def_id)),
807-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
819+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
820+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
808821

809822
mir: self.encode_optimized_mir(def_id),
810823
}
@@ -816,10 +829,16 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
816829
self.lazy(tcx.generics_of(def_id))
817830
}
818831

819-
fn encode_predicates_defined_on(&mut self, def_id: DefId) -> Lazy<ty::GenericPredicates<'tcx>> {
820-
debug!("IsolatedEncoder::encode_predicates_defined_on({:?})", def_id);
832+
fn encode_explicit_predicates(&mut self, def_id: DefId) -> Lazy<ty::GenericPredicates<'tcx>> {
833+
debug!("IsolatedEncoder::encode_explicit_predicates({:?})", def_id);
821834
let tcx = self.tcx;
822-
self.lazy(&tcx.predicates_defined_on(def_id))
835+
self.lazy(&tcx.explicit_predicates_of(def_id))
836+
}
837+
838+
fn encode_inferred_outlives(&mut self, def_id: DefId) -> Lazy<Vec<ty::Predicate<'tcx>>> {
839+
debug!("IsolatedEncoder::encode_inferred_outlives({:?})", def_id);
840+
let tcx = self.tcx;
841+
self.lazy(&tcx.inferred_outlives_of(def_id))
823842
}
824843

825844
fn encode_info_for_trait_item(&mut self, def_id: DefId) -> Entry<'tcx> {
@@ -913,7 +932,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
913932
LazySeq::empty()
914933
},
915934
generics: Some(self.encode_generics(def_id)),
916-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
935+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
936+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
917937

918938
mir: self.encode_optimized_mir(def_id),
919939
}
@@ -1011,7 +1031,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
10111031
LazySeq::empty()
10121032
},
10131033
generics: Some(self.encode_generics(def_id)),
1014-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
1034+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
1035+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
10151036

10161037
mir: if mir { self.encode_optimized_mir(def_id) } else { None },
10171038
}
@@ -1267,7 +1288,21 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
12671288
hir::ItemKind::TraitAlias(..) => Some(self.encode_generics(def_id)),
12681289
_ => None,
12691290
},
1270-
predicates_defined_on: match item.node {
1291+
explicit_predicates: match item.node {
1292+
hir::ItemKind::Static(..) |
1293+
hir::ItemKind::Const(..) |
1294+
hir::ItemKind::Fn(..) |
1295+
hir::ItemKind::Ty(..) |
1296+
hir::ItemKind::Enum(..) |
1297+
hir::ItemKind::Struct(..) |
1298+
hir::ItemKind::Union(..) |
1299+
hir::ItemKind::Impl(..) |
1300+
hir::ItemKind::Existential(..) |
1301+
hir::ItemKind::Trait(..) |
1302+
hir::ItemKind::TraitAlias(..) => Some(self.encode_explicit_predicates(def_id)),
1303+
_ => None,
1304+
},
1305+
inferred_outlives: match item.node {
12711306
hir::ItemKind::Static(..) |
12721307
hir::ItemKind::Const(..) |
12731308
hir::ItemKind::Fn(..) |
@@ -1278,7 +1313,7 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
12781313
hir::ItemKind::Impl(..) |
12791314
hir::ItemKind::Existential(..) |
12801315
hir::ItemKind::Trait(..) |
1281-
hir::ItemKind::TraitAlias(..) => Some(self.encode_predicates_defined_on(def_id)),
1316+
hir::ItemKind::TraitAlias(..) => Some(self.encode_inferred_outlives(def_id)),
12821317
_ => None,
12831318
},
12841319

@@ -1328,7 +1363,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
13281363
inherent_impls: LazySeq::empty(),
13291364
variances: LazySeq::empty(),
13301365
generics: None,
1331-
predicates_defined_on: None,
1366+
explicit_predicates: None,
1367+
inferred_outlives: None,
13321368
mir: None,
13331369
}
13341370
}
@@ -1352,7 +1388,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
13521388
inherent_impls: LazySeq::empty(),
13531389
variances: LazySeq::empty(),
13541390
generics: None,
1355-
predicates_defined_on: None,
1391+
explicit_predicates: None,
1392+
inferred_outlives: None,
13561393

13571394
mir: None,
13581395
}
@@ -1411,7 +1448,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
14111448
inherent_impls: LazySeq::empty(),
14121449
variances: LazySeq::empty(),
14131450
generics: Some(self.encode_generics(def_id)),
1414-
predicates_defined_on: None,
1451+
explicit_predicates: None,
1452+
inferred_outlives: None,
14151453

14161454
mir: self.encode_optimized_mir(def_id),
14171455
}
@@ -1438,7 +1476,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
14381476
inherent_impls: LazySeq::empty(),
14391477
variances: LazySeq::empty(),
14401478
generics: Some(self.encode_generics(def_id)),
1441-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
1479+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
1480+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
14421481

14431482
mir: self.encode_optimized_mir(def_id),
14441483
}
@@ -1640,7 +1679,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
16401679
_ => LazySeq::empty(),
16411680
},
16421681
generics: Some(self.encode_generics(def_id)),
1643-
predicates_defined_on: Some(self.encode_predicates_defined_on(def_id)),
1682+
explicit_predicates: Some(self.encode_explicit_predicates(def_id)),
1683+
inferred_outlives: Some(self.encode_inferred_outlives(def_id)),
16441684

16451685
mir: None,
16461686
}

src/librustc_metadata/schema.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,12 @@ pub struct Entry<'tcx> {
265265
pub inherent_impls: LazySeq<DefIndex>,
266266
pub variances: LazySeq<ty::Variance>,
267267
pub generics: Option<Lazy<ty::Generics>>,
268-
pub predicates_defined_on: Option<Lazy<ty::GenericPredicates<'tcx>>>,
268+
pub explicit_predicates: Option<Lazy<ty::GenericPredicates<'tcx>>>,
269+
// FIXME(eddyb) this would ideally be `LazySeq` but `ty::Predicate`
270+
// doesn't handle shorthands in its own (de)serialization impls,
271+
// as it's an `enum` for which we want to derive (de)serialization,
272+
// so the `ty::codec` APIs handle the whole `Vec` at once.
273+
pub inferred_outlives: Option<Lazy<Vec<ty::Predicate<'tcx>>>>,
269274

270275
pub mir: Option<Lazy<mir::Mir<'tcx>>>,
271276
}
@@ -282,7 +287,8 @@ impl_stable_hash_for!(struct Entry<'tcx> {
282287
inherent_impls,
283288
variances,
284289
generics,
285-
predicates_defined_on,
290+
explicit_predicates,
291+
inferred_outlives,
286292
mir
287293
});
288294

src/libserialize/serialize.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ impl<T: UseSpecializedDecodable> Decodable for T {
901901
}
902902
}
903903

904-
// Can't avoid specialization for &T and Box<T> impls,
904+
// Can't avoid specialization for &T, Box<T> and Vec<T> impls,
905905
// as proxy impls on them are blankets that conflict
906906
// with the Encodable and Decodable impls above,
907907
// which only have `default` on their methods
@@ -910,5 +910,7 @@ impl<T: UseSpecializedDecodable> Decodable for T {
910910
// more complex lattice model for specialization.
911911
impl<'a, T: ?Sized + Encodable> UseSpecializedEncodable for &'a T {}
912912
impl<T: ?Sized + Encodable> UseSpecializedEncodable for Box<T> {}
913+
impl<T: Encodable> UseSpecializedEncodable for Vec<T> {}
913914
impl<T: Decodable> UseSpecializedDecodable for Box<T> {}
915+
impl<T: Decodable> UseSpecializedDecodable for Vec<T> {}
914916

0 commit comments

Comments
 (0)