Skip to content

Commit 3dba391

Browse files
committed
feat: object safety for fillers
1 parent 5fcdf50 commit 3dba391

File tree

2 files changed

+57
-4
lines changed

2 files changed

+57
-4
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "trevm"
3-
version = "0.20.9"
3+
version = "0.20.10"
44
rust-version = "1.83.0"
55
edition = "2021"
66
authors = ["init4"]

src/fill/traits.rs

+56-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use revm::{
33
context::{BlockEnv, CfgEnv, Evm, TxEnv},
44
Database,
55
};
6+
use std::sync::Arc;
67

78
/// Types that can fill the EVM transaction environment [`TxEnv`].
89
pub trait Tx: Send + Sync {
@@ -18,11 +19,26 @@ pub trait Tx: Send + Sync {
1819
fn fill_tx_env(&self, tx_env: &mut TxEnv);
1920

2021
/// Fill the transaction environment on the EVM.
21-
fn fill_tx<Db: Database, Insp, Inst, Prec>(&self, evm: &mut Evm<Ctx<Db>, Insp, Inst, Prec>) {
22+
fn fill_tx<Db: Database, Insp, Inst, Prec>(&self, evm: &mut Evm<Ctx<Db>, Insp, Inst, Prec>)
23+
where
24+
Self: Sized,
25+
{
2226
evm.data.ctx.modify_tx(|tx_env| self.fill_tx_env(tx_env));
2327
}
2428
}
2529

30+
impl Tx for Arc<dyn Tx> {
31+
fn fill_tx_env(&self, tx_env: &mut TxEnv) {
32+
self.as_ref().fill_tx_env(tx_env);
33+
}
34+
}
35+
36+
impl Tx for Box<dyn Tx> {
37+
fn fill_tx_env(&self, tx_env: &mut TxEnv) {
38+
self.as_ref().fill_tx_env(tx_env);
39+
}
40+
}
41+
2642
impl<T> Tx for T
2743
where
2844
T: Fn(&mut TxEnv) + Send + Sync,
@@ -45,7 +61,10 @@ pub trait Block: Send + Sync {
4561
fn fill_block_env(&self, block_env: &mut BlockEnv);
4662

4763
/// Fill the block environment on the EVM.
48-
fn fill_block<Db: Database, Insp, Inst, Prec>(&self, evm: &mut Evm<Ctx<Db>, Insp, Inst, Prec>) {
64+
fn fill_block<Db: Database, Insp, Inst, Prec>(&self, evm: &mut Evm<Ctx<Db>, Insp, Inst, Prec>)
65+
where
66+
Self: Sized,
67+
{
4968
evm.data.ctx.modify_block(|block_env| self.fill_block_env(block_env));
5069
}
5170

@@ -65,6 +84,18 @@ where
6584
}
6685
}
6786

87+
impl Block for Arc<dyn Block> {
88+
fn fill_block_env(&self, block_env: &mut BlockEnv) {
89+
self.as_ref().fill_block_env(block_env);
90+
}
91+
}
92+
93+
impl Block for Box<dyn Block> {
94+
fn fill_block_env(&self, block_env: &mut BlockEnv) {
95+
self.as_ref().fill_block_env(block_env);
96+
}
97+
}
98+
6899
/// Types that can fill the EVM configuration environment [`CfgEnv`].
69100
///
70101
/// Because the CFG env has quite a few conditionally compiled properties, it
@@ -87,11 +118,26 @@ pub trait Cfg: Send + Sync {
87118
fn fill_cfg_env(&self, cfg_env: &mut CfgEnv);
88119

89120
/// Fill the configuration environment on the EVM.
90-
fn fill_cfg<Db: Database, Insp, Inst, Prec>(&self, evm: &mut Evm<Ctx<Db>, Insp, Inst, Prec>) {
121+
fn fill_cfg<Db: Database, Insp, Inst, Prec>(&self, evm: &mut Evm<Ctx<Db>, Insp, Inst, Prec>)
122+
where
123+
Self: Sized,
124+
{
91125
evm.data.ctx.modify_cfg(|cfg_env| self.fill_cfg_env(cfg_env));
92126
}
93127
}
94128

129+
impl Cfg for Arc<dyn Cfg> {
130+
fn fill_cfg_env(&self, cfg_env: &mut CfgEnv) {
131+
self.as_ref().fill_cfg_env(cfg_env);
132+
}
133+
}
134+
135+
impl Cfg for Box<dyn Cfg> {
136+
fn fill_cfg_env(&self, cfg_env: &mut CfgEnv) {
137+
self.as_ref().fill_cfg_env(cfg_env);
138+
}
139+
}
140+
95141
impl<T> Cfg for T
96142
where
97143
T: Fn(&mut CfgEnv) + Send + Sync,
@@ -114,6 +160,13 @@ mod test {
114160

115161
use super::*;
116162

163+
#[allow(dead_code)]
164+
fn object_safety(cfg: Box<dyn Cfg>, block: Box<dyn Block>, tx: Box<dyn Tx>) {
165+
crate::test_utils::test_trevm().fill_cfg(&cfg).fill_block(&block).fill_tx(&tx);
166+
167+
unimplemented!("compilation check only")
168+
}
169+
117170
impl Block for () {
118171
fn fill_block_env(&self, block_env: &mut BlockEnv) {
119172
let BlockEnv {

0 commit comments

Comments
 (0)