Skip to content

Commit 29e3fbc

Browse files
committed
Change GlobalAlloc to use Result and NonNull instead of raw pointers
1 parent 38e2d54 commit 29e3fbc

File tree

10 files changed

+289
-120
lines changed

10 files changed

+289
-120
lines changed

src/liballoc/alloc.rs

+29-24
Original file line numberDiff line numberDiff line change
@@ -51,38 +51,46 @@ pub const Heap: Global = Global;
5151

5252
unsafe impl GlobalAlloc for Global {
5353
#[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)
5756
}
5857

5958
#[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())
6261
}
6362

6463
#[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)
6876
}
6977

7078
#[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)
7482
}
7583
}
7684

7785
unsafe impl Alloc for Global {
7886
#[inline]
7987
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)
8189
}
8290

8391
#[inline]
8492
unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
85-
GlobalAlloc::dealloc(self, ptr.as_ptr(), layout)
93+
GlobalAlloc::dealloc(self, ptr, layout)
8694
}
8795

8896
#[inline]
@@ -92,12 +100,12 @@ unsafe impl Alloc for Global {
92100
new_size: usize)
93101
-> Result<NonNull<Opaque>, AllocErr>
94102
{
95-
NonNull::new(GlobalAlloc::realloc(self, ptr.as_ptr(), layout, new_size)).ok_or(AllocErr)
103+
GlobalAlloc::realloc(self, ptr, layout, new_size)
96104
}
97105

98106
#[inline]
99107
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)
101109
}
102110
}
103111

@@ -111,25 +119,22 @@ unsafe fn exchange_malloc(size: usize, align: usize) -> *mut u8 {
111119
align as *mut u8
112120
} else {
113121
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),
119125
}
120126
}
121127
}
122128

123129
#[cfg_attr(not(test), lang = "box_free")]
124130
#[inline]
125131
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());
129134
// We do not allocate for Box<T> when T is ZST, so deallocation is also not necessary.
130135
if size != 0 {
131136
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);
133138
}
134139
}
135140

0 commit comments

Comments
 (0)