pallet_evm_polkavm_uapi/
macros.rs1#[macro_export]
37macro_rules! input {
38 (@inner $input:expr, $cursor:expr,) => {};
39 (@size $size:expr, ) => { $size };
40
41 (@inner $input:expr, $cursor:expr, $var:ident: u8, $($rest:tt)*) => {
44 let $var = $input[$cursor];
45 input!(@inner $input, $cursor + 1, $($rest)*);
46 };
47
48 (@size $size:expr, $var:ident: u8, $($rest:tt)*) => {
50 input!(@size $size + 1, $($rest)*)
51 };
52
53 (@inner $input:expr, $cursor:expr, $var:ident: u64, $($rest:tt)*) => {
56 let $var = u64::from_le_bytes($input[$cursor..$cursor + 8].try_into().unwrap());
57 input!(@inner $input, $cursor + 8, $($rest)*);
58 };
59
60 (@size $size:expr, $var:ident: u64, $($rest:tt)*) => {
62 input!(@size $size + 8, $($rest)*)
63 };
64
65 (@inner $input:expr, $cursor:expr, $var:ident: u32, $($rest:tt)*) => {
68 let $var = u32::from_le_bytes($input[$cursor..$cursor + 4].try_into().unwrap());
69 input!(@inner $input, $cursor + 4, $($rest)*);
70 };
71
72 (@size $size:expr, $var:ident: u32, $($rest:tt)*) => {
74 input!(@size $size + 4, $($rest)*)
75 };
76
77 (@inner $input:expr, $cursor:expr, $var:ident: [u8],) => {
80 let $var = &$input[$cursor..];
81 };
82
83 (@inner $input:expr, $cursor:expr, $var:ident: [u8; $n:expr], $($rest:tt)*) => {
86 let $var = &$input[$cursor..$cursor+$n];
87 input!(@inner $input, $cursor + $n, $($rest)*);
88 };
89
90 (@inner $input:expr, $cursor:expr, $var:ident: &[u8; $n:expr], $($rest:tt)*) => {
93 let $var: &[u8; $n] = &$input[$cursor..$cursor+$n].try_into().unwrap();
94 input!(@inner $input, $cursor + $n, $($rest)*);
95 };
96
97 (@size $size:expr, $var:ident: [u8; $n:expr], $($rest:tt)*) => {
99 input!(@size $size + $n, $($rest)*)
100 };
101
102 (@size $size:expr, $var:ident: &[u8; $n:expr], $($rest:tt)*) => {
104 input!(@size $size + $n, $($rest)*)
105 };
106
107 ($buffer:ident, $size:expr, $($rest:tt)*) => {
110 let mut $buffer = [0u8; $size];
111 let input_size = $crate::HostFnImpl::call_data_size();
112 let $buffer = &mut &mut $buffer[..$size.min(input_size as usize)];
113 $crate::HostFnImpl::call_data_copy($buffer, 0);
114 input!(@inner $buffer, 0, $($rest)*);
115 };
116
117 ($buffer: ident, $($rest:tt)*) => {
120 input!($buffer, input!(@size 0, $($rest)*), $($rest)*);
121 };
122
123 ($($rest:tt)*) => {
126 input!(buffer, $($rest)*);
127 };
128}
129
130#[macro_export]
143macro_rules! output {
144 ($output: ident, $buffer: expr, $host_fn:path, $($arg:expr),*) => {
145 let mut $output = $buffer;
146 let $output = &mut &mut $output[..];
147 $host_fn($($arg,)* $output);
148 };
149}
150
151#[macro_export]
153macro_rules! unwrap_output {
154 ($output: ident, $buffer: expr, $host_fn:path, $($arg:expr),*) => {
155 let mut $output = $buffer;
156 let $output = &mut &mut $output[..];
157 $host_fn($($arg,)* $output).unwrap();
158 };
159}
160
161#[macro_export]
163macro_rules! u64_output {
164 ($host_fn:path, $($arg:expr),*) => {{
165 let mut buffer = [1u8; 32];
166 $host_fn($($arg,)* &mut buffer);
167 assert!(buffer[8..].iter().all(|&x| x == 0));
168 u64::from_le_bytes(buffer[..8].try_into().unwrap())
169 }};
170}