pallet_revive/vm/evm/instructions/
memory.rs1use super::Context;
19use crate::vm::Ext;
20use core::cmp::max;
21use revm::{
22 interpreter::{
23 gas as revm_gas,
24 interpreter_types::{MemoryTr, RuntimeFlag, StackTr},
25 },
26 primitives::U256,
27};
28
29pub fn mload<'ext, E: Ext>(context: Context<'_, 'ext, E>) {
33 gas_legacy!(context.interpreter, revm_gas::VERYLOW);
34 popn_top!([], top, context.interpreter);
35 let offset: usize = as_usize_or_fail!(context.interpreter, top);
36 resize_memory!(context.interpreter, offset, 32);
37 *top =
38 U256::try_from_be_slice(context.interpreter.memory.slice_len(offset, 32).as_ref()).unwrap()
39}
40
41pub fn mstore<'ext, E: Ext>(context: Context<'_, 'ext, E>) {
45 gas_legacy!(context.interpreter, revm_gas::VERYLOW);
46 popn!([offset, value], context.interpreter);
47 let offset = as_usize_or_fail!(context.interpreter, offset);
48 resize_memory!(context.interpreter, offset, 32);
49 context.interpreter.memory.set(offset, &value.to_be_bytes::<32>());
50}
51
52pub fn mstore8<'ext, E: Ext>(context: Context<'_, 'ext, E>) {
56 gas_legacy!(context.interpreter, revm_gas::VERYLOW);
57 popn!([offset, value], context.interpreter);
58 let offset = as_usize_or_fail!(context.interpreter, offset);
59 resize_memory!(context.interpreter, offset, 1);
60 context.interpreter.memory.set(offset, &[value.byte(0)]);
61}
62
63pub fn msize<'ext, E: Ext>(context: Context<'_, 'ext, E>) {
67 gas_legacy!(context.interpreter, revm_gas::BASE);
68 push!(context.interpreter, U256::from(context.interpreter.memory.size()));
69}
70
71pub fn mcopy<'ext, E: Ext>(context: Context<'_, 'ext, E>) {
75 check!(context.interpreter, CANCUN);
76 popn!([dst, src, len], context.interpreter);
77
78 let len = as_usize_or_fail!(context.interpreter, len);
80 gas_or_fail_legacy!(context.interpreter, revm_gas::copy_cost_verylow(len));
82 if len == 0 {
83 return;
84 }
85
86 let dst = as_usize_or_fail!(context.interpreter, dst);
87 let src = as_usize_or_fail!(context.interpreter, src);
88 resize_memory!(context.interpreter, max(dst, src), len);
90 context.interpreter.memory.copy(dst, src, len);
92}