@@ -409,6 +409,43 @@ impl ReservedAllocators {
409409 "Allocator mapping declared more free list allocators than the max allowed."
410410 ) ;
411411 }
412+
413+ // We may add more allocators from common/base plan after reserved allocators.
414+
415+ fn add_bump_pointer_allocator ( & mut self ) -> AllocatorSelector {
416+ let selector = AllocatorSelector :: BumpPointer ( self . n_bump_pointer ) ;
417+ self . n_bump_pointer += 1 ;
418+ selector
419+ }
420+ fn add_large_object_allocator ( & mut self ) -> AllocatorSelector {
421+ let selector = AllocatorSelector :: LargeObject ( self . n_large_object ) ;
422+ self . n_large_object += 1 ;
423+ selector
424+ }
425+ #[ allow( dead_code) ]
426+ fn add_malloc_allocator ( & mut self ) -> AllocatorSelector {
427+ let selector = AllocatorSelector :: Malloc ( self . n_malloc ) ;
428+ self . n_malloc += 1 ;
429+ selector
430+ }
431+ #[ allow( dead_code) ]
432+ fn add_immix_allocator ( & mut self ) -> AllocatorSelector {
433+ let selector = AllocatorSelector :: Immix ( self . n_immix ) ;
434+ self . n_immix += 1 ;
435+ selector
436+ }
437+ #[ allow( dead_code) ]
438+ fn add_mark_compact_allocator ( & mut self ) -> AllocatorSelector {
439+ let selector = AllocatorSelector :: MarkCompact ( self . n_mark_compact ) ;
440+ self . n_mark_compact += 1 ;
441+ selector
442+ }
443+ #[ allow( dead_code) ]
444+ fn add_free_list_allocator ( & mut self ) -> AllocatorSelector {
445+ let selector = AllocatorSelector :: FreeList ( self . n_free_list ) ;
446+ self . n_free_list += 1 ;
447+ selector
448+ }
412449}
413450
414451/// Create an allocator mapping for spaces in Common/BasePlan for a plan. A plan should reserve its own allocators.
@@ -430,35 +467,22 @@ pub(crate) fn create_allocator_mapping(
430467
431468 #[ cfg( feature = "code_space" ) ]
432469 {
433- map[ AllocationSemantics :: Code ] = AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ;
434- reserved. n_bump_pointer += 1 ;
435-
436- map[ AllocationSemantics :: LargeCode ] =
437- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ;
438- reserved. n_bump_pointer += 1 ;
470+ map[ AllocationSemantics :: Code ] = reserved. add_bump_pointer_allocator ( ) ;
471+ map[ AllocationSemantics :: LargeCode ] = reserved. add_bump_pointer_allocator ( ) ;
439472 }
440473
441474 #[ cfg( feature = "ro_space" ) ]
442475 {
443- map[ AllocationSemantics :: ReadOnly ] =
444- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ;
445- reserved. n_bump_pointer += 1 ;
476+ map[ AllocationSemantics :: ReadOnly ] = reserved. add_bump_pointer_allocator ( ) ;
446477 }
447478
448479 // spaces in common plan
449480
450481 if include_common_plan {
451- map[ AllocationSemantics :: Immortal ] =
452- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ;
453- reserved. n_bump_pointer += 1 ;
454-
455- map[ AllocationSemantics :: Los ] = AllocatorSelector :: LargeObject ( reserved. n_large_object ) ;
456- reserved. n_large_object += 1 ;
457-
482+ map[ AllocationSemantics :: Immortal ] = reserved. add_bump_pointer_allocator ( ) ;
483+ map[ AllocationSemantics :: Los ] = reserved. add_large_object_allocator ( ) ;
458484 // TODO: This should be freelist allocator once we use marksweep for nonmoving space.
459- map[ AllocationSemantics :: NonMoving ] =
460- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ;
461- reserved. n_bump_pointer += 1 ;
485+ map[ AllocationSemantics :: NonMoving ] = reserved. add_bump_pointer_allocator ( ) ;
462486 }
463487
464488 reserved. validate ( ) ;
@@ -487,45 +511,34 @@ pub(crate) fn create_space_mapping<VM: VMBinding>(
487511 #[ cfg( feature = "code_space" ) ]
488512 {
489513 vec. push ( (
490- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ,
514+ reserved. add_bump_pointer_allocator ( ) ,
491515 & plan. base ( ) . code_space ,
492516 ) ) ;
493- reserved. n_bump_pointer += 1 ;
494517 vec. push ( (
495- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ,
518+ reserved. add_bump_pointer_allocator ( ) ,
496519 & plan. base ( ) . code_lo_space ,
497520 ) ) ;
498- reserved. n_bump_pointer += 1 ;
499521 }
500522
501523 #[ cfg( feature = "ro_space" ) ]
502- {
503- vec. push ( (
504- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ,
505- & plan. base ( ) . ro_space ,
506- ) ) ;
507- reserved. n_bump_pointer += 1 ;
508- }
524+ vec. push ( ( reserved. add_bump_pointer_allocator ( ) , & plan. base ( ) . ro_space ) ) ;
509525
510526 // spaces in CommonPlan
511527
512528 if include_common_plan {
513529 vec. push ( (
514- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ,
530+ reserved. add_bump_pointer_allocator ( ) ,
515531 plan. common ( ) . get_immortal ( ) ,
516532 ) ) ;
517- reserved. n_bump_pointer += 1 ;
518533 vec. push ( (
519- AllocatorSelector :: LargeObject ( reserved. n_large_object ) ,
534+ reserved. add_large_object_allocator ( ) ,
520535 plan. common ( ) . get_los ( ) ,
521536 ) ) ;
522- reserved. n_large_object += 1 ;
523537 // TODO: This should be freelist allocator once we use marksweep for nonmoving space.
524538 vec. push ( (
525- AllocatorSelector :: BumpPointer ( reserved. n_bump_pointer ) ,
539+ reserved. add_bump_pointer_allocator ( ) ,
526540 plan. common ( ) . get_nonmoving ( ) ,
527541 ) ) ;
528- reserved. n_bump_pointer += 1 ;
529542 }
530543
531544 reserved. validate ( ) ;
0 commit comments