@@ -20,22 +20,36 @@ use std::hash::Hash;
20
20
/// Internally the `DefPathTable` holds a tree of `DefKey`s, where each `DefKey`
21
21
/// stores the `DefIndex` of its parent.
22
22
/// There is one `DefPathTable` for each crate.
23
- #[ derive( Clone , Default , Debug ) ]
23
+ #[ derive( Debug ) ]
24
24
pub struct DefPathTable {
25
+ stable_crate_id : StableCrateId ,
25
26
index_to_key : IndexVec < DefIndex , DefKey > ,
26
- def_path_hashes : IndexVec < DefIndex , DefPathHash > ,
27
+ // We do only store the local hash, as all the definitions are from the current crate.
28
+ def_path_hashes : IndexVec < DefIndex , Hash64 > ,
27
29
def_path_hash_to_index : DefPathHashMap ,
28
30
}
29
31
30
32
impl DefPathTable {
33
+ fn new ( stable_crate_id : StableCrateId ) -> DefPathTable {
34
+ DefPathTable {
35
+ stable_crate_id,
36
+ index_to_key : Default :: default ( ) ,
37
+ def_path_hashes : Default :: default ( ) ,
38
+ def_path_hash_to_index : Default :: default ( ) ,
39
+ }
40
+ }
41
+
31
42
fn allocate ( & mut self , key : DefKey , def_path_hash : DefPathHash ) -> DefIndex {
43
+ // Assert that all DefPathHashes correctly contain the local crate's StableCrateId.
44
+ debug_assert_eq ! ( self . stable_crate_id, def_path_hash. stable_crate_id( ) ) ;
45
+
32
46
let index = {
33
47
let index = DefIndex :: from ( self . index_to_key . len ( ) ) ;
34
48
debug ! ( "DefPathTable::insert() - {:?} <-> {:?}" , key, index) ;
35
49
self . index_to_key . push ( key) ;
36
50
index
37
51
} ;
38
- self . def_path_hashes . push ( def_path_hash) ;
52
+ self . def_path_hashes . push ( def_path_hash. local_hash ( ) ) ;
39
53
debug_assert ! ( self . def_path_hashes. len( ) == self . index_to_key. len( ) ) ;
40
54
41
55
// Check for hash collisions of DefPathHashes. These should be
@@ -58,13 +72,6 @@ impl DefPathTable {
58
72
) ;
59
73
}
60
74
61
- // Assert that all DefPathHashes correctly contain the local crate's
62
- // StableCrateId
63
- #[ cfg( debug_assertions) ]
64
- if let Some ( root) = self . def_path_hashes . get ( CRATE_DEF_INDEX ) {
65
- assert ! ( def_path_hash. stable_crate_id( ) == root. stable_crate_id( ) ) ;
66
- }
67
-
68
75
index
69
76
}
70
77
@@ -73,19 +80,19 @@ impl DefPathTable {
73
80
self . index_to_key [ index]
74
81
}
75
82
83
+ #[ instrument( level = "trace" , skip( self ) , ret) ]
76
84
#[ inline( always) ]
77
85
pub fn def_path_hash ( & self , index : DefIndex ) -> DefPathHash {
78
86
let hash = self . def_path_hashes [ index] ;
79
- debug ! ( "def_path_hash({:?}) = {:?}" , index, hash) ;
80
- hash
87
+ DefPathHash :: new ( self . stable_crate_id , hash)
81
88
}
82
89
83
90
pub fn enumerated_keys_and_path_hashes (
84
91
& self ,
85
- ) -> impl Iterator < Item = ( DefIndex , & DefKey , & DefPathHash ) > + ExactSizeIterator + ' _ {
92
+ ) -> impl Iterator < Item = ( DefIndex , & DefKey , DefPathHash ) > + ExactSizeIterator + ' _ {
86
93
self . index_to_key
87
94
. iter_enumerated ( )
88
- . map ( move |( index, key) | ( index, key, & self . def_path_hashes [ index] ) )
95
+ . map ( move |( index, key) | ( index, key, self . def_path_hash ( index) ) )
89
96
}
90
97
}
91
98
@@ -329,7 +336,7 @@ impl Definitions {
329
336
let def_path_hash = key. compute_stable_hash ( parent_hash) ;
330
337
331
338
// Create the root definition.
332
- let mut table = DefPathTable :: default ( ) ;
339
+ let mut table = DefPathTable :: new ( stable_crate_id ) ;
333
340
let root = LocalDefId { local_def_index : table. allocate ( key, def_path_hash) } ;
334
341
assert_eq ! ( root. local_def_index, CRATE_DEF_INDEX ) ;
335
342
0 commit comments