Skip to main content

zksync_vm2/
fat_pointer.rs

1use std::ptr;
2
3use primitive_types::U256;
4use zksync_vm2_interface::HeapId;
5
6/// Fat pointer to a heap location.
7#[derive(Debug)]
8#[repr(C)]
9pub struct FatPointer {
10    /// Additional pointer offset inside the `start..(start + length)` range.
11    pub offset: u32,
12    /// ID of the heap this points to.
13    pub memory_page: HeapId,
14    /// 0-based index of the pointer start byte at the `memory` page.
15    pub start: u32,
16    /// Length of the pointed slice in bytes.
17    pub length: u32,
18}
19
20#[cfg(target_endian = "little")]
21impl From<&mut U256> for &mut FatPointer {
22    fn from(value: &mut U256) -> Self {
23        unsafe { &mut *ptr::from_mut(value).cast() }
24    }
25}
26
27#[cfg(target_endian = "little")]
28impl From<U256> for FatPointer {
29    fn from(value: U256) -> Self {
30        unsafe { std::mem::transmute(value.low_u128()) }
31    }
32}
33
34impl FatPointer {
35    /// Converts this pointer into a `U256` word.
36    #[cfg(target_endian = "little")]
37    pub fn into_u256(self) -> U256 {
38        U256::zero() + unsafe { std::mem::transmute::<FatPointer, u128>(self) }
39    }
40}