review comments on vec-zsts

pull/161/head
Lzu Tao 6 years ago
parent 86adf8ac89
commit c34299fe82

@ -49,22 +49,26 @@ impl<T> RawVec<T> {
}
fn grow(&mut self) {
let elem_size = mem::size_of::<T>();
let align = mem::align_of::<T>();
unsafe {
// Since we set the capacity to `usize::MAX` for ZST is
// 0, getting to here necessarily means the Vec is overfull.
assert!(mem::size_of::<T>() != 0, "capacity overflow");
assert!(elem_size == 0, "capacity overflow");
let layout = alloc::Layout::new::<T>();
let layout;
let (new_cap, ptr) = if self.cap == 0 {
layout = alloc::Layout::from_size_align_unchecked(elem_size, align);
let ptr = alloc::alloc(layout);
(1, ptr)
} else {
let new_cap = self.cap * 2;
layout = alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align);
let ptr = alloc::realloc(
self.ptr.as_ptr() as *mut u8,
layout,
new_cap * mem::size_of::<T>(),
new_cap * elem_size,
);
(new_cap, ptr)
};
@ -82,10 +86,15 @@ impl<T> RawVec<T> {
impl<T> Drop for RawVec<T> {
fn drop(&mut self) {
// Do not free zero-sized allocations, as they were never allocated.
if self.cap != 0 && mem::size_of::<T>() != 0 {
let align = mem::align_of::<T>();
let elem_size = mem::size_of::<T>();
// don't free zero-sized allocations, as they were never allocated.
if self.cap != 0 && elem_size != 0 {
unsafe {
alloc::dealloc(self.ptr.as_ptr() as *mut u8, alloc::Layout::new::<T>());
alloc::dealloc(
self.ptr.as_ptr() as *mut u8,
alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align),
);
}
}
}

Loading…
Cancel
Save