1
1
#![ feature( allocator_api) ]
2
2
3
3
use std:: ptr:: NonNull ;
4
- use std:: alloc:: { Global , AllocRef , Layout , System } ;
4
+ use std:: alloc:: { Global , AllocRef , Layout , System , AllocInit , ReallocPlacement } ;
5
5
use std:: slice;
6
6
7
7
fn check_alloc < T : AllocRef > ( mut allocator : T ) { unsafe {
8
8
for & align in & [ 4 , 8 , 16 , 32 ] {
9
9
let layout = Layout :: from_size_align ( 20 , align) . unwrap ( ) ;
10
10
11
11
for _ in 0 ..32 {
12
- let a = allocator. alloc ( layout) . unwrap ( ) . 0 ;
12
+ let a = allocator. alloc ( layout, AllocInit :: Uninitialized ) . unwrap ( ) . ptr ;
13
13
assert_eq ! ( a. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
14
14
allocator. dealloc ( a, layout) ;
15
15
}
16
16
17
- let p1 = allocator. alloc_zeroed ( layout) . unwrap ( ) . 0 ;
17
+ let p1 = allocator. alloc ( layout, AllocInit :: Zeroed ) . unwrap ( ) . ptr ;
18
18
assert_eq ! ( p1. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
19
19
20
- let p2 = allocator. realloc ( p1, layout, 40 ) . unwrap ( ) . 0 ;
20
+ // old size < new size
21
+ let p2 = allocator. grow ( p1, layout, 40 , ReallocPlacement :: MayMove , AllocInit :: Uninitialized ) . unwrap ( ) . ptr ;
21
22
let layout = Layout :: from_size_align ( 40 , align) . unwrap ( ) ;
22
23
assert_eq ! ( p2. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
23
24
let slice = slice:: from_raw_parts ( p2. as_ptr ( ) , 20 ) ;
24
25
assert_eq ! ( & slice, & [ 0_u8 ; 20 ] ) ;
25
26
26
27
// old size == new size
27
- let p3 = allocator. realloc ( p2, layout, 40 ) . unwrap ( ) . 0 ;
28
+ let p3 = allocator. grow ( p2, layout, 40 , ReallocPlacement :: MayMove , AllocInit :: Uninitialized ) . unwrap ( ) . ptr ;
28
29
assert_eq ! ( p3. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
29
30
let slice = slice:: from_raw_parts ( p3. as_ptr ( ) , 20 ) ;
30
31
assert_eq ! ( & slice, & [ 0_u8 ; 20 ] ) ;
31
32
32
33
// old size > new size
33
- let p4 = allocator. realloc ( p3, layout, 10 ) . unwrap ( ) . 0 ;
34
+ let p4 = allocator. shrink ( p3, layout, 10 , ReallocPlacement :: MayMove ) . unwrap ( ) . ptr ;
34
35
let layout = Layout :: from_size_align ( 10 , align) . unwrap ( ) ;
35
36
assert_eq ! ( p4. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
36
37
let slice = slice:: from_raw_parts ( p4. as_ptr ( ) , 10 ) ;
@@ -46,7 +47,7 @@ fn check_align_requests<T: AllocRef>(mut allocator: T) {
46
47
let iterations = 32 ;
47
48
unsafe {
48
49
let pointers: Vec < _ > = ( 0 ..iterations) . map ( |_| {
49
- allocator. alloc ( Layout :: from_size_align ( size, align) . unwrap ( ) ) . unwrap ( ) . 0
50
+ allocator. alloc ( Layout :: from_size_align ( size, align) . unwrap ( ) , AllocInit :: Uninitialized ) . unwrap ( ) . ptr
50
51
} ) . collect ( ) ;
51
52
for & ptr in & pointers {
52
53
assert_eq ! ( ( ptr. as_ptr( ) as usize ) % align, 0 ,
@@ -67,7 +68,7 @@ fn global_to_box() {
67
68
let l = Layout :: new :: < T > ( ) ;
68
69
// allocate manually with global allocator, then turn into Box and free there
69
70
unsafe {
70
- let ptr = Global . alloc ( l) . unwrap ( ) . 0 . as_ptr ( ) as * mut T ;
71
+ let ptr = Global . alloc ( l, AllocInit :: Uninitialized ) . unwrap ( ) . ptr . as_ptr ( ) as * mut T ;
71
72
let b = Box :: from_raw ( ptr) ;
72
73
drop ( b) ;
73
74
}
0 commit comments