evm_core/eval/
mod.rs

1#[macro_use]
2mod macros;
3mod arithmetic;
4mod bitwise;
5mod misc;
6
7use crate::{ExitError, ExitReason, ExitSucceed, Machine, Opcode};
8use core::ops::{BitAnd, BitOr, BitXor};
9use primitive_types::{H256, U256};
10
11#[derive(Clone, Eq, PartialEq, Debug)]
12pub enum Control {
13	Continue(usize),
14	Exit(ExitReason),
15	Jump(usize),
16	Trap(Opcode),
17}
18
19fn eval_stop(_state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
20	Control::Exit(ExitSucceed::Stopped.into())
21}
22
23fn eval_add(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
24	op2_u256_tuple!(state, overflowing_add)
25}
26
27fn eval_mul(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
28	op2_u256_tuple!(state, overflowing_mul)
29}
30
31fn eval_sub(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
32	op2_u256_tuple!(state, overflowing_sub)
33}
34
35fn eval_div(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
36	op2_u256_fn!(state, self::arithmetic::div)
37}
38
39fn eval_sdiv(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
40	op2_u256_fn!(state, self::arithmetic::sdiv)
41}
42
43fn eval_mod(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
44	op2_u256_fn!(state, self::arithmetic::rem)
45}
46
47fn eval_smod(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
48	op2_u256_fn!(state, self::arithmetic::srem)
49}
50
51fn eval_addmod(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
52	op3_u256_fn!(state, self::arithmetic::addmod)
53}
54
55fn eval_mulmod(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
56	op3_u256_fn!(state, self::arithmetic::mulmod)
57}
58
59fn eval_exp(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
60	op2_u256_fn!(state, self::arithmetic::exp)
61}
62
63fn eval_signextend(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
64	op2_u256_fn!(state, self::arithmetic::signextend)
65}
66
67fn eval_lt(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
68	op2_u256_bool_ref!(state, lt)
69}
70
71fn eval_gt(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
72	op2_u256_bool_ref!(state, gt)
73}
74
75fn eval_slt(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
76	op2_u256_fn!(state, self::bitwise::slt)
77}
78
79fn eval_sgt(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
80	op2_u256_fn!(state, self::bitwise::sgt)
81}
82
83fn eval_eq(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
84	op2_u256_bool_ref!(state, eq)
85}
86
87fn eval_iszero(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
88	op1_u256_fn!(state, self::bitwise::iszero)
89}
90
91fn eval_and(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
92	op2_u256!(state, bitand)
93}
94
95fn eval_or(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
96	op2_u256!(state, bitor)
97}
98
99fn eval_xor(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
100	op2_u256!(state, bitxor)
101}
102
103fn eval_not(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
104	op1_u256_fn!(state, self::bitwise::not)
105}
106
107fn eval_byte(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
108	op2_u256_fn!(state, self::bitwise::byte)
109}
110
111fn eval_shl(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
112	op2_u256_fn!(state, self::bitwise::shl)
113}
114
115fn eval_shr(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
116	op2_u256_fn!(state, self::bitwise::shr)
117}
118
119fn eval_sar(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
120	op2_u256_fn!(state, self::bitwise::sar)
121}
122
123fn eval_codesize(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
124	self::misc::codesize(state)
125}
126
127fn eval_codecopy(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
128	self::misc::codecopy(state)
129}
130
131fn eval_calldataload(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
132	self::misc::calldataload(state)
133}
134
135fn eval_calldatasize(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
136	self::misc::calldatasize(state)
137}
138
139fn eval_calldatacopy(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
140	self::misc::calldatacopy(state)
141}
142
143fn eval_pop(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
144	self::misc::pop(state)
145}
146
147fn eval_mload(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
148	self::misc::mload(state)
149}
150
151fn eval_mstore(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
152	self::misc::mstore(state)
153}
154
155fn eval_mstore8(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
156	self::misc::mstore8(state)
157}
158
159fn eval_jump(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
160	self::misc::jump(state)
161}
162
163fn eval_jumpi(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
164	self::misc::jumpi(state)
165}
166
167fn eval_pc(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
168	self::misc::pc(state, position)
169}
170
171fn eval_msize(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
172	self::misc::msize(state)
173}
174
175fn eval_jumpdest(_state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
176	Control::Continue(1)
177}
178
179fn eval_mcopy(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
180	self::misc::mcopy(state)
181}
182
183fn eval_push0(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
184	self::misc::push(state, 0, position)
185}
186
187fn eval_push1(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
188	self::misc::push(state, 1, position)
189}
190
191fn eval_push2(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
192	self::misc::push(state, 2, position)
193}
194
195fn eval_push3(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
196	self::misc::push(state, 3, position)
197}
198
199fn eval_push4(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
200	self::misc::push(state, 4, position)
201}
202
203fn eval_push5(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
204	self::misc::push(state, 5, position)
205}
206
207fn eval_push6(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
208	self::misc::push(state, 6, position)
209}
210
211fn eval_push7(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
212	self::misc::push(state, 7, position)
213}
214
215fn eval_push8(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
216	self::misc::push(state, 8, position)
217}
218
219fn eval_push9(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
220	self::misc::push(state, 9, position)
221}
222
223fn eval_push10(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
224	self::misc::push(state, 10, position)
225}
226
227fn eval_push11(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
228	self::misc::push(state, 11, position)
229}
230
231fn eval_push12(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
232	self::misc::push(state, 12, position)
233}
234
235fn eval_push13(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
236	self::misc::push(state, 13, position)
237}
238
239fn eval_push14(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
240	self::misc::push(state, 14, position)
241}
242
243fn eval_push15(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
244	self::misc::push(state, 15, position)
245}
246
247fn eval_push16(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
248	self::misc::push(state, 16, position)
249}
250
251fn eval_push17(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
252	self::misc::push(state, 17, position)
253}
254
255fn eval_push18(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
256	self::misc::push(state, 18, position)
257}
258
259fn eval_push19(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
260	self::misc::push(state, 19, position)
261}
262
263fn eval_push20(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
264	self::misc::push(state, 20, position)
265}
266
267fn eval_push21(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
268	self::misc::push(state, 21, position)
269}
270
271fn eval_push22(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
272	self::misc::push(state, 22, position)
273}
274
275fn eval_push23(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
276	self::misc::push(state, 23, position)
277}
278
279fn eval_push24(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
280	self::misc::push(state, 24, position)
281}
282
283fn eval_push25(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
284	self::misc::push(state, 25, position)
285}
286
287fn eval_push26(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
288	self::misc::push(state, 26, position)
289}
290
291fn eval_push27(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
292	self::misc::push(state, 27, position)
293}
294
295fn eval_push28(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
296	self::misc::push(state, 28, position)
297}
298
299fn eval_push29(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
300	self::misc::push(state, 29, position)
301}
302
303fn eval_push30(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
304	self::misc::push(state, 30, position)
305}
306
307fn eval_push31(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
308	self::misc::push(state, 31, position)
309}
310
311fn eval_push32(state: &mut Machine, _opcode: Opcode, position: usize) -> Control {
312	self::misc::push(state, 32, position)
313}
314
315fn eval_dup1(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
316	self::misc::dup(state, 1)
317}
318
319fn eval_dup2(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
320	self::misc::dup(state, 2)
321}
322
323fn eval_dup3(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
324	self::misc::dup(state, 3)
325}
326
327fn eval_dup4(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
328	self::misc::dup(state, 4)
329}
330
331fn eval_dup5(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
332	self::misc::dup(state, 5)
333}
334
335fn eval_dup6(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
336	self::misc::dup(state, 6)
337}
338
339fn eval_dup7(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
340	self::misc::dup(state, 7)
341}
342
343fn eval_dup8(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
344	self::misc::dup(state, 8)
345}
346
347fn eval_dup9(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
348	self::misc::dup(state, 9)
349}
350
351fn eval_dup10(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
352	self::misc::dup(state, 10)
353}
354
355fn eval_dup11(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
356	self::misc::dup(state, 11)
357}
358
359fn eval_dup12(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
360	self::misc::dup(state, 12)
361}
362
363fn eval_dup13(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
364	self::misc::dup(state, 13)
365}
366
367fn eval_dup14(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
368	self::misc::dup(state, 14)
369}
370
371fn eval_dup15(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
372	self::misc::dup(state, 15)
373}
374
375fn eval_dup16(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
376	self::misc::dup(state, 16)
377}
378
379fn eval_swap1(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
380	self::misc::swap(state, 1)
381}
382
383fn eval_swap2(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
384	self::misc::swap(state, 2)
385}
386
387fn eval_swap3(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
388	self::misc::swap(state, 3)
389}
390
391fn eval_swap4(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
392	self::misc::swap(state, 4)
393}
394
395fn eval_swap5(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
396	self::misc::swap(state, 5)
397}
398
399fn eval_swap6(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
400	self::misc::swap(state, 6)
401}
402
403fn eval_swap7(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
404	self::misc::swap(state, 7)
405}
406
407fn eval_swap8(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
408	self::misc::swap(state, 8)
409}
410
411fn eval_swap9(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
412	self::misc::swap(state, 9)
413}
414
415fn eval_swap10(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
416	self::misc::swap(state, 10)
417}
418
419fn eval_swap11(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
420	self::misc::swap(state, 11)
421}
422
423fn eval_swap12(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
424	self::misc::swap(state, 12)
425}
426
427fn eval_swap13(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
428	self::misc::swap(state, 13)
429}
430
431fn eval_swap14(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
432	self::misc::swap(state, 14)
433}
434
435fn eval_swap15(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
436	self::misc::swap(state, 15)
437}
438
439fn eval_swap16(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
440	self::misc::swap(state, 16)
441}
442
443fn eval_return(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
444	self::misc::ret(state)
445}
446
447fn eval_revert(state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
448	self::misc::revert(state)
449}
450
451fn eval_invalid(_state: &mut Machine, _opcode: Opcode, _position: usize) -> Control {
452	Control::Exit(ExitError::DesignatedInvalid.into())
453}
454
455fn eval_external(_state: &mut Machine, opcode: Opcode, _position: usize) -> Control {
456	Control::Trap(opcode)
457}
458
459#[inline]
460pub fn eval(state: &mut Machine, opcode: Opcode, position: usize) -> Control {
461	static TABLE: [fn(state: &mut Machine, opcode: Opcode, position: usize) -> Control; 256] = {
462		let mut table = [eval_external as _; 256];
463
464		table[Opcode::STOP.as_usize()] = eval_stop as _;
465		table[Opcode::ADD.as_usize()] = eval_add as _;
466		table[Opcode::MUL.as_usize()] = eval_mul as _;
467		table[Opcode::SUB.as_usize()] = eval_sub as _;
468		table[Opcode::DIV.as_usize()] = eval_div as _;
469		table[Opcode::SDIV.as_usize()] = eval_sdiv as _;
470		table[Opcode::MOD.as_usize()] = eval_mod as _;
471		table[Opcode::SMOD.as_usize()] = eval_smod as _;
472		table[Opcode::ADDMOD.as_usize()] = eval_addmod as _;
473		table[Opcode::MULMOD.as_usize()] = eval_mulmod as _;
474		table[Opcode::EXP.as_usize()] = eval_exp as _;
475		table[Opcode::SIGNEXTEND.as_usize()] = eval_signextend as _;
476		table[Opcode::LT.as_usize()] = eval_lt as _;
477		table[Opcode::GT.as_usize()] = eval_gt as _;
478		table[Opcode::SLT.as_usize()] = eval_slt as _;
479		table[Opcode::SGT.as_usize()] = eval_sgt as _;
480		table[Opcode::EQ.as_usize()] = eval_eq as _;
481		table[Opcode::ISZERO.as_usize()] = eval_iszero as _;
482		table[Opcode::AND.as_usize()] = eval_and as _;
483		table[Opcode::OR.as_usize()] = eval_or as _;
484		table[Opcode::XOR.as_usize()] = eval_xor as _;
485		table[Opcode::NOT.as_usize()] = eval_not as _;
486		table[Opcode::BYTE.as_usize()] = eval_byte as _;
487		table[Opcode::SHL.as_usize()] = eval_shl as _;
488		table[Opcode::SHR.as_usize()] = eval_shr as _;
489		table[Opcode::SAR.as_usize()] = eval_sar as _;
490		table[Opcode::CODESIZE.as_usize()] = eval_codesize as _;
491		table[Opcode::CODECOPY.as_usize()] = eval_codecopy as _;
492		table[Opcode::CALLDATALOAD.as_usize()] = eval_calldataload as _;
493		table[Opcode::CALLDATASIZE.as_usize()] = eval_calldatasize as _;
494		table[Opcode::CALLDATACOPY.as_usize()] = eval_calldatacopy as _;
495		table[Opcode::POP.as_usize()] = eval_pop as _;
496		table[Opcode::MLOAD.as_usize()] = eval_mload as _;
497		table[Opcode::MSTORE.as_usize()] = eval_mstore as _;
498		table[Opcode::MSTORE8.as_usize()] = eval_mstore8 as _;
499		table[Opcode::JUMP.as_usize()] = eval_jump as _;
500		table[Opcode::JUMPI.as_usize()] = eval_jumpi as _;
501		table[Opcode::PC.as_usize()] = eval_pc as _;
502		table[Opcode::MSIZE.as_usize()] = eval_msize as _;
503		table[Opcode::JUMPDEST.as_usize()] = eval_jumpdest as _;
504		table[Opcode::MCOPY.as_usize()] = eval_mcopy as _;
505
506		table[Opcode::PUSH0.as_usize()] = eval_push0 as _;
507		table[Opcode::PUSH1.as_usize()] = eval_push1 as _;
508		table[Opcode::PUSH2.as_usize()] = eval_push2 as _;
509		table[Opcode::PUSH3.as_usize()] = eval_push3 as _;
510		table[Opcode::PUSH4.as_usize()] = eval_push4 as _;
511		table[Opcode::PUSH5.as_usize()] = eval_push5 as _;
512		table[Opcode::PUSH6.as_usize()] = eval_push6 as _;
513		table[Opcode::PUSH7.as_usize()] = eval_push7 as _;
514		table[Opcode::PUSH8.as_usize()] = eval_push8 as _;
515		table[Opcode::PUSH9.as_usize()] = eval_push9 as _;
516		table[Opcode::PUSH10.as_usize()] = eval_push10 as _;
517		table[Opcode::PUSH11.as_usize()] = eval_push11 as _;
518		table[Opcode::PUSH12.as_usize()] = eval_push12 as _;
519		table[Opcode::PUSH13.as_usize()] = eval_push13 as _;
520		table[Opcode::PUSH14.as_usize()] = eval_push14 as _;
521		table[Opcode::PUSH15.as_usize()] = eval_push15 as _;
522		table[Opcode::PUSH16.as_usize()] = eval_push16 as _;
523		table[Opcode::PUSH17.as_usize()] = eval_push17 as _;
524		table[Opcode::PUSH18.as_usize()] = eval_push18 as _;
525		table[Opcode::PUSH19.as_usize()] = eval_push19 as _;
526		table[Opcode::PUSH20.as_usize()] = eval_push20 as _;
527		table[Opcode::PUSH21.as_usize()] = eval_push21 as _;
528		table[Opcode::PUSH22.as_usize()] = eval_push22 as _;
529		table[Opcode::PUSH23.as_usize()] = eval_push23 as _;
530		table[Opcode::PUSH24.as_usize()] = eval_push24 as _;
531		table[Opcode::PUSH25.as_usize()] = eval_push25 as _;
532		table[Opcode::PUSH26.as_usize()] = eval_push26 as _;
533		table[Opcode::PUSH27.as_usize()] = eval_push27 as _;
534		table[Opcode::PUSH28.as_usize()] = eval_push28 as _;
535		table[Opcode::PUSH29.as_usize()] = eval_push29 as _;
536		table[Opcode::PUSH30.as_usize()] = eval_push30 as _;
537		table[Opcode::PUSH31.as_usize()] = eval_push31 as _;
538		table[Opcode::PUSH32.as_usize()] = eval_push32 as _;
539
540		table[Opcode::DUP1.as_usize()] = eval_dup1 as _;
541		table[Opcode::DUP2.as_usize()] = eval_dup2 as _;
542		table[Opcode::DUP3.as_usize()] = eval_dup3 as _;
543		table[Opcode::DUP4.as_usize()] = eval_dup4 as _;
544		table[Opcode::DUP5.as_usize()] = eval_dup5 as _;
545		table[Opcode::DUP6.as_usize()] = eval_dup6 as _;
546		table[Opcode::DUP7.as_usize()] = eval_dup7 as _;
547		table[Opcode::DUP8.as_usize()] = eval_dup8 as _;
548		table[Opcode::DUP9.as_usize()] = eval_dup9 as _;
549		table[Opcode::DUP10.as_usize()] = eval_dup10 as _;
550		table[Opcode::DUP11.as_usize()] = eval_dup11 as _;
551		table[Opcode::DUP12.as_usize()] = eval_dup12 as _;
552		table[Opcode::DUP13.as_usize()] = eval_dup13 as _;
553		table[Opcode::DUP14.as_usize()] = eval_dup14 as _;
554		table[Opcode::DUP15.as_usize()] = eval_dup15 as _;
555		table[Opcode::DUP16.as_usize()] = eval_dup16 as _;
556
557		table[Opcode::SWAP1.as_usize()] = eval_swap1 as _;
558		table[Opcode::SWAP2.as_usize()] = eval_swap2 as _;
559		table[Opcode::SWAP3.as_usize()] = eval_swap3 as _;
560		table[Opcode::SWAP4.as_usize()] = eval_swap4 as _;
561		table[Opcode::SWAP5.as_usize()] = eval_swap5 as _;
562		table[Opcode::SWAP6.as_usize()] = eval_swap6 as _;
563		table[Opcode::SWAP7.as_usize()] = eval_swap7 as _;
564		table[Opcode::SWAP8.as_usize()] = eval_swap8 as _;
565		table[Opcode::SWAP9.as_usize()] = eval_swap9 as _;
566		table[Opcode::SWAP10.as_usize()] = eval_swap10 as _;
567		table[Opcode::SWAP11.as_usize()] = eval_swap11 as _;
568		table[Opcode::SWAP12.as_usize()] = eval_swap12 as _;
569		table[Opcode::SWAP13.as_usize()] = eval_swap13 as _;
570		table[Opcode::SWAP14.as_usize()] = eval_swap14 as _;
571		table[Opcode::SWAP15.as_usize()] = eval_swap15 as _;
572		table[Opcode::SWAP16.as_usize()] = eval_swap16 as _;
573
574		table[Opcode::RETURN.as_usize()] = eval_return as _;
575		table[Opcode::REVERT.as_usize()] = eval_revert as _;
576		table[Opcode::INVALID.as_usize()] = eval_invalid as _;
577
578		table
579	};
580
581	TABLE[opcode.as_usize()](state, opcode, position)
582}