Implement returndatasize/returndatacopy for interpreter

This commit is contained in:
Robin Salen 2023-04-10 14:32:36 -04:00
parent 6946eacaca
commit 9d60191d73
No known key found for this signature in database
GPG Key ID: FB87BACFB3CB2007

View File

@ -345,8 +345,8 @@ impl<'a> Interpreter<'a> {
0x3a => self.run_gasprice(), // "GASPRICE",
0x3b => todo!(), // "EXTCODESIZE",
0x3c => todo!(), // "EXTCODECOPY",
0x3d => todo!(), // "RETURNDATASIZE",
0x3e => todo!(), // "RETURNDATACOPY",
0x3d => self.run_returndatasize(), // "RETURNDATASIZE",
0x3e => self.run_returndatacopy(), // "RETURNDATACOPY",
0x3f => todo!(), // "EXTCODEHASH",
0x40 => todo!(), // "BLOCKHASH",
0x41 => self.run_coinbase(), // "COINBASE",
@ -834,6 +834,33 @@ impl<'a> Interpreter<'a> {
self.push(self.get_txn_field(NormalizedTxnField::ComputedFeePerGas))
}
fn run_returndatasize(&mut self) {
self.push(
self.generation_state.memory.contexts[self.context].segments
[Segment::ContextMetadata as usize]
.get(ContextMetadata::ReturndataSize as usize),
)
}
fn run_returndatacopy(&mut self) {
let dest_offset = self.pop().as_usize();
let offset = self.pop().as_usize();
let size = self.pop().as_usize();
for i in 0..size {
let returndata_byte = self.generation_state.memory.mload_general(
self.context,
Segment::Returndata,
offset + i,
);
self.generation_state.memory.mstore_general(
self.context,
Segment::MainMemory,
dest_offset + i,
returndata_byte,
);
}
}
fn run_coinbase(&mut self) {
self.push(self.get_global_metadata_field(GlobalMetadata::BlockBeneficiary))
}