evm_interpreter/machine/
mod.rs1mod memory;
2mod stack;
3
4use alloc::{rc::Rc, vec::Vec};
5
6pub use self::{memory::Memory, stack::Stack};
7
8pub trait AsMachine {
9 type State;
10
11 fn as_machine(&self) -> &Machine<Self::State>;
12}
13
14pub trait AsMachineMut: AsMachine {
15 fn as_machine_mut(&mut self) -> &mut Machine<Self::State>;
16}
17
18pub struct Machine<S> {
20 pub(crate) data: Rc<Vec<u8>>,
22 pub(crate) code: Rc<Vec<u8>>,
24 pub retval: Vec<u8>,
28 pub memory: Memory,
30 pub stack: Stack,
32 pub state: S,
34}
35
36impl<S> Machine<S> {
37 pub fn new(
39 code: Rc<Vec<u8>>,
40 data: Rc<Vec<u8>>,
41 stack_limit: usize,
42 memory_limit: usize,
43 state: S,
44 ) -> Self {
45 Self {
46 data,
47 code,
48 retval: Vec::new(),
49 memory: Memory::new(memory_limit),
50 stack: Stack::new(stack_limit),
51 state,
52 }
53 }
54
55 pub fn code(&self) -> &[u8] {
57 &self.code
58 }
59
60 #[must_use]
62 pub fn is_empty(&self) -> bool {
63 self.code.is_empty()
64 }
65}