@@ -14,7 +14,7 @@ use core::ops::Drop;
14
14
use core:: ptr:: { self , NonNull , Unique } ;
15
15
use core:: slice;
16
16
17
- use alloc:: { Alloc , Layout , Global , oom} ;
17
+ use alloc:: { Alloc , Layout , Global , oom, Excess } ;
18
18
use alloc:: CollectionAllocErr ;
19
19
use alloc:: CollectionAllocErr :: * ;
20
20
use boxed:: Box ;
@@ -92,17 +92,17 @@ impl<T, A: Alloc> RawVec<T, A> {
92
92
alloc_guard ( alloc_size) . unwrap_or_else ( |_| capacity_overflow ( ) ) ;
93
93
94
94
// handles ZSTs and `cap = 0` alike
95
- let ptr = if alloc_size == 0 {
96
- NonNull :: < T > :: dangling ( ) . as_opaque ( )
95
+ let ( ptr, cap ) = if alloc_size == 0 {
96
+ ( NonNull :: < T > :: dangling ( ) . as_opaque ( ) , cap )
97
97
} else {
98
98
let align = mem:: align_of :: < T > ( ) ;
99
99
let result = if zeroed {
100
- a. alloc_zeroed ( Layout :: from_size_align ( alloc_size, align) . unwrap ( ) )
100
+ a. alloc_zeroed_excess ( Layout :: from_size_align ( alloc_size, align) . unwrap ( ) )
101
101
} else {
102
- a. alloc ( Layout :: from_size_align ( alloc_size, align) . unwrap ( ) )
102
+ a. alloc_excess ( Layout :: from_size_align ( alloc_size, align) . unwrap ( ) )
103
103
} ;
104
104
match result {
105
- Ok ( ptr) => ptr,
105
+ Ok ( Excess ( ptr, alloc_size ) ) => ( ptr, alloc_size / elem_size ) ,
106
106
Err ( _) => oom ( ) ,
107
107
}
108
108
} ;
@@ -407,16 +407,17 @@ impl<T, A: Alloc> RawVec<T, A> {
407
407
408
408
alloc_guard ( new_layout. size ( ) ) ?;
409
409
410
- let res = match self . current_layout ( ) {
410
+ let Excess ( ptr , alloc_size ) = match self . current_layout ( ) {
411
411
Some ( layout) => {
412
412
debug_assert ! ( new_layout. align( ) == layout. align( ) ) ;
413
- self . a . realloc ( NonNull :: from ( self . ptr ) . as_opaque ( ) , layout, new_layout. size ( ) )
413
+ self . a . realloc_excess ( NonNull :: from ( self . ptr ) . as_opaque ( ) ,
414
+ layout, new_layout. size ( ) )
414
415
}
415
- None => self . a . alloc ( new_layout) ,
416
- } ;
416
+ None => self . a . alloc_excess ( new_layout) ,
417
+ } ? ;
417
418
418
- self . ptr = res? . cast ( ) . into ( ) ;
419
- self . cap = new_cap ;
419
+ self . ptr = ptr . cast ( ) . into ( ) ;
420
+ self . cap = alloc_size / mem :: size_of :: < T > ( ) ;
420
421
421
422
Ok ( ( ) )
422
423
}
@@ -485,16 +486,16 @@ impl<T, A: Alloc> RawVec<T, A> {
485
486
// FIXME: may crash and burn on over-reserve
486
487
alloc_guard ( new_layout. size ( ) ) ?;
487
488
488
- let res = match self . current_layout ( ) {
489
+ let Excess ( ptr , alloc_size ) = match self . current_layout ( ) {
489
490
Some ( layout) => {
490
491
debug_assert ! ( new_layout. align( ) == layout. align( ) ) ;
491
- self . a . realloc ( NonNull :: from ( self . ptr ) . as_opaque ( ) , layout, new_layout. size ( ) )
492
+ self . a . realloc_excess ( NonNull :: from ( self . ptr ) . as_opaque ( ) ,
493
+ layout, new_layout. size ( ) )
492
494
}
493
- None => self . a . alloc ( new_layout) ,
494
- } ;
495
-
496
- self . ptr = res?. cast ( ) . into ( ) ;
497
- self . cap = new_cap;
495
+ None => self . a . alloc_excess ( new_layout) ,
496
+ } ?;
497
+ self . ptr = ptr. cast ( ) . into ( ) ;
498
+ self . cap = alloc_size / mem:: size_of :: < T > ( ) ;
498
499
499
500
Ok ( ( ) )
500
501
}
@@ -604,11 +605,11 @@ impl<T, A: Alloc> RawVec<T, A> {
604
605
let new_layout = Layout :: new :: < T > ( ) . repeat ( new_cap) . unwrap ( ) . 0 ;
605
606
// FIXME: may crash and burn on over-reserve
606
607
alloc_guard ( new_layout. size ( ) ) . unwrap_or_else ( |_| capacity_overflow ( ) ) ;
607
- match self . a . grow_in_place (
608
+ match self . a . grow_in_place_excess (
608
609
NonNull :: from ( self . ptr ) . as_opaque ( ) , old_layout, new_layout. size ( ) ,
609
610
) {
610
- Ok ( _ ) => {
611
- self . cap = new_cap ;
611
+ Ok ( Excess ( _ , alloc_size ) ) => {
612
+ self . cap = alloc_size / mem :: size_of :: < T > ( ) ;
612
613
true
613
614
}
614
615
Err ( _) => {
@@ -666,10 +667,13 @@ impl<T, A: Alloc> RawVec<T, A> {
666
667
let new_size = elem_size * amount;
667
668
let align = mem:: align_of :: < T > ( ) ;
668
669
let old_layout = Layout :: from_size_align_unchecked ( old_size, align) ;
669
- match self . a . realloc ( NonNull :: from ( self . ptr ) . as_opaque ( ) ,
670
+ match self . a . realloc_excess ( NonNull :: from ( self . ptr ) . as_opaque ( ) ,
670
671
old_layout,
671
672
new_size) {
672
- Ok ( p) => self . ptr = p. cast ( ) . into ( ) ,
673
+ Ok ( Excess ( ptr, alloc_size) ) => {
674
+ self . ptr = ptr. cast ( ) . into ( ) ;
675
+ self . cap = alloc_size / mem:: size_of :: < T > ( ) ;
676
+ } ,
673
677
Err ( _) => oom ( ) ,
674
678
}
675
679
}
0 commit comments