From 81e706469d7138d693775e7d4c381b2e2c28f93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 8 May 2019 18:03:37 +0000 Subject: [PATCH] style: Fix an assertion that doesn't account for alignment padding. I'm hitting this when trying to add bindings for box shadows, which are 32-bit aligned. Differential Revision: https://phabricator.services.mozilla.com/D30353 --- components/servo_arc/lib.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/components/servo_arc/lib.rs b/components/servo_arc/lib.rs index 3cc2b0e7fcc..40a8ff3d193 100644 --- a/components/servo_arc/lib.rs +++ b/components/servo_arc/lib.rs @@ -602,7 +602,7 @@ impl Arc> { F: FnOnce(Layout) -> *mut u8, I: Iterator + ExactSizeIterator, { - use std::mem::size_of; + use std::mem::{align_of, size_of}; assert_ne!(size_of::(), 0, "Need to think about ZST"); // Compute the required size for the allocation. @@ -678,8 +678,9 @@ impl Arc> { ); current = current.offset(1); } - // We should have consumed the buffer exactly. - debug_assert_eq!(current as *mut u8, buffer.offset(size as isize)); + // We should have consumed the buffer exactly, maybe accounting + // for some padding from the alignment. + debug_assert!((buffer.offset(size as isize) as usize - current as *mut u8 as usize) < align_of::()); } assert!( items.next().is_none(), @@ -1334,6 +1335,23 @@ mod tests { assert!(x.slice.is_empty()); } + #[test] + fn thin_assert_padding() { + #[derive(Clone, Default)] + #[repr(C)] + struct Padded { + i: u16, + } + + // The header will have more alignment than `Padded` + let header = HeaderWithLength::new(0i32, 2); + let items = vec![Padded { i: 0xdead }, Padded { i: 0xbeef }]; + let a = ThinArc::from_header_and_iter(header, items.into_iter()); + assert_eq!(a.slice.len(), 2); + assert_eq!(a.slice[0].i, 0xdead); + assert_eq!(a.slice[1].i, 0xbeef); + } + #[test] fn slices_and_thin() { let mut canary = atomic::AtomicUsize::new(0);