@@ -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