From: bakaq Date: Mon, 5 May 2025 03:15:14 +0000 (-0300) Subject: Align the heap to the size of heap cells X-Git-Tag: v0.10.0~35^2~13 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=87ca083cfab811bfd755e22b55a0ac02f36b2bc6;p=scryer-prolog.git Align the heap to the size of heap cells --- 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); }