@@ -13,9 +13,10 @@ use hir::def_id::DefId;
1313use hir:: map:: DefPathHash ;
1414use ich:: { self , CachingCodemapView } ;
1515use session:: config:: DebugInfoLevel :: NoDebugInfo ;
16- use ty;
17- use util:: nodemap:: { NodeMap , ItemLocalMap } ;
16+ use ty:: { self , fast_reject } ;
17+ use util:: nodemap:: { NodeMap , NodeSet , ItemLocalMap } ;
1818
19+ use std:: cmp:: Ord ;
1920use std:: hash as std_hash;
2021use std:: collections:: { HashMap , HashSet , BTreeMap } ;
2122
@@ -47,6 +48,7 @@ pub struct StableHashingContext<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
4748#[ derive( PartialEq , Eq , Clone , Copy ) ]
4849pub enum NodeIdHashingMode {
4950 Ignore ,
51+ CheckedIgnore ,
5052 HashDefPath ,
5153 HashTraitsInScope ,
5254}
@@ -148,7 +150,7 @@ impl<'a, 'gcx, 'tcx> StableHashingContext<'a, 'gcx, 'tcx> {
148150 self . overflow_checks_enabled = true ;
149151 }
150152 let prev_hash_node_ids = self . node_id_hashing_mode ;
151- self . node_id_hashing_mode = NodeIdHashingMode :: Ignore ;
153+ self . node_id_hashing_mode = NodeIdHashingMode :: CheckedIgnore ;
152154
153155 f ( self ) ;
154156
@@ -201,6 +203,9 @@ impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ast::N
201203 hasher : & mut StableHasher < W > ) {
202204 match hcx. node_id_hashing_mode {
203205 NodeIdHashingMode :: Ignore => {
206+ // Don't do anything.
207+ }
208+ NodeIdHashingMode :: CheckedIgnore => {
204209 // Most NodeIds in the HIR can be ignored, but if there is a
205210 // corresponding entry in the `trait_map` we need to hash that.
206211 // Make sure we don't ignore too much by checking that there is
@@ -322,7 +327,7 @@ pub fn hash_stable_hashmap<'a, 'gcx, 'tcx, K, V, R, SK, F, W>(
322327 let mut keys: Vec < _ > = map. keys ( )
323328 . map ( |k| ( extract_stable_key ( hcx, k) , k) )
324329 . collect ( ) ;
325- keys. sort_unstable_by_key ( |& ( ref stable_key , _) | stable_key . clone ( ) ) ;
330+ keys. sort_unstable_by ( |& ( ref sk1 , _) , & ( ref sk2 , _ ) | sk1 . cmp ( sk2 ) ) ;
326331 keys. len ( ) . hash_stable ( hcx, hasher) ;
327332 for ( stable_key, key) in keys {
328333 stable_key. hash_stable ( hcx, hasher) ;
@@ -355,8 +360,25 @@ pub fn hash_stable_nodemap<'a, 'tcx, 'gcx, V, W>(
355360 where V : HashStable < StableHashingContext < ' a , ' gcx , ' tcx > > ,
356361 W : StableHasherResult ,
357362{
358- hash_stable_hashmap ( hcx, hasher, map, |hcx, node_id| {
359- hcx. tcx . hir . definitions ( ) . node_to_hir_id ( * node_id) . local_id
363+ let definitions = hcx. tcx . hir . definitions ( ) ;
364+ hash_stable_hashmap ( hcx, hasher, map, |_, node_id| {
365+ let hir_id = definitions. node_to_hir_id ( * node_id) ;
366+ let owner_def_path_hash = definitions. def_path_hash ( hir_id. owner ) ;
367+ ( owner_def_path_hash, hir_id. local_id )
368+ } ) ;
369+ }
370+
371+ pub fn hash_stable_nodeset < ' a , ' tcx , ' gcx , W > (
372+ hcx : & mut StableHashingContext < ' a , ' gcx , ' tcx > ,
373+ hasher : & mut StableHasher < W > ,
374+ map : & NodeSet )
375+ where W : StableHasherResult ,
376+ {
377+ let definitions = hcx. tcx . hir . definitions ( ) ;
378+ hash_stable_hashset ( hcx, hasher, map, |_, node_id| {
379+ let hir_id = definitions. node_to_hir_id ( * node_id) ;
380+ let owner_def_path_hash = definitions. def_path_hash ( hir_id. owner ) ;
381+ ( owner_def_path_hash, hir_id. local_id )
360382 } ) ;
361383}
362384
@@ -387,10 +409,56 @@ pub fn hash_stable_btreemap<'a, 'tcx, 'gcx, K, V, SK, F, W>(
387409 let mut keys: Vec < _ > = map. keys ( )
388410 . map ( |k| ( extract_stable_key ( hcx, k) , k) )
389411 . collect ( ) ;
390- keys. sort_unstable_by_key ( |& ( ref stable_key , _) | stable_key . clone ( ) ) ;
412+ keys. sort_unstable_by ( |& ( ref sk1 , _) , & ( ref sk2 , _ ) | sk1 . cmp ( sk2 ) ) ;
391413 keys. len ( ) . hash_stable ( hcx, hasher) ;
392414 for ( stable_key, key) in keys {
393415 stable_key. hash_stable ( hcx, hasher) ;
394416 map[ key] . hash_stable ( hcx, hasher) ;
395417 }
396418}
419+
420+ pub fn hash_stable_trait_impls < ' a , ' tcx , ' gcx , W , R > (
421+ hcx : & mut StableHashingContext < ' a , ' gcx , ' tcx > ,
422+ hasher : & mut StableHasher < W > ,
423+ blanket_impls : & Vec < DefId > ,
424+ non_blanket_impls : & HashMap < fast_reject:: SimplifiedType , Vec < DefId > , R > )
425+ where W : StableHasherResult ,
426+ R : std_hash:: BuildHasher ,
427+ {
428+ {
429+ let mut blanket_impls: AccumulateVec < [ _ ; 8 ] > = blanket_impls
430+ . iter ( )
431+ . map ( |& def_id| hcx. def_path_hash ( def_id) )
432+ . collect ( ) ;
433+
434+ if blanket_impls. len ( ) > 1 {
435+ blanket_impls. sort_unstable ( ) ;
436+ }
437+
438+ blanket_impls. hash_stable ( hcx, hasher) ;
439+ }
440+
441+ {
442+ let tcx = hcx. tcx ( ) ;
443+ let mut keys: AccumulateVec < [ _ ; 8 ] > =
444+ non_blanket_impls. keys ( )
445+ . map ( |k| ( k, k. map_def ( |d| tcx. def_path_hash ( d) ) ) )
446+ . collect ( ) ;
447+ keys. sort_unstable_by ( |& ( _, ref k1) , & ( _, ref k2) | k1. cmp ( k2) ) ;
448+ keys. len ( ) . hash_stable ( hcx, hasher) ;
449+ for ( key, ref stable_key) in keys {
450+ stable_key. hash_stable ( hcx, hasher) ;
451+ let mut impls : AccumulateVec < [ _ ; 8 ] > = non_blanket_impls[ key]
452+ . iter ( )
453+ . map ( |& impl_id| hcx. def_path_hash ( impl_id) )
454+ . collect ( ) ;
455+
456+ if impls. len ( ) > 1 {
457+ impls. sort_unstable ( ) ;
458+ }
459+
460+ impls. hash_stable ( hcx, hasher) ;
461+ }
462+ }
463+ }
464+
0 commit comments