From 87ca083cfab811bfd755e22b55a0ac02f36b2bc6 Mon Sep 17 00:00:00 2001 From: bakaq Date: Mon, 5 May 2025 00:15:14 -0300 Subject: [PATCH] Align the heap to the size of heap cells --- src/machine/heap.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/machine/heap.rs b/src/machine/heap.rs index 7711b3b2..dc4d2ce0 100644 --- a/src/machine/heap.rs +++ b/src/machine/heap.rs @@ -21,7 +21,9 @@ impl Drop for Heap { fn drop(&mut self) { if !self.inner.ptr.is_null() { unsafe { - let layout = alloc::Layout::array::(self.inner.byte_cap).unwrap(); + let layout = + alloc::Layout::from_size_align(self.inner.byte_cap, size_of::()) + .unwrap(); alloc::dealloc(self.inner.ptr, layout); } } @@ -53,7 +55,8 @@ impl InnerHeap { 2 * self.byte_cap }; - let new_layout = alloc::Layout::array::(new_cap).unwrap(); + let new_layout = + alloc::Layout::from_size_align(new_cap, size_of::()).unwrap(); assert!( new_layout.size() <= isize::MAX as usize, @@ -63,7 +66,8 @@ impl InnerHeap { let new_ptr = if self.byte_cap == 0 { alloc::alloc(new_layout) } else { - let old_layout = alloc::Layout::array::(self.byte_cap).unwrap(); + let old_layout = + alloc::Layout::from_size_align(self.byte_cap, size_of::()).unwrap(); alloc::realloc(self.ptr, old_layout, new_layout.size()) }; @@ -585,7 +589,11 @@ impl Heap { pub(crate) fn with_cell_capacity(cap: usize) -> Result { let ptr = unsafe { - let layout = alloc::Layout::array::(cap).unwrap(); + let layout = alloc::Layout::from_size_align( + cap * size_of::(), + size_of::(), + ) + .unwrap(); alloc::alloc(layout) }; @@ -672,7 +680,9 @@ impl Heap { pub(crate) fn clear(&mut self) { unsafe { - let layout = alloc::Layout::array::(self.inner.byte_cap).unwrap(); + let layout = + alloc::Layout::from_size_align(self.inner.byte_cap, size_of::()) + .unwrap(); alloc::dealloc(self.inner.ptr, layout); } -- 2.54.0