mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
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
This commit is contained in:
parent
99b97737fe
commit
81e706469d
1 changed files with 21 additions and 3 deletions
|
@ -602,7 +602,7 @@ impl<H, T> Arc<HeaderSlice<H, [T]>> {
|
||||||
F: FnOnce(Layout) -> *mut u8,
|
F: FnOnce(Layout) -> *mut u8,
|
||||||
I: Iterator<Item = T> + ExactSizeIterator,
|
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");
|
assert_ne!(size_of::<T>(), 0, "Need to think about ZST");
|
||||||
|
|
||||||
// Compute the required size for the allocation.
|
// Compute the required size for the allocation.
|
||||||
|
@ -678,8 +678,9 @@ impl<H, T> Arc<HeaderSlice<H, [T]>> {
|
||||||
);
|
);
|
||||||
current = current.offset(1);
|
current = current.offset(1);
|
||||||
}
|
}
|
||||||
// We should have consumed the buffer exactly.
|
// We should have consumed the buffer exactly, maybe accounting
|
||||||
debug_assert_eq!(current as *mut u8, buffer.offset(size as isize));
|
// 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!(
|
assert!(
|
||||||
items.next().is_none(),
|
items.next().is_none(),
|
||||||
|
@ -1334,6 +1335,23 @@ mod tests {
|
||||||
assert!(x.slice.is_empty());
|
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]
|
#[test]
|
||||||
fn slices_and_thin() {
|
fn slices_and_thin() {
|
||||||
let mut canary = atomic::AtomicUsize::new(0);
|
let mut canary = atomic::AtomicUsize::new(0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue