1
1
use crate :: arena:: Arena ;
2
- use crate :: dep_graph:: { DepGraph , DepKind , DepNode , DepNodeIndex } ;
3
2
use crate :: hir:: map:: definitions:: { self , DefPathHash } ;
4
- use crate :: hir:: map:: { Entry , HirEntryMap , Map } ;
3
+ use crate :: hir:: map:: { Entry , Map } ;
5
4
use crate :: hir:: { HirItem , HirOwner , HirOwnerItems } ;
6
5
use crate :: ich:: StableHashingContext ;
7
6
use crate :: middle:: cstore:: CrateStore ;
@@ -35,70 +34,38 @@ pub(super) struct NodeCollector<'a, 'hir> {
35
34
owner_map : FxHashMap < DefIndex , & ' hir HirOwner < ' hir > > ,
36
35
owner_items_map : FxHashMap < DefIndex , & ' hir mut HirOwnerItems < ' hir > > ,
37
36
38
- /// The node map
39
- map : HirEntryMap < ' hir > ,
40
37
/// The parent of this node
41
38
parent_node : hir:: HirId ,
42
39
43
- // These fields keep track of the currently relevant DepNodes during
44
- // the visitor's traversal.
45
40
current_dep_node_owner : DefIndex ,
46
- current_signature_dep_index : DepNodeIndex ,
47
- current_full_dep_index : DepNodeIndex ,
48
- currently_in_body : bool ,
49
41
50
- dep_graph : & ' a DepGraph ,
51
42
definitions : & ' a definitions:: Definitions ,
52
43
hir_to_node_id : & ' a FxHashMap < HirId , NodeId > ,
53
44
54
45
hcx : StableHashingContext < ' a > ,
55
46
56
47
// We are collecting `DepNode::HirBody` hashes here so we can compute the
57
- // crate hash from then later on.
48
+ // crate hash from them later on.
58
49
hir_body_nodes : Vec < ( DefPathHash , Fingerprint ) > ,
59
50
}
60
51
61
- fn input_dep_node_and_hash (
62
- dep_graph : & DepGraph ,
52
+ fn hash (
63
53
hcx : & mut StableHashingContext < ' _ > ,
64
- dep_node : DepNode ,
65
54
input : impl for < ' a > HashStable < StableHashingContext < ' a > > ,
66
- ) -> ( DepNodeIndex , Fingerprint ) {
67
- let dep_node_index = dep_graph. input_task ( dep_node, & mut * hcx, & input) . 1 ;
68
-
69
- let hash = if dep_graph. is_fully_enabled ( ) {
70
- dep_graph. fingerprint_of ( dep_node_index)
71
- } else {
72
- let mut stable_hasher = StableHasher :: new ( ) ;
73
- input. hash_stable ( hcx, & mut stable_hasher) ;
74
- stable_hasher. finish ( )
75
- } ;
76
-
77
- ( dep_node_index, hash)
55
+ ) -> Fingerprint {
56
+ let mut stable_hasher = StableHasher :: new ( ) ;
57
+ input. hash_stable ( hcx, & mut stable_hasher) ;
58
+ stable_hasher. finish ( )
78
59
}
79
60
80
- fn alloc_hir_dep_nodes (
81
- dep_graph : & DepGraph ,
61
+ fn hash_body (
82
62
hcx : & mut StableHashingContext < ' _ > ,
83
63
def_path_hash : DefPathHash ,
84
64
item_like : impl for < ' a > HashStable < StableHashingContext < ' a > > ,
85
65
hir_body_nodes : & mut Vec < ( DefPathHash , Fingerprint ) > ,
86
- ) -> ( DepNodeIndex , DepNodeIndex ) {
87
- let sig = dep_graph
88
- . input_task (
89
- DepNode :: from_def_path_hash ( def_path_hash, DepKind :: Hir ) ,
90
- & mut * hcx,
91
- HirItemLike { item_like : & item_like, hash_bodies : false } ,
92
- )
93
- . 1 ;
94
- let ( full, hash) = input_dep_node_and_hash (
95
- dep_graph,
96
- hcx,
97
- DepNode :: from_def_path_hash ( def_path_hash, DepKind :: HirBody ) ,
98
- HirItemLike { item_like : & item_like, hash_bodies : true } ,
99
- ) ;
66
+ ) {
67
+ let hash = hash ( hcx, HirItemLike { item_like : & item_like } ) ;
100
68
hir_body_nodes. push ( ( def_path_hash, hash) ) ;
101
- ( sig, full)
102
69
}
103
70
104
71
fn upstream_crates ( cstore : & dyn CrateStore ) -> Vec < ( Symbol , Fingerprint , Svh ) > {
@@ -121,7 +88,6 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
121
88
sess : & ' a Session ,
122
89
arena : & ' hir Arena < ' hir > ,
123
90
krate : & ' hir Crate < ' hir > ,
124
- dep_graph : & ' a DepGraph ,
125
91
definitions : & ' a definitions:: Definitions ,
126
92
hir_to_node_id : & ' a FxHashMap < HirId , NodeId > ,
127
93
mut hcx : StableHashingContext < ' a > ,
@@ -130,8 +96,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
130
96
131
97
let mut hir_body_nodes = Vec :: new ( ) ;
132
98
133
- // Allocate `DepNode`s for the root module.
134
- let ( root_mod_sig_dep_index, root_mod_full_dep_index) = {
99
+ {
135
100
let Crate {
136
101
ref item,
137
102
// These fields are handled separately:
@@ -146,40 +111,31 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
146
111
modules : _,
147
112
} = * krate;
148
113
149
- alloc_hir_dep_nodes (
150
- dep_graph,
151
- & mut hcx,
152
- root_mod_def_path_hash,
153
- item,
154
- & mut hir_body_nodes,
155
- )
114
+ hash_body ( & mut hcx, root_mod_def_path_hash, item, & mut hir_body_nodes)
156
115
} ;
157
116
158
117
let mut collector = NodeCollector {
159
118
arena,
160
119
krate,
161
120
source_map : sess. source_map ( ) ,
162
- map : IndexVec :: from_elem_n ( IndexVec :: new ( ) , definitions. def_index_count ( ) ) ,
163
121
parent_node : hir:: CRATE_HIR_ID ,
164
- current_signature_dep_index : root_mod_sig_dep_index,
165
- current_full_dep_index : root_mod_full_dep_index,
166
122
current_dep_node_owner : CRATE_DEF_INDEX ,
167
- currently_in_body : false ,
168
- dep_graph,
169
123
definitions,
170
124
hir_to_node_id,
171
125
hcx,
172
126
hir_body_nodes,
173
- owner_map : FxHashMap :: default ( ) ,
174
- owner_items_map : FxHashMap :: default ( ) ,
127
+ owner_map : FxHashMap :: with_capacity_and_hasher (
128
+ definitions. def_index_count ( ) ,
129
+ Default :: default ( ) ,
130
+ ) ,
131
+ owner_items_map : FxHashMap :: with_capacity_and_hasher (
132
+ definitions. def_index_count ( ) ,
133
+ Default :: default ( ) ,
134
+ ) ,
175
135
} ;
176
136
collector. insert_entry (
177
137
hir:: CRATE_HIR_ID ,
178
- Entry {
179
- parent : hir:: CRATE_HIR_ID ,
180
- dep_node : root_mod_sig_dep_index,
181
- node : Node :: Crate ( & krate. item ) ,
182
- } ,
138
+ Entry { parent : hir:: CRATE_HIR_ID , node : Node :: Crate ( & krate. item ) } ,
183
139
) ;
184
140
185
141
collector
@@ -191,7 +147,6 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
191
147
cstore : & dyn CrateStore ,
192
148
commandline_args_hash : u64 ,
193
149
) -> (
194
- HirEntryMap < ' hir > ,
195
150
FxHashMap < DefIndex , & ' hir HirOwner < ' hir > > ,
196
151
FxHashMap < DefIndex , & ' hir mut HirOwnerItems < ' hir > > ,
197
152
Svh ,
@@ -238,7 +193,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
238
193
let crate_hash: Fingerprint = stable_hasher. finish ( ) ;
239
194
240
195
let svh = Svh :: new ( crate_hash. to_smaller_hash ( ) ) ;
241
- ( self . map , self . owner_map , self . owner_items_map , svh)
196
+ ( self . owner_map , self . owner_items_map , svh)
242
197
}
243
198
244
199
fn insert_entry ( & mut self , id : HirId , entry : Entry < ' hir > ) {
@@ -265,26 +220,10 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
265
220
items. items [ id. local_id ] =
266
221
Some ( HirItem { parent : entry. parent . local_id , node : entry. node } ) ;
267
222
}
268
-
269
- debug ! ( "hir_map: {:?} => {:?}" , id, entry) ;
270
- let local_map = & mut self . map [ id. owner ] ;
271
- let len = local_map. len ( ) ;
272
- if i >= len {
273
- local_map. extend ( repeat ( None ) . take ( i - len + 1 ) ) ;
274
- }
275
- local_map[ id. local_id ] = Some ( entry) ;
276
223
}
277
224
278
225
fn insert ( & mut self , span : Span , hir_id : HirId , node : Node < ' hir > ) {
279
- let entry = Entry {
280
- parent : self . parent_node ,
281
- dep_node : if self . currently_in_body {
282
- self . current_full_dep_index
283
- } else {
284
- self . current_signature_dep_index
285
- } ,
286
- node,
287
- } ;
226
+ let entry = Entry { parent : self . parent_node , node } ;
288
227
289
228
// Make sure that the DepNode of some node coincides with the HirId
290
229
// owner of that node.
@@ -339,29 +278,14 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
339
278
f : F ,
340
279
) {
341
280
let prev_owner = self . current_dep_node_owner ;
342
- let prev_signature_dep_index = self . current_signature_dep_index ;
343
- let prev_full_dep_index = self . current_full_dep_index ;
344
- let prev_in_body = self . currently_in_body ;
345
281
346
282
let def_path_hash = self . definitions . def_path_hash ( dep_node_owner) ;
347
283
348
- let ( signature_dep_index, full_dep_index) = alloc_hir_dep_nodes (
349
- self . dep_graph ,
350
- & mut self . hcx ,
351
- def_path_hash,
352
- item_like,
353
- & mut self . hir_body_nodes ,
354
- ) ;
355
- self . current_signature_dep_index = signature_dep_index;
356
- self . current_full_dep_index = full_dep_index;
284
+ hash_body ( & mut self . hcx , def_path_hash, item_like, & mut self . hir_body_nodes ) ;
357
285
358
286
self . current_dep_node_owner = dep_node_owner;
359
- self . currently_in_body = false ;
360
287
f ( self ) ;
361
- self . currently_in_body = prev_in_body;
362
288
self . current_dep_node_owner = prev_owner;
363
- self . current_full_dep_index = prev_full_dep_index;
364
- self . current_signature_dep_index = prev_signature_dep_index;
365
289
}
366
290
}
367
291
@@ -390,10 +314,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
390
314
}
391
315
392
316
fn visit_nested_body ( & mut self , id : BodyId ) {
393
- let prev_in_body = self . currently_in_body ;
394
- self . currently_in_body = true ;
395
317
self . visit_body ( self . krate . body ( id) ) ;
396
- self . currently_in_body = prev_in_body;
397
318
}
398
319
399
320
fn visit_param ( & mut self , param : & ' hir Param < ' hir > ) {
@@ -616,19 +537,16 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
616
537
}
617
538
}
618
539
619
- // This is a wrapper structure that allows determining if span values within
620
- // the wrapped item should be hashed or not.
621
540
struct HirItemLike < T > {
622
541
item_like : T ,
623
- hash_bodies : bool ,
624
542
}
625
543
626
544
impl < ' hir , T > HashStable < StableHashingContext < ' hir > > for HirItemLike < T >
627
545
where
628
546
T : HashStable < StableHashingContext < ' hir > > ,
629
547
{
630
548
fn hash_stable ( & self , hcx : & mut StableHashingContext < ' hir > , hasher : & mut StableHasher ) {
631
- hcx. while_hashing_hir_bodies ( self . hash_bodies , |hcx| {
549
+ hcx. while_hashing_hir_bodies ( true , |hcx| {
632
550
self . item_like . hash_stable ( hcx, hasher) ;
633
551
} ) ;
634
552
}
0 commit comments