11use {
22 crate :: {
3+ error:: Error ,
4+ ffi:: c_alloc:: { c_alloc, c_dealloc, c_zalloc, grow_aligned, shrink_aligned} ,
5+ helpers:: null_q_dyn_zsl_check,
36 Alloc ,
47 Dealloc ,
58 Grow ,
69 Layout ,
710 Realloc ,
8- Shrink ,
9- error:: Error ,
10- ffi:: c_alloc:: { c_alloc, c_dealloc, c_zalloc, grow_aligned, shrink_aligned} ,
11- helpers:: { null_q_dyn, null_q_dyn_zsl_check}
11+ Shrink
1212 } ,
1313 core:: { cmp:: Ordering , ffi:: c_void, ptr:: NonNull }
1414} ;
15-
1615// TODO: we should use the builtin malloc and realloc if align <= guaranteed align
1716
1817#[ cfg_attr( miri, track_caller) ]
1918fn pad_then_alloc (
2019 layout : Layout ,
2120 alloc : unsafe fn ( usize , usize ) -> * mut c_void
2221) -> Result < NonNull < u8 > , Error > {
23- let l = tri ! ( do layout. to_aligned_alloc_compatible( ) ) ;
22+ let padded = tri ! ( do layout. to_aligned_alloc_compatible( ) ) ;
2423 null_q_dyn_zsl_check (
2524 layout,
2625 // SAFETY: we rounded up the layout's values to satisfy the requirements.
27- |_| unsafe { alloc ( l . align ( ) , l . size ( ) ) }
26+ |_| unsafe { alloc ( padded . align ( ) , padded . size ( ) ) }
2827 )
2928}
3029
@@ -42,8 +41,14 @@ unsafe fn pad_then_grow(
4241 return Err ( Error :: GrowSmallerNewLayout ( old_layout. size ( ) , new_layout. size ( ) ) ) ;
4342 }
4443
45- null_q_dyn_zsl_check ( new_padded, |l| {
46- grow_aligned ( ptr. as_ptr ( ) . cast ( ) , old_padded. size ( ) , l. align ( ) , l. size ( ) , alloc)
44+ null_q_dyn_zsl_check ( new_layout, |_| {
45+ grow_aligned (
46+ ptr. as_ptr ( ) . cast ( ) ,
47+ old_padded. size ( ) ,
48+ new_padded. align ( ) ,
49+ new_padded. size ( ) ,
50+ alloc
51+ )
4752 } )
4853}
4954
@@ -57,13 +62,13 @@ unsafe fn pad_then_realloc(
5762 let old_padded = tri ! ( do old_layout. to_aligned_alloc_compatible( ) ) ;
5863 let new_padded = tri ! ( do new_layout. to_aligned_alloc_compatible( ) ) ;
5964
60- null_q_dyn_zsl_check ( new_padded , |l | {
65+ null_q_dyn_zsl_check ( new_layout , |_ | {
6166 let old_ptr = ptr. as_ptr ( ) . cast ( ) ;
6267 let old_size = old_padded. size ( ) ;
6368 let old_align = old_padded. align ( ) ;
6469
65- let size = l . size ( ) ;
66- let align = l . align ( ) ;
70+ let size = new_padded . size ( ) ;
71+ let align = new_padded . align ( ) ;
6772
6873 match old_size. cmp ( & new_padded. size ( ) ) {
6974 // SAFETY: caller guarantees that `old_ptr` and `old_size` are valid, we just
@@ -110,18 +115,16 @@ impl Alloc for CAlloc {
110115impl Dealloc for CAlloc {
111116 #[ cfg_attr( miri, track_caller) ]
112117 #[ inline]
113- unsafe fn dealloc ( & self , ptr : NonNull < u8 > , layout : Layout ) {
114- if layout. is_nonzero_sized ( ) {
118+ unsafe fn try_dealloc ( & self , ptr : NonNull < u8 > , layout : Layout ) -> Result < ( ) , Error > {
119+ if layout. is_zero_sized ( ) {
120+ Err ( Error :: ZeroSizedLayout )
121+ } else if ptr == layout. dangling ( ) {
122+ Err ( Error :: DanglingDeallocation )
123+ } else {
115124 c_dealloc ( ptr. as_ptr ( ) . cast ( ) ) ;
125+ Ok ( ( ) )
116126 }
117127 }
118-
119- #[ cfg_attr( miri, track_caller) ]
120- #[ inline]
121- unsafe fn try_dealloc ( & self , ptr : NonNull < u8 > , layout : Layout ) -> Result < ( ) , Error > {
122- self . dealloc ( ptr, layout) ;
123- Ok ( ( ) )
124- }
125128}
126129impl Grow for CAlloc {
127130 #[ cfg_attr( miri, track_caller) ]
@@ -158,10 +161,9 @@ impl Shrink for CAlloc {
158161 return Err ( Error :: ShrinkLargerNewLayout ( old_layout. size ( ) , new_layout. size ( ) ) ) ;
159162 }
160163
161- null_q_dyn (
162- shrink_aligned ( ptr. as_ptr ( ) . cast ( ) , new_padded. align ( ) , new_padded. size ( ) ) ,
163- new_padded
164- )
164+ null_q_dyn_zsl_check ( new_layout, |_| {
165+ shrink_aligned ( ptr. as_ptr ( ) . cast ( ) , new_padded. align ( ) , new_padded. size ( ) )
166+ } )
165167 }
166168}
167169impl Realloc for CAlloc {
0 commit comments