]> Repositorios git - scryer-prolog.git/commitdiff
Align the heap to the size of heap cells
authorbakaq <[email protected]>
Mon, 5 May 2025 03:15:14 +0000 (00:15 -0300)
committerMark Thom <[email protected]>
Tue, 8 Jul 2025 05:38:12 +0000 (22:38 -0700)
src/machine/heap.rs

index 7711b3b2c31e5672889cf2c5e71663852ad3b80a..dc4d2ce0b0f986b6fa54893a74645cc89b9417b6 100644 (file)
@@ -21,7 +21,9 @@ impl Drop for Heap {
     fn drop(&mut self) {
         if !self.inner.ptr.is_null() {
             unsafe {
-                let layout = alloc::Layout::array::<u8>(self.inner.byte_cap).unwrap();
+                let layout =
+                    alloc::Layout::from_size_align(self.inner.byte_cap, size_of::<HeapCellValue>())
+                        .unwrap();
                 alloc::dealloc(self.inner.ptr, layout);
             }
         }
@@ -53,7 +55,8 @@ impl InnerHeap {
             2 * self.byte_cap
         };
 
-        let new_layout = alloc::Layout::array::<u8>(new_cap).unwrap();
+        let new_layout =
+            alloc::Layout::from_size_align(new_cap, size_of::<HeapCellValue>()).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::<u8>(self.byte_cap).unwrap();
+            let old_layout =
+                alloc::Layout::from_size_align(self.byte_cap, size_of::<HeapCellValue>()).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<Self, usize> {
         let ptr = unsafe {
-            let layout = alloc::Layout::array::<HeapCellValue>(cap).unwrap();
+            let layout = alloc::Layout::from_size_align(
+                cap * size_of::<HeapCellValue>(),
+                size_of::<HeapCellValue>(),
+            )
+            .unwrap();
             alloc::alloc(layout)
         };
 
@@ -672,7 +680,9 @@ impl Heap {
 
     pub(crate) fn clear(&mut self) {
         unsafe {
-            let layout = alloc::Layout::array::<u8>(self.inner.byte_cap).unwrap();
+            let layout =
+                alloc::Layout::from_size_align(self.inner.byte_cap, size_of::<HeapCellValue>())
+                    .unwrap();
             alloc::dealloc(self.inner.ptr, layout);
         }