revm_interpreter/instructions/
macros.rs1#[macro_export]
5macro_rules! tri {
6 ($e:expr) => {
7 match $e {
8 Some(v) => v,
9 None => return None,
10 }
11 };
12}
13
14#[macro_export]
16macro_rules! require_non_staticcall {
17 ($interpreter:expr) => {
18 if $interpreter.runtime_flag.is_static() {
19 $interpreter.halt($crate::InstructionResult::StateChangeDuringStaticCall);
20 return;
21 }
22 };
23}
24
25#[macro_export]
28macro_rules! otry {
29 ($expression: expr) => {{
30 let Some(value) = $expression else {
31 return;
32 };
33 value
34 }};
35}
36
37#[macro_export]
39macro_rules! require_eof {
40 ($interpreter:expr) => {
41 if !$interpreter.runtime_flag.is_eof() {
42 $interpreter.halt($crate::InstructionResult::EOFOpcodeDisabledInLegacy);
43 return;
44 }
45 };
46}
47
48#[macro_export]
50macro_rules! check {
51 ($interpreter:expr, $min:ident) => {
52 if !$interpreter
53 .runtime_flag
54 .spec_id()
55 .is_enabled_in(primitives::hardfork::SpecId::$min)
56 {
57 $interpreter.halt($crate::InstructionResult::NotActivated);
58 return;
59 }
60 };
61}
62
63#[macro_export]
65macro_rules! gas {
66 ($interpreter:expr, $gas:expr) => {
67 $crate::gas!($interpreter, $gas, ())
68 };
69 ($interpreter:expr, $gas:expr, $ret:expr) => {
70 if !$interpreter.gas.record_cost($gas) {
71 $interpreter.halt($crate::InstructionResult::OutOfGas);
72 return $ret;
73 }
74 };
75}
76
77#[macro_export]
79macro_rules! gas_or_fail {
80 ($interpreter:expr, $gas:expr) => {
81 $crate::gas_or_fail!($interpreter, $gas, ())
82 };
83 ($interpreter:expr, $gas:expr, $ret:expr) => {
84 match $gas {
85 Some(gas_used) => $crate::gas!($interpreter, gas_used, $ret),
86 None => {
87 $interpreter.halt($crate::InstructionResult::OutOfGas);
88 return $ret;
89 }
90 }
91 };
92}
93
94#[macro_export]
97macro_rules! resize_memory {
98 ($interpreter:expr, $offset:expr, $len:expr) => {
99 $crate::resize_memory!($interpreter, $offset, $len, ())
100 };
101 ($interpreter:expr, $offset:expr, $len:expr, $ret:expr) => {
102 let words_num = $crate::interpreter::num_words($offset.saturating_add($len));
103 match $interpreter.gas.record_memory_expansion(words_num) {
104 $crate::gas::MemoryExtensionResult::Extended => {
105 $interpreter.memory.resize(words_num * 32);
106 }
107 $crate::gas::MemoryExtensionResult::OutOfGas => {
108 $interpreter.halt($crate::InstructionResult::MemoryOOG);
109 return $ret;
110 }
111 $crate::gas::MemoryExtensionResult::Same => (), };
113 };
114}
115
116#[macro_export]
118macro_rules! popn {
119 ([ $($x:ident),* ],$interpreterreter:expr $(,$ret:expr)? ) => {
120 let Some([$( $x ),*]) = $interpreterreter.stack.popn() else {
121 $interpreterreter.halt($crate::InstructionResult::StackUnderflow);
122 return $($ret)?;
123 };
124 };
125}
126
127#[macro_export]
129macro_rules! popn_top {
130 ([ $($x:ident),* ], $top:ident, $interpreter:expr $(,$ret:expr)? ) => {
131 let Some(([$( $x ),*], $top)) = $interpreter.stack.popn_top() else {
132 $interpreter.halt($crate::InstructionResult::StackUnderflow);
133 return $($ret)?;
134 };
135 };
136}
137
138#[macro_export]
140macro_rules! push {
141 ($interpreter:expr, $x:expr $(,$ret:item)?) => (
142 if !($interpreter.stack.push($x)) {
143 $interpreter.halt($crate::InstructionResult::StackOverflow);
144 return $($ret)?;
145 }
146 )
147}
148
149#[macro_export]
151macro_rules! as_u64_saturated {
152 ($v:expr) => {
153 match $v.as_limbs() {
154 x => {
155 if (x[1] == 0) & (x[2] == 0) & (x[3] == 0) {
156 x[0]
157 } else {
158 u64::MAX
159 }
160 }
161 }
162 };
163}
164
165#[macro_export]
167macro_rules! as_usize_saturated {
168 ($v:expr) => {
169 usize::try_from($crate::as_u64_saturated!($v)).unwrap_or(usize::MAX)
170 };
171}
172
173#[macro_export]
175macro_rules! as_isize_saturated {
176 ($v:expr) => {
177 isize::try_from($crate::as_u64_saturated!($v)).unwrap_or(isize::MAX)
180 };
181}
182
183#[macro_export]
185macro_rules! as_usize_or_fail {
186 ($interpreter:expr, $v:expr) => {
187 $crate::as_usize_or_fail_ret!($interpreter, $v, ())
188 };
189 ($interpreter:expr, $v:expr, $reason:expr) => {
190 $crate::as_usize_or_fail_ret!($interpreter, $v, $reason, ())
191 };
192}
193
194#[macro_export]
197macro_rules! as_usize_or_fail_ret {
198 ($interpreter:expr, $v:expr, $ret:expr) => {
199 $crate::as_usize_or_fail_ret!(
200 $interpreter,
201 $v,
202 $crate::InstructionResult::InvalidOperandOOG,
203 $ret
204 )
205 };
206
207 ($interpreter:expr, $v:expr, $reason:expr, $ret:expr) => {
208 match $v.as_limbs() {
209 x => {
210 if (x[0] > usize::MAX as u64) | (x[1] != 0) | (x[2] != 0) | (x[3] != 0) {
211 $interpreter.halt($reason);
212 return $ret;
213 }
214 x[0] as usize
215 }
216 }
217 };
218}