Skip to content
Permalink
Browse files

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
  • Loading branch information...
emilio committed May 8, 2019
1 parent 99b9773 commit 81e706469d7138d693775e7d4c381b2e2c28f93e
Showing with 21 additions and 3 deletions.
  1. +21 −3 components/servo_arc/lib.rs
@@ -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.
@@ -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(),
@@ -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);

0 comments on commit 81e7064

Please sign in to comment.
You can’t perform that action at this time.