@@ -202,197 +202,245 @@ impl DepGraph {
202
202
arg : A ,
203
203
task : fn ( C , A ) -> R )
204
204
-> ( R , DepNodeIndex )
205
- where C : DepGraphSafe + StableHashingContextProvider < ' gcx > ,
205
+ where C : DepGraphSafe + StableHashingContextProvider < ' gcx > + Clone ,
206
206
R : HashStable < StableHashingContext < ' gcx > > ,
207
207
{
208
- self . with_task_impl ( key , cx , arg , false , task ,
209
- |key| OpenTask :: Regular ( Lock :: new ( RegularOpenTask {
208
+ if let Some ( ref data ) = self . data {
209
+ let open_task = OpenTask :: Regular ( Lock :: new ( RegularOpenTask {
210
210
node : key,
211
211
reads : SmallVec :: new ( ) ,
212
212
read_set : Default :: default ( ) ,
213
- } ) ) ,
214
- |data, key, task| data. borrow_mut ( ) . complete_task ( key, task) )
213
+ } ) ) ;
214
+ let result = ty:: tls:: with_context ( |icx| {
215
+ let icx = ty:: tls:: ImplicitCtxt {
216
+ task : & open_task,
217
+ ..icx. clone ( )
218
+ } ;
219
+
220
+ ty:: tls:: enter_context ( & icx, |_| {
221
+ task ( cx. clone ( ) , arg)
222
+ } )
223
+ } ) ;
224
+ let dep_node_index = data. current . borrow_mut ( ) . complete_task ( key, open_task) ;
225
+ self . finish_task_incr_on ( data, key, cx, & result, dep_node_index) ;
226
+ ( result, dep_node_index)
227
+ } else {
228
+ let result = task ( cx. clone ( ) , arg) ;
229
+ self . finish_task_incr_off ( key, cx, & result) ;
230
+ ( result, DepNodeIndex :: INVALID )
231
+ }
215
232
}
216
233
217
- /// Creates a new dep-graph input with value `input`
218
- pub fn input_task < ' gcx , C , R > ( & self ,
219
- key : DepNode ,
220
- cx : C ,
221
- input : R )
222
- -> ( R , DepNodeIndex )
223
- where C : DepGraphSafe + StableHashingContextProvider < ' gcx > ,
224
- R : HashStable < StableHashingContext < ' gcx > > ,
234
+ /// Execute something within an "eval-always" task which is a task
235
+ // that runs whenever anything changes.
236
+ // FIXME: Find a way to make F: DepGraphSafe
237
+ pub fn with_eval_always_task < ' a , F , R > (
238
+ & self ,
239
+ tcx : TyCtxt < ' a , ' _ , ' _ > ,
240
+ key : DepNode ,
241
+ task : F ,
242
+ ) -> ( R , DepNodeIndex )
243
+ where F : FnOnce ( & OpenTask ) -> R ,
244
+ R : HashStable < StableHashingContext < ' a > > ,
225
245
{
226
- fn identity_fn < C , A > ( _: C , arg : A ) -> A {
227
- arg
246
+ if let Some ( ref data) = self . data {
247
+ let open_task = OpenTask :: EvalAlways { node : key } ;
248
+ let result = task ( & open_task) ;
249
+ let dep_node_index = data. current . borrow_mut ( )
250
+ . complete_eval_always_task ( key, open_task) ;
251
+ self . finish_task_incr_on ( data, key, tcx, & result, dep_node_index) ;
252
+ ( result, dep_node_index)
253
+ } else {
254
+ debug_assert ! ( !key. kind. fingerprint_needed_for_crate_hash( ) ) ;
255
+ ( task ( & OpenTask :: Ignore ) , DepNodeIndex :: INVALID )
228
256
}
257
+ }
229
258
230
- self . with_task_impl ( key, cx, input, true , identity_fn,
231
- |_| OpenTask :: Ignore ,
232
- |data, key, _| data. borrow_mut ( ) . alloc_node ( key, SmallVec :: new ( ) ) )
259
+ // FIXME: Merge with with_task?
260
+ pub fn with_query_task < ' a , F , R > (
261
+ & self ,
262
+ tcx : TyCtxt < ' a , ' _ , ' _ > ,
263
+ key : DepNode ,
264
+ task : F ,
265
+ ) -> ( R , DepNodeIndex )
266
+ where F : FnOnce ( & OpenTask ) -> R ,
267
+ R : HashStable < StableHashingContext < ' a > > ,
268
+ {
269
+ if let Some ( ref data) = self . data {
270
+ let open_task = OpenTask :: Regular ( Lock :: new ( RegularOpenTask {
271
+ node : key,
272
+ reads : SmallVec :: new ( ) ,
273
+ read_set : Default :: default ( ) ,
274
+ } ) ) ;
275
+ let result = task ( & open_task) ;
276
+ // FIXME: Look at `complete_task` and the same for other functions
277
+ let dep_node_index = data. current . borrow_mut ( ) . complete_task ( key, open_task) ;
278
+ self . finish_task_incr_on ( data, key, tcx, & result, dep_node_index) ;
279
+ ( result, dep_node_index)
280
+ } else {
281
+ debug_assert ! ( !key. kind. fingerprint_needed_for_crate_hash( ) ) ;
282
+ // with_task runs finish_task_incr_off here
283
+ ( task ( & OpenTask :: Ignore ) , DepNodeIndex :: INVALID )
284
+ }
285
+ }
286
+
287
+ /// Creates a new dep-graph input with value `input`
288
+ pub fn input_dep_index < ' gcx , R > (
289
+ & self ,
290
+ key : DepNode ,
291
+ cx : & StableHashingContext < ' gcx > ,
292
+ input : & R
293
+ ) -> DepNodeIndex
294
+ where R : HashStable < StableHashingContext < ' gcx > > ,
295
+ {
296
+ // This assumes that we don't have an ImplicitCtxt and thus have
297
+ // an implicit OpenTask::Ignore task
298
+ debug_assert ! ( ty:: tls:: with_opt( |tcx| tcx. is_none( ) ) ) ;
299
+
300
+ if let Some ( ref data) = self . data {
301
+ let dep_node_index = data. current . borrow_mut ( ) . alloc_node ( key, SmallVec :: new ( ) ) ;
302
+ self . finish_task_incr_on ( data, key, cx, input, dep_node_index) ;
303
+ dep_node_index
304
+ } else {
305
+ self . finish_task_incr_off ( key, cx, input)
306
+ }
233
307
}
234
308
235
- fn with_task_impl < ' gcx , C , A , R > (
309
+ fn finish_task_incr_on < ' gcx , C , R > (
236
310
& self ,
311
+ data : & DepGraphData ,
237
312
key : DepNode ,
238
313
cx : C ,
239
- arg : A ,
240
- no_tcx : bool ,
241
- task : fn ( C , A ) -> R ,
242
- // FIXME: Take OpenTask as a parameter instead
243
- create_task : fn ( DepNode ) -> OpenTask ,
244
- finish_task_and_alloc_depnode : fn ( & Lock < CurrentDepGraph > ,
245
- DepNode ,
246
- OpenTask ) -> DepNodeIndex
247
- ) -> ( R , DepNodeIndex )
314
+ result : & R ,
315
+ dep_node_index : DepNodeIndex ,
316
+ )
248
317
where
249
318
C : DepGraphSafe + StableHashingContextProvider < ' gcx > ,
250
319
R : HashStable < StableHashingContext < ' gcx > > ,
251
320
{
252
- if let Some ( ref data) = self . data {
253
- let open_task = create_task ( key) ;
321
+ // In incremental mode, hash the result of the task. We don't
322
+ // do anything with the hash yet, but we are computing it
323
+ // anyway so that
324
+ // - we make sure that the infrastructure works and
325
+ // - we can get an idea of the runtime cost.
326
+ let mut hcx = cx. get_stable_hashing_context ( ) ;
327
+
328
+ if cfg ! ( debug_assertions) {
329
+ profq_msg ( hcx. sess ( ) , ProfileQueriesMsg :: TaskBegin ( key. clone ( ) ) )
330
+ } ;
254
331
255
- // In incremental mode, hash the result of the task. We don't
256
- // do anything with the hash yet, but we are computing it
257
- // anyway so that
258
- // - we make sure that the infrastructure works and
259
- // - we can get an idea of the runtime cost.
260
- let mut hcx = cx. get_stable_hashing_context ( ) ;
332
+ if cfg ! ( debug_assertions) {
333
+ profq_msg ( hcx. sess ( ) , ProfileQueriesMsg :: TaskEnd )
334
+ } ;
261
335
262
- if cfg ! ( debug_assertions) {
263
- profq_msg ( hcx. sess ( ) , ProfileQueriesMsg :: TaskBegin ( key. clone ( ) ) )
264
- } ;
336
+ let mut stable_hasher = StableHasher :: new ( ) ;
337
+ result. hash_stable ( & mut hcx, & mut stable_hasher) ;
265
338
266
- let result = if no_tcx {
267
- task ( cx, arg)
268
- } else {
269
- ty:: tls:: with_context ( |icx| {
270
- let icx = ty:: tls:: ImplicitCtxt {
271
- task : & open_task,
272
- ..icx. clone ( )
273
- } ;
274
-
275
- ty:: tls:: enter_context ( & icx, |_| {
276
- task ( cx, arg)
277
- } )
278
- } )
279
- } ;
339
+ let current_fingerprint = stable_hasher. finish ( ) ;
280
340
281
- if cfg ! ( debug_assertions ) {
282
- profq_msg ( hcx . sess ( ) , ProfileQueriesMsg :: TaskEnd )
283
- } ;
341
+ // Store the current fingerprint
342
+ {
343
+ let mut fingerprints = self . fingerprints . borrow_mut ( ) ;
284
344
285
- let dep_node_index = finish_task_and_alloc_depnode ( & data. current , key, open_task) ;
345
+ if dep_node_index. index ( ) >= fingerprints. len ( ) {
346
+ fingerprints. resize ( dep_node_index. index ( ) + 1 , Fingerprint :: ZERO ) ;
347
+ }
286
348
287
- let mut stable_hasher = StableHasher :: new ( ) ;
288
- result. hash_stable ( & mut hcx, & mut stable_hasher) ;
349
+ debug_assert ! ( fingerprints[ dep_node_index] == Fingerprint :: ZERO ,
350
+ "DepGraph::with_task() - Duplicate fingerprint \
351
+ insertion for {:?}", key) ;
352
+ fingerprints[ dep_node_index] = current_fingerprint;
353
+ }
289
354
290
- let current_fingerprint = stable_hasher. finish ( ) ;
355
+ // Determine the color of the new DepNode.
356
+ if let Some ( prev_index) = data. previous . node_to_index_opt ( & key) {
357
+ let prev_fingerprint = data. previous . fingerprint_by_index ( prev_index) ;
291
358
292
- // Store the current fingerprint
293
- {
294
- let mut fingerprints = self . fingerprints . borrow_mut ( ) ;
359
+ let color = if current_fingerprint == prev_fingerprint {
360
+ DepNodeColor :: Green ( dep_node_index)
361
+ } else {
362
+ DepNodeColor :: Red
363
+ } ;
295
364
296
- if dep_node_index. index ( ) >= fingerprints. len ( ) {
297
- fingerprints. resize ( dep_node_index. index ( ) + 1 , Fingerprint :: ZERO ) ;
298
- }
365
+ let mut colors = data. colors . borrow_mut ( ) ;
366
+ debug_assert ! ( colors. get( prev_index) . is_none( ) ,
367
+ "DepGraph::with_task() - Duplicate DepNodeColor \
368
+ insertion for {:?}", key) ;
299
369
300
- debug_assert ! ( fingerprints[ dep_node_index] == Fingerprint :: ZERO ,
301
- "DepGraph::with_task() - Duplicate fingerprint \
302
- insertion for {:?}", key) ;
303
- fingerprints[ dep_node_index] = current_fingerprint;
304
- }
370
+ colors. insert ( prev_index, color) ;
371
+ }
372
+ }
305
373
306
- // Determine the color of the new DepNode.
307
- if let Some ( prev_index) = data. previous . node_to_index_opt ( & key) {
308
- let prev_fingerprint = data. previous . fingerprint_by_index ( prev_index) ;
374
+ fn finish_task_incr_off < ' gcx , C , R > (
375
+ & self ,
376
+ key : DepNode ,
377
+ cx : C ,
378
+ result : & R ,
379
+ ) -> DepNodeIndex
380
+ where
381
+ C : DepGraphSafe + StableHashingContextProvider < ' gcx > ,
382
+ R : HashStable < StableHashingContext < ' gcx > > ,
383
+ {
384
+ debug_assert ! ( self . data. is_none( ) ) ;
309
385
310
- let color = if current_fingerprint == prev_fingerprint {
311
- DepNodeColor :: Green ( dep_node_index )
312
- } else {
313
- DepNodeColor :: Red
314
- } ;
386
+ if key . kind . fingerprint_needed_for_crate_hash ( ) {
387
+ let mut hcx = cx . get_stable_hashing_context ( ) ;
388
+ let mut stable_hasher = StableHasher :: new ( ) ;
389
+ result . hash_stable ( & mut hcx , & mut stable_hasher ) ;
390
+ let fingerprint = stable_hasher . finish ( ) ;
315
391
316
- let mut colors = data. colors . borrow_mut ( ) ;
317
- debug_assert ! ( colors. get( prev_index) . is_none( ) ,
318
- "DepGraph::with_task() - Duplicate DepNodeColor \
319
- insertion for {:?}", key) ;
392
+ let mut fingerprints = self . fingerprints . borrow_mut ( ) ;
393
+ let dep_node_index = DepNodeIndex :: new ( fingerprints. len ( ) ) ;
394
+ fingerprints. push ( fingerprint) ;
320
395
321
- colors. insert ( prev_index, color) ;
322
- }
396
+ debug_assert ! ( fingerprints[ dep_node_index] == fingerprint,
397
+ "DepGraph::with_task() - Assigned fingerprint to \
398
+ unexpected index for {:?}", key) ;
323
399
324
- ( result , dep_node_index)
400
+ dep_node_index
325
401
} else {
326
- if key. kind . fingerprint_needed_for_crate_hash ( ) {
327
- let mut hcx = cx. get_stable_hashing_context ( ) ;
328
- let result = task ( cx, arg) ;
329
- let mut stable_hasher = StableHasher :: new ( ) ;
330
- result. hash_stable ( & mut hcx, & mut stable_hasher) ;
331
- let fingerprint = stable_hasher. finish ( ) ;
332
-
333
- let mut fingerprints = self . fingerprints . borrow_mut ( ) ;
334
- let dep_node_index = DepNodeIndex :: new ( fingerprints. len ( ) ) ;
335
- fingerprints. push ( fingerprint) ;
336
-
337
- debug_assert ! ( fingerprints[ dep_node_index] == fingerprint,
338
- "DepGraph::with_task() - Assigned fingerprint to \
339
- unexpected index for {:?}", key) ;
340
-
341
- ( result, dep_node_index)
342
- } else {
343
- ( task ( cx, arg) , DepNodeIndex :: INVALID )
344
- }
402
+ DepNodeIndex :: INVALID
345
403
}
346
404
}
347
405
348
406
/// Execute something within an "anonymous" task, that is, a task the
349
407
/// DepNode of which is determined by the list of inputs it read from.
350
- pub fn with_anon_task < OP , R > ( & self , dep_kind : DepKind , op : OP ) -> ( R , DepNodeIndex )
351
- where OP : FnOnce ( ) -> R
408
+ pub fn with_anon_open_task < OP , R > ( & self , dep_kind : DepKind , op : OP ) -> ( R , DepNodeIndex )
409
+ where OP : FnOnce ( & OpenTask ) -> R
352
410
{
353
411
if let Some ( ref data) = self . data {
354
- let ( result, open_task) = ty:: tls:: with_context ( |icx| {
355
- let task = OpenTask :: Anon ( Lock :: new ( AnonOpenTask {
356
- reads : SmallVec :: new ( ) ,
357
- read_set : Default :: default ( ) ,
358
- } ) ) ;
359
-
360
- let r = {
361
- let icx = ty:: tls:: ImplicitCtxt {
362
- task : & task,
363
- ..icx. clone ( )
364
- } ;
365
-
366
- ty:: tls:: enter_context ( & icx, |_| {
367
- op ( )
368
- } )
369
- } ;
412
+ let task = OpenTask :: Anon ( Lock :: new ( AnonOpenTask {
413
+ reads : SmallVec :: new ( ) ,
414
+ read_set : Default :: default ( ) ,
415
+ } ) ) ;
370
416
371
- ( r, task)
372
- } ) ;
417
+ let result = op ( & task) ;
373
418
let dep_node_index = data. current
374
419
. borrow_mut ( )
375
- . pop_anon_task ( dep_kind, open_task ) ;
420
+ . pop_anon_task ( dep_kind, task ) ;
376
421
( result, dep_node_index)
377
422
} else {
378
- ( op ( ) , DepNodeIndex :: INVALID )
423
+ ( op ( & OpenTask :: Ignore ) , DepNodeIndex :: INVALID )
379
424
}
380
425
}
381
426
382
- /// Execute something within an "eval-always" task which is a task
383
- // that runs whenever anything changes.
384
- pub fn with_eval_always_task < ' gcx , C , A , R > ( & self ,
385
- key : DepNode ,
386
- cx : C ,
387
- arg : A ,
388
- task : fn ( C , A ) -> R )
389
- -> ( R , DepNodeIndex )
390
- where C : DepGraphSafe + StableHashingContextProvider < ' gcx > ,
391
- R : HashStable < StableHashingContext < ' gcx > > ,
427
+ /// Execute something within an "anonymous" task, that is, a task the
428
+ /// DepNode of which is determined by the list of inputs it read from.
429
+ pub fn with_anon_task < OP , R > ( & self , dep_kind : DepKind , op : OP ) -> ( R , DepNodeIndex )
430
+ where OP : FnOnce ( ) -> R
392
431
{
393
- self . with_task_impl ( key, cx, arg, false , task,
394
- |key| OpenTask :: EvalAlways { node : key } ,
395
- |data, key, task| data. borrow_mut ( ) . complete_eval_always_task ( key, task) )
432
+ self . with_anon_open_task ( dep_kind, |task| {
433
+ ty:: tls:: with_context ( |icx| {
434
+ let icx = ty:: tls:: ImplicitCtxt {
435
+ task,
436
+ ..icx. clone ( )
437
+ } ;
438
+
439
+ ty:: tls:: enter_context ( & icx, |_| {
440
+ op ( )
441
+ } )
442
+ } )
443
+ } )
396
444
}
397
445
398
446
#[ inline]
0 commit comments