solana_stable_layout/
stable_ref_cell.rs

1//! Ensure RefCell has a stable layout
2
3#[cfg(test)]
4mod tests {
5    use std::{
6        cell::RefCell,
7        mem::{align_of, size_of},
8    };
9
10    #[test]
11    fn test_memory_layout() {
12        assert_eq!(align_of::<RefCell<i32>>(), 8);
13        assert_eq!(size_of::<RefCell<i32>>(), 8 + 4 + /* padding */4);
14
15        let value = 42;
16        let refcell = RefCell::new(value);
17        let _borrow = refcell.borrow(); // used to increment borrow count
18
19        let addr_refcell = &refcell as *const _ as usize;
20        let addr_borrow = addr_refcell;
21        let addr_value = addr_refcell + 8;
22        assert_eq!(unsafe { *(addr_borrow as *const isize) }, 1);
23        assert_eq!(unsafe { *(addr_value as *const i32) }, 42);
24    }
25}