1use core::{
3 fmt::Debug,
4 ops::{Deref, DerefMut},
5};
6
7use context_interface::FrameStack;
8
9#[derive(Debug, Clone)]
11pub struct Evm<CTX, INSP, I, P, F> {
12 pub ctx: CTX,
14 pub inspector: INSP,
17 pub instruction: I,
20 pub precompiles: P,
23 pub frame_stack: FrameStack<F>,
25 #[cfg(feature = "asyncdb")]
27 pub async_stack: database_interface::async_db::FiberStack,
28}
29
30impl<CTX, I, P, F: Default> Evm<CTX, (), I, P, F> {
31 pub fn new(ctx: CTX, instruction: I, precompiles: P) -> Self {
35 Evm {
36 ctx,
37 inspector: (),
38 instruction,
39 precompiles,
40 frame_stack: FrameStack::new_prealloc(8),
41 #[cfg(feature = "asyncdb")]
42 async_stack: database_interface::async_db::FiberStack::default(),
43 }
44 }
45}
46
47impl<CTX, I, INSP, P, F: Default> Evm<CTX, INSP, I, P, F> {
48 pub fn new_with_inspector(ctx: CTX, inspector: INSP, instruction: I, precompiles: P) -> Self {
50 Evm {
51 ctx,
52 inspector,
53 instruction,
54 precompiles,
55 frame_stack: FrameStack::new_prealloc(8),
56 #[cfg(feature = "asyncdb")]
57 async_stack: database_interface::async_db::FiberStack::default(),
58 }
59 }
60}
61
62impl<CTX, INSP, I, P, F> Evm<CTX, INSP, I, P, F> {
63 pub fn with_inspector<OINSP>(self, inspector: OINSP) -> Evm<CTX, OINSP, I, P, F> {
65 Evm {
66 ctx: self.ctx,
67 inspector,
68
69 instruction: self.instruction,
70 precompiles: self.precompiles,
71 frame_stack: self.frame_stack,
72 #[cfg(feature = "asyncdb")]
73 async_stack: self.async_stack,
74 }
75 }
76
77 pub fn with_precompiles<OP>(self, precompiles: OP) -> Evm<CTX, INSP, I, OP, F> {
79 Evm {
80 ctx: self.ctx,
81 inspector: self.inspector,
82 instruction: self.instruction,
83 precompiles,
84 frame_stack: self.frame_stack,
85 #[cfg(feature = "asyncdb")]
86 async_stack: self.async_stack,
87 }
88 }
89
90 pub fn into_inspector(self) -> INSP {
92 self.inspector
93 }
94}
95
96impl<CTX, INSP, I, P, F> Deref for Evm<CTX, INSP, I, P, F> {
97 type Target = CTX;
98
99 fn deref(&self) -> &Self::Target {
100 &self.ctx
101 }
102}
103
104impl<CTX, INSP, I, P, F> DerefMut for Evm<CTX, INSP, I, P, F> {
105 fn deref_mut(&mut self) -> &mut Self::Target {
106 &mut self.ctx
107 }
108}