]> Repositorios git - scryer-prolog.git/commitdiff
fix stack alignement
authorBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 14:21:20 +0000 (16:21 +0200)
committerBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 14:21:59 +0000 (16:21 +0200)
- adjust align() in RawBlockTraits impl for Stack
- ensure ptr is always aligned in RawBlock::allock

src/machine/stack.rs
src/raw_block.rs

index 604a52be3b7dc19c5e4f4003ad3aec968dc191ef..7f35cdbc6fb472e6a7ef51666ffcad61200c1614 100644 (file)
@@ -15,7 +15,9 @@ impl RawBlockTraits for Stack {
 
     #[inline]
     fn align() -> usize {
-        mem::align_of::<HeapCellValue>()
+        mem::align_of::<OrFrame>()
+            .max(mem::align_of::<AndFrame>())
+            .max(mem::align_of::<HeapCellValue>())
     }
 }
 
@@ -281,7 +283,6 @@ mod tests {
     use crate::machine::mock_wam::*;
 
     #[test]
-    #[cfg_attr(miri, ignore = "blocked on stack.rs UB")]
     fn stack_tests() {
         let mut wam = MockWAM::new();
 
index 2c10f49426c6203afca3538910ccd165e6013095..0c27bddef3cca1d4b3a433c6905da71ff30c7312 100644 (file)
@@ -96,9 +96,10 @@ impl<T: RawBlockTraits> RawBlock<T> {
     }
 
     pub unsafe fn alloc(&self, size: usize) -> *mut u8 {
-        if self.free_space() >= size {
+        let aligned_size = size.next_multiple_of(size);
+        if self.free_space() >= aligned_size {
             let ptr = *self.ptr.get();
-            *self.ptr.get() = ptr.add(size) as *mut _;
+            *self.ptr.get() = ptr.add(aligned_size) as *mut _;
             ptr
         } else {
             ptr::null_mut()