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