Skip to content

Commit

Permalink
style: Fix an assertion that doesn't account for alignment padding.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
emilio committed May 10, 2019
1 parent 99b9773 commit 81e7064
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions components/servo_arc/lib.rs
Expand Up @@ -602,7 +602,7 @@ impl<H, T> Arc<HeaderSlice<H, [T]>> {
F: FnOnce(Layout) -> *mut u8,
I: Iterator<Item = T> + ExactSizeIterator,
{
use std::mem::size_of;
use std::mem::{align_of, size_of};
assert_ne!(size_of::<T>(), 0, "Need to think about ZST");

// Compute the required size for the allocation.
Expand Down Expand Up @@ -678,8 +678,9 @@ impl<H, T> Arc<HeaderSlice<H, [T]>> {
);
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::<Self>());
}
assert!(
items.next().is_none(),
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 81e7064

Please sign in to comment.