@@ -186,7 +186,7 @@ type PreBatchIndex = usize;
186
186
187
187
#[ derive( Hash , PartialEq , Eq , Clone , Debug ) ]
188
188
enum PreBatchItem {
189
- ParallelModule ( ResolvedVc < Box < dyn ChunkableModule > > ) ,
189
+ ParallelModule ( ResolvedVc < Box < dyn Module > > ) ,
190
190
ParallelReference ( PreBatchIndex ) ,
191
191
NonParallelEdge ( ChunkingType , ResolvedVc < Box < dyn Module > > ) ,
192
192
}
@@ -212,7 +212,7 @@ struct TraversalState<'l> {
212
212
213
213
struct PreBatches {
214
214
batches : Vec < PreBatch > ,
215
- entries : FxHashMap < ResolvedVc < Box < dyn ChunkableModule > > , PreBatchIndex > ,
215
+ entries : FxHashMap < ResolvedVc < Box < dyn Module > > , PreBatchIndex > ,
216
216
single_module_entries : FxIndexSet < ResolvedVc < Box < dyn Module > > > ,
217
217
}
218
218
@@ -227,9 +227,9 @@ impl PreBatches {
227
227
228
228
fn ensure_pre_batch_for_module (
229
229
& mut self ,
230
- module : ResolvedVc < Box < dyn ChunkableModule > > ,
230
+ module : ResolvedVc < Box < dyn Module > > ,
231
231
chunk_groups : & RoaringBitmapWrapper ,
232
- queue : & mut VecDeque < ( ResolvedVc < Box < dyn ChunkableModule > > , PreBatchIndex ) > ,
232
+ queue : & mut VecDeque < ( ResolvedVc < Box < dyn Module > > , PreBatchIndex ) > ,
233
233
) -> PreBatchIndex {
234
234
match self . entries . entry ( module) {
235
235
Entry :: Vacant ( e) => {
@@ -246,10 +246,10 @@ impl PreBatches {
246
246
247
247
async fn get_pre_batch_items (
248
248
& mut self ,
249
- entry : ResolvedVc < Box < dyn ChunkableModule > > ,
249
+ entry : ResolvedVc < Box < dyn Module > > ,
250
250
chunk_group_info : & ChunkGroupInfo ,
251
251
module_graph : & ModuleGraph ,
252
- queue : & mut VecDeque < ( ResolvedVc < Box < dyn ChunkableModule > > , PreBatchIndex ) > ,
252
+ queue : & mut VecDeque < ( ResolvedVc < Box < dyn Module > > , PreBatchIndex ) > ,
253
253
) -> Result < Vec < PreBatchItem > > {
254
254
let entry_chunk_groups = chunk_group_info
255
255
. module_chunk_groups
@@ -266,43 +266,34 @@ impl PreBatches {
266
266
& mut state,
267
267
|parent_info, node, state| {
268
268
let ty = parent_info. map_or ( & ChunkingType :: Parallel , |( _, ty) | ty) ;
269
+ let module = node. module ;
269
270
if !ty. is_parallel ( ) {
270
271
state. items . push ( PreBatchItem :: NonParallelEdge (
271
272
ty. without_inherit_async ( ) ,
272
- node . module ,
273
+ module,
273
274
) ) ;
274
275
return Ok ( GraphTraversalAction :: Exclude ) ;
275
276
}
276
- let Some ( chunkable_module) = ResolvedVc :: try_downcast ( node. module ) else {
277
- return Ok ( GraphTraversalAction :: Skip ) ;
278
- } ;
279
- let chunk_groups = chunk_group_info
280
- . module_chunk_groups
281
- . get ( & node. module )
282
- . context ( "all modules need to have chunk group info" ) ?;
283
- if chunk_groups != entry_chunk_groups {
284
- let idx = state. this . ensure_pre_batch_for_module (
285
- chunkable_module,
286
- chunk_groups,
287
- queue,
288
- ) ;
289
- state. items . push ( PreBatchItem :: ParallelReference ( idx) ) ;
290
- return Ok ( GraphTraversalAction :: Exclude ) ;
291
- }
292
- if visited. insert ( chunkable_module) {
277
+ if visited. insert ( module) {
278
+ let chunk_groups = chunk_group_info
279
+ . module_chunk_groups
280
+ . get ( & module)
281
+ . context ( "all modules need to have chunk group info" ) ?;
282
+ if chunk_groups != entry_chunk_groups {
283
+ let idx =
284
+ state
285
+ . this
286
+ . ensure_pre_batch_for_module ( module, chunk_groups, queue) ;
287
+ state. items . push ( PreBatchItem :: ParallelReference ( idx) ) ;
288
+ return Ok ( GraphTraversalAction :: Exclude ) ;
289
+ }
293
290
Ok ( GraphTraversalAction :: Continue )
294
291
} else {
295
292
Ok ( GraphTraversalAction :: Exclude )
296
293
}
297
294
} ,
298
- |parent_info, node, state| {
299
- let ty = parent_info. map_or ( & ChunkingType :: Parallel , |( _, ty) | ty) ;
300
- let item = if let Some ( chunkable_module) = ResolvedVc :: try_downcast ( node. module )
301
- {
302
- PreBatchItem :: ParallelModule ( chunkable_module)
303
- } else {
304
- PreBatchItem :: NonParallelEdge ( ty. without_inherit_async ( ) , node. module )
305
- } ;
295
+ |_, node, state| {
296
+ let item = PreBatchItem :: ParallelModule ( node. module ) ;
306
297
state. items . push ( item) ;
307
298
} ,
308
299
)
@@ -330,8 +321,7 @@ pub async fn compute_module_batches(
330
321
let module_graph = module_graph. await ?;
331
322
332
323
let mut pre_batches = PreBatches :: new ( ) ;
333
- let mut queue: VecDeque < ( ResolvedVc < Box < dyn ChunkableModule > > , PreBatchIndex ) > =
334
- VecDeque :: new ( ) ;
324
+ let mut queue: VecDeque < ( ResolvedVc < Box < dyn Module > > , PreBatchIndex ) > = VecDeque :: new ( ) ;
335
325
336
326
// Start with the entries
337
327
for chunk_group in & chunk_group_info. chunk_groups {
@@ -393,7 +383,7 @@ pub async fn compute_module_batches(
393
383
pre_batches. single_module_entries . insert ( * module) ;
394
384
}
395
385
}
396
- _ => { }
386
+ PreBatchItem :: ParallelReference ( _ ) => { }
397
387
}
398
388
}
399
389
}
@@ -513,28 +503,43 @@ pub async fn compute_module_batches(
513
503
514
504
let mut edges_count = 0 ;
515
505
516
- // Since batches can only have references followed by a list of parallel modules, we need to
517
- // split batches that have modules before references.
506
+ // Since batches can only have references followed by a list of parallel chunkable modules,
507
+ // we need to split batches that have modules before references.
518
508
for i in 0 ..pre_batches. batches . len ( ) {
519
509
let items = take ( & mut pre_batches. batches [ i] . items ) ;
520
510
let mut new_items =
521
511
FxIndexSet :: with_capacity_and_hasher ( items. len ( ) , Default :: default ( ) ) ;
522
512
enum Mode {
523
- ParallelModule ,
513
+ ParallelChunkableModule ,
524
514
Other ,
525
515
}
526
516
let mut mode = Mode :: Other ;
527
517
for item in items {
528
- match ( & mode, & item) {
529
- ( _, PreBatchItem :: ParallelModule ( _) ) => {
530
- mode = Mode :: ParallelModule ;
518
+ let chunkable_module = if let PreBatchItem :: ParallelModule ( module) = & item {
519
+ ResolvedVc :: try_downcast :: < Box < dyn ChunkableModule > > ( * module)
520
+ } else {
521
+ None
522
+ } ;
523
+ let item = if let PreBatchItem :: ParallelModule ( module) = item {
524
+ if chunkable_module. is_some ( ) {
525
+ PreBatchItem :: ParallelModule ( module)
526
+ } else {
527
+ pre_batches. single_module_entries . insert ( module) ;
528
+ PreBatchItem :: NonParallelEdge ( ChunkingType :: Parallel , module)
529
+ }
530
+ } else {
531
+ item
532
+ } ;
533
+ match ( & mode, chunkable_module) {
534
+ ( _, Some ( _) ) => {
535
+ mode = Mode :: ParallelChunkableModule ;
531
536
new_items. insert ( item) ;
532
537
}
533
538
( Mode :: Other , _) => {
534
539
edges_count += 1 ;
535
540
new_items. insert ( item) ;
536
541
}
537
- ( Mode :: ParallelModule , _) => {
542
+ ( Mode :: ParallelChunkableModule , _) => {
538
543
// Split the batch
539
544
let idx = pre_batches. batches . len ( ) ;
540
545
let mut new_batch =
@@ -543,7 +548,7 @@ pub async fn compute_module_batches(
543
548
pre_batches. batches . push ( new_batch) ;
544
549
edges_count += 1 ;
545
550
new_items. insert ( PreBatchItem :: ParallelReference ( idx) ) ;
546
- if matches ! ( item , PreBatchItem :: ParallelModule ( _ ) ) {
551
+ if chunkable_module . is_some ( ) {
547
552
new_items. insert ( item) ;
548
553
} else {
549
554
edges_count += 1 ;
@@ -572,9 +577,12 @@ pub async fn compute_module_batches(
572
577
. iter_mut ( )
573
578
. enumerate ( )
574
579
. map ( async |( i, pre_batch) | {
575
- let mut modules = pre_batch. items . iter ( ) . filter_map ( |item| match item {
576
- PreBatchItem :: ParallelModule ( module) => Some ( * module) ,
577
- _ => None ,
580
+ let mut modules = pre_batch. items . iter ( ) . filter_map ( |item| {
581
+ if let PreBatchItem :: ParallelModule ( module) = item {
582
+ ResolvedVc :: try_downcast ( * module)
583
+ } else {
584
+ None
585
+ }
578
586
} ) ;
579
587
let Some ( first) = modules. next ( ) else {
580
588
return Ok ( ModuleOrBatch :: None ( i) ) ;
0 commit comments