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