@@ -51,38 +51,46 @@ pub const Heap: Global = Global;
51
51
52
52
unsafe impl GlobalAlloc for Global {
53
53
#[ inline]
54
- unsafe fn alloc ( & self , layout : Layout ) -> * mut Opaque {
55
- let ptr = __rust_alloc ( layout. size ( ) , layout. align ( ) ) ;
56
- ptr as * mut Opaque
54
+ unsafe fn alloc ( & self , layout : Layout ) -> Result < NonNull < Opaque > , AllocErr > {
55
+ NonNull :: new ( __rust_alloc ( layout. size ( ) , layout. align ( ) ) as * mut Opaque ) . ok_or ( AllocErr )
57
56
}
58
57
59
58
#[ inline]
60
- unsafe fn dealloc ( & self , ptr : * mut Opaque , layout : Layout ) {
61
- __rust_dealloc ( ptr as * mut u8 , layout. size ( ) , layout. align ( ) )
59
+ unsafe fn dealloc ( & self , ptr : NonNull < Opaque > , layout : Layout ) {
60
+ __rust_dealloc ( ptr. as_ptr ( ) as * mut u8 , layout. size ( ) , layout. align ( ) )
62
61
}
63
62
64
63
#[ inline]
65
- unsafe fn realloc ( & self , ptr : * mut Opaque , layout : Layout , new_size : usize ) -> * mut Opaque {
66
- let ptr = __rust_realloc ( ptr as * mut u8 , layout. size ( ) , layout. align ( ) , new_size) ;
67
- ptr as * mut Opaque
64
+ unsafe fn realloc (
65
+ & self ,
66
+ ptr : NonNull < Opaque > ,
67
+ layout : Layout ,
68
+ new_size : usize ,
69
+ ) -> Result < NonNull < Opaque > , AllocErr > {
70
+ NonNull :: new ( __rust_realloc (
71
+ ptr. as_ptr ( ) as * mut u8 ,
72
+ layout. size ( ) ,
73
+ layout. align ( ) ,
74
+ new_size,
75
+ ) as * mut Opaque ) . ok_or ( AllocErr )
68
76
}
69
77
70
78
#[ inline]
71
- unsafe fn alloc_zeroed ( & self , layout : Layout ) -> * mut Opaque {
72
- let ptr = __rust_alloc_zeroed ( layout. size ( ) , layout. align ( ) ) ;
73
- ptr as * mut Opaque
79
+ unsafe fn alloc_zeroed ( & self , layout : Layout ) -> Result < NonNull < Opaque > , AllocErr > {
80
+ NonNull :: new ( __rust_alloc_zeroed ( layout. size ( ) , layout. align ( ) ) as * mut Opaque )
81
+ . ok_or ( AllocErr )
74
82
}
75
83
}
76
84
77
85
unsafe impl Alloc for Global {
78
86
#[ inline]
79
87
unsafe fn alloc ( & mut self , layout : Layout ) -> Result < NonNull < Opaque > , AllocErr > {
80
- NonNull :: new ( GlobalAlloc :: alloc ( self , layout) ) . ok_or ( AllocErr )
88
+ GlobalAlloc :: alloc ( self , layout)
81
89
}
82
90
83
91
#[ inline]
84
92
unsafe fn dealloc ( & mut self , ptr : NonNull < Opaque > , layout : Layout ) {
85
- GlobalAlloc :: dealloc ( self , ptr. as_ptr ( ) , layout)
93
+ GlobalAlloc :: dealloc ( self , ptr, layout)
86
94
}
87
95
88
96
#[ inline]
@@ -92,12 +100,12 @@ unsafe impl Alloc for Global {
92
100
new_size : usize )
93
101
-> Result < NonNull < Opaque > , AllocErr >
94
102
{
95
- NonNull :: new ( GlobalAlloc :: realloc ( self , ptr. as_ptr ( ) , layout, new_size) ) . ok_or ( AllocErr )
103
+ GlobalAlloc :: realloc ( self , ptr, layout, new_size)
96
104
}
97
105
98
106
#[ inline]
99
107
unsafe fn alloc_zeroed ( & mut self , layout : Layout ) -> Result < NonNull < Opaque > , AllocErr > {
100
- NonNull :: new ( GlobalAlloc :: alloc_zeroed ( self , layout) ) . ok_or ( AllocErr )
108
+ GlobalAlloc :: alloc_zeroed ( self , layout)
101
109
}
102
110
}
103
111
@@ -111,25 +119,22 @@ unsafe fn exchange_malloc(size: usize, align: usize) -> *mut u8 {
111
119
align as * mut u8
112
120
} else {
113
121
let layout = Layout :: from_size_align_unchecked ( size, align) ;
114
- let ptr = Global . alloc ( layout) ;
115
- if !ptr. is_null ( ) {
116
- ptr as * mut u8
117
- } else {
118
- oom ( layout)
122
+ match Global . alloc ( layout) {
123
+ Ok ( p) => p. as_ptr ( ) as * mut u8 ,
124
+ Err ( _) => oom ( layout) ,
119
125
}
120
126
}
121
127
}
122
128
123
129
#[ cfg_attr( not( test) , lang = "box_free" ) ]
124
130
#[ inline]
125
131
pub ( crate ) unsafe fn box_free < T : ?Sized > ( ptr : Unique < T > ) {
126
- let ptr = ptr. as_ptr ( ) ;
127
- let size = size_of_val ( & * ptr) ;
128
- let align = min_align_of_val ( & * ptr) ;
132
+ let size = size_of_val ( ptr. as_ref ( ) ) ;
133
+ let align = min_align_of_val ( ptr. as_ref ( ) ) ;
129
134
// We do not allocate for Box<T> when T is ZST, so deallocation is also not necessary.
130
135
if size != 0 {
131
136
let layout = Layout :: from_size_align_unchecked ( size, align) ;
132
- Global . dealloc ( ptr as * mut Opaque , layout) ;
137
+ Global . dealloc ( NonNull :: from ( ptr) . cast ( ) , layout) ;
133
138
}
134
139
}
135
140
0 commit comments