pallet_revive/vm/evm/instructions/
macros.rs1#[macro_export]
22macro_rules! tri {
23 ($e:expr) => {
24 match $e {
25 Some(v) => v,
26 None => return None,
27 }
28 };
29}
30
31#[macro_export]
34macro_rules! otry {
35 ($expression: expr) => {{
36 let Some(value) = $expression else {
37 return;
38 };
39 value
40 }};
41}
42
43#[macro_export]
45macro_rules! require_eof {
46 ($interpreter:expr) => {
47 if !$interpreter.runtime_flag.is_eof() {
48 $interpreter.halt(revm::interpreter::InstructionResult::EOFOpcodeDisabledInLegacy);
49 return;
50 }
51 };
52}
53
54#[macro_export]
56macro_rules! check {
57 ($interpreter:expr, $min:ident) => {
58 if !$interpreter
59 .runtime_flag
60 .spec_id()
61 .is_enabled_in(revm::primitives::hardfork::SpecId::$min)
62 {
63 $interpreter.halt(revm::interpreter::InstructionResult::NotActivated);
64 return;
65 }
66 };
67}
68
69#[macro_export]
71macro_rules! gas_legacy {
72 ($interpreter:expr, $gas:expr) => {
73 gas_legacy!($interpreter, $gas, ())
74 };
75 ($interpreter:expr, $gas:expr, $ret:expr) => {
76 if $interpreter.extend.gas_meter_mut().charge_evm_gas($gas).is_err() {
77 $interpreter.halt(revm::interpreter::InstructionResult::OutOfGas);
78 return $ret;
79 }
80 };
81}
82
83#[macro_export]
84macro_rules! gas {
85 ($interpreter:expr, $gas:expr) => {
86 gas!($interpreter, $gas, ())
87 };
88 ($interpreter:expr, $gas:expr, $ret:expr) => {
89 let meter = $interpreter.extend.gas_meter_mut();
90 if meter.charge_evm_gas(1).is_err() || meter.charge($gas).is_err() {
91 $interpreter.halt(revm::interpreter::InstructionResult::OutOfGas);
92 return $ret;
93 }
94 };
95}
96
97#[macro_export]
99macro_rules! gas_or_fail_legacy {
100 ($interpreter:expr, $gas:expr) => {
101 gas_or_fail_legacy!($interpreter, $gas, ())
102 };
103 ($interpreter:expr, $gas:expr, $ret:expr) => {
104 match $gas {
105 Some(gas_used) => gas_legacy!($interpreter, gas_used, $ret),
106 None => {
107 $interpreter.halt(revm::interpreter::InstructionResult::OutOfGas);
108 return $ret;
109 },
110 }
111 };
112}
113
114#[macro_export]
117macro_rules! resize_memory {
118 ($interpreter:expr, $offset:expr, $len:expr) => {
119 resize_memory!($interpreter, $offset, $len, ())
120 };
121 ($interpreter:expr, $offset:expr, $len:expr, $ret:expr) => {
122 let current_len = $interpreter.memory.len();
123 let target_len = revm::interpreter::num_words($offset.saturating_add($len)) * 32;
124 if target_len as u32 > $crate::limits::code::BASELINE_MEMORY_LIMIT {
125 log::debug!(target: $crate::LOG_TARGET, "check memory bounds failed: offset={} target_len={target_len} current_len={current_len}", $offset);
126 $interpreter.halt(revm::interpreter::InstructionResult::MemoryOOG);
127 return $ret;
128 }
129
130 if target_len > current_len {
131 $interpreter.memory.resize(target_len);
132 };
133 };
134}
135
136#[macro_export]
138macro_rules! popn {
139 ([ $($x:ident),* ],$interpreterreter:expr $(,$ret:expr)? ) => {
140 let Some([$( $x ),*]) = <_ as StackTr>::popn(&mut $interpreterreter.stack) else {
141 $interpreterreter.halt(revm::interpreter::InstructionResult::StackUnderflow);
142 return $($ret)?;
143 };
144 };
145}
146
147#[macro_export]
150macro_rules! popn_top {
151 ([ $($x:ident),* ], $top:ident, $interpreter:expr $(,$ret:expr)? ) => {
152 let Some(([$($x),*], $top)) = <_ as StackTr>::popn_top(&mut $interpreter.stack) else {
153 $interpreter.halt(revm::interpreter::InstructionResult::StackUnderflow);
154 return $($ret)?;
155 };
156 };
157}
158
159#[macro_export]
161macro_rules! push {
162 ($interpreter:expr, $x:expr $(,$ret:item)?) => (
163 if !($interpreter.stack.push($x)) {
164 $interpreter.halt(revm::interpreter::InstructionResult::StackOverflow);
165 return $($ret)?;
166 }
167 )
168}
169
170#[macro_export]
172macro_rules! as_u64_saturated {
173 ($v:expr) => {
174 match $v.as_limbs() {
175 x =>
176 if (x[1] == 0) & (x[2] == 0) & (x[3] == 0) {
177 x[0]
178 } else {
179 u64::MAX
180 },
181 }
182 };
183}
184
185#[macro_export]
187macro_rules! as_usize_saturated {
188 ($v:expr) => {
189 usize::try_from(as_u64_saturated!($v)).unwrap_or(usize::MAX)
190 };
191}
192
193#[macro_export]
195macro_rules! as_isize_saturated {
196 ($v:expr) => {
197 isize::try_from(as_u64_saturated!($v)).unwrap_or(isize::MAX)
200 };
201}
202
203#[macro_export]
205macro_rules! as_usize_or_fail {
206 ($interpreter:expr, $v:expr) => {
207 as_usize_or_fail_ret!($interpreter, $v, ())
208 };
209 ($interpreter:expr, $v:expr, $reason:expr) => {
210 as_usize_or_fail_ret!($interpreter, $v, $reason, ())
211 };
212}
213
214#[macro_export]
217macro_rules! as_usize_or_fail_ret {
218 ($interpreter:expr, $v:expr, $ret:expr) => {
219 as_usize_or_fail_ret!(
220 $interpreter,
221 $v,
222 revm::interpreter::InstructionResult::InvalidOperandOOG,
223 $ret
224 )
225 };
226
227 ($interpreter:expr, $v:expr, $reason:expr, $ret:expr) => {
228 match $v.as_limbs() {
229 x => {
230 if (x[0] > usize::MAX as u64) | (x[1] != 0) | (x[2] != 0) | (x[3] != 0) {
231 $interpreter.halt($reason);
232 return $ret;
233 }
234 x[0] as usize
235 },
236 }
237 };
238}