zksync_vm2/
fat_pointer.rs1use std::ptr;
2
3use primitive_types::U256;
4use zksync_vm2_interface::HeapId;
5
6#[derive(Debug)]
8#[repr(C)]
9pub struct FatPointer {
10 pub offset: u32,
12 pub memory_page: HeapId,
14 pub start: u32,
16 pub length: u32,
18}
19
20const _: () = assert!(std::mem::size_of::<FatPointer>() == 16);
25const _: () = assert!(std::mem::size_of::<FatPointer>() == std::mem::size_of::<u128>());
26const _: () = assert!(std::mem::size_of::<HeapId>() == std::mem::size_of::<u32>());
27const _: () = assert!(std::mem::size_of::<FatPointer>() <= std::mem::size_of::<U256>());
30const _: () = assert!(std::mem::align_of::<FatPointer>() <= std::mem::align_of::<U256>());
31
32#[cfg(target_endian = "little")]
33impl From<&mut U256> for &mut FatPointer {
34 fn from(value: &mut U256) -> Self {
35 unsafe { &mut *ptr::from_mut(value).cast() }
36 }
37}
38
39#[cfg(target_endian = "little")]
40impl From<U256> for FatPointer {
41 fn from(value: U256) -> Self {
42 unsafe { std::mem::transmute(value.low_u128()) }
43 }
44}
45
46impl FatPointer {
47 #[cfg(target_endian = "little")]
49 pub fn into_u256(self) -> U256 {
50 U256::zero() + unsafe { std::mem::transmute::<FatPointer, u128>(self) }
51 }
52}