Skip to content

Commit c2e356d

Browse files
authored
fix: allow non-static lifetime in HandleRegisterBox (bluealloy#1608)
1 parent 81acfe3 commit c2e356d

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

crates/revm/src/builder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ impl<'a, BuilderStage, EXT, DB: Database> EvmBuilder<'a, BuilderStage, EXT, DB>
329329
/// When called, EvmBuilder will transition from SetGenericStage to HandlerStage.
330330
pub fn append_handler_register_box(
331331
mut self,
332-
handle_register: register::HandleRegisterBox<EXT, DB>,
332+
handle_register: register::HandleRegisterBox<'a, EXT, DB>,
333333
) -> EvmBuilder<'a, HandlerStage, EXT, DB> {
334334
self.handler
335335
.append_handler_register(register::HandleRegisters::Box(handle_register));

crates/revm/src/handler.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub struct Handler<'a, H: Host + 'a, EXT, DB: Database> {
2727
/// Instruction table type.
2828
pub instruction_table: InstructionTables<'a, H>,
2929
/// Registers that will be called on initialization.
30-
pub registers: Vec<HandleRegisters<EXT, DB>>,
30+
pub registers: Vec<HandleRegisters<'a, EXT, DB>>,
3131
/// Validity handles.
3232
pub validation: ValidationHandler<'a, EXT, DB>,
3333
/// Pre execution handle.
@@ -154,7 +154,7 @@ impl<'a, EXT, DB: Database> EvmHandler<'a, EXT, DB> {
154154
}
155155

156156
/// Append handle register.
157-
pub fn append_handler_register(&mut self, register: HandleRegisters<EXT, DB>) {
157+
pub fn append_handler_register(&mut self, register: HandleRegisters<'a, EXT, DB>) {
158158
register.register(self);
159159
self.registers.push(register);
160160
}
@@ -166,13 +166,13 @@ impl<'a, EXT, DB: Database> EvmHandler<'a, EXT, DB> {
166166
}
167167

168168
/// Append boxed handle register.
169-
pub fn append_handler_register_box(&mut self, register: HandleRegisterBox<EXT, DB>) {
169+
pub fn append_handler_register_box(&mut self, register: HandleRegisterBox<'a, EXT, DB>) {
170170
register(self);
171171
self.registers.push(HandleRegisters::Box(register));
172172
}
173173

174174
/// Pop last handle register and reapply all registers that are left.
175-
pub fn pop_handle_register(&mut self) -> Option<HandleRegisters<EXT, DB>> {
175+
pub fn pop_handle_register(&mut self) -> Option<HandleRegisters<'a, EXT, DB>> {
176176
let out = self.registers.pop();
177177
if out.is_some() {
178178
let registers = core::mem::take(&mut self.registers);
@@ -227,7 +227,7 @@ mod test {
227227

228228
#[test]
229229
fn test_handler_register_pop() {
230-
let register = |inner: &Rc<RefCell<i32>>| -> HandleRegisterBox<(), EmptyDB> {
230+
let register = |inner: &Rc<RefCell<i32>>| -> HandleRegisterBox<'_, (), EmptyDB> {
231231
let inner = inner.clone();
232232
Box::new(move |h| {
233233
*inner.borrow_mut() += 1;

crates/revm/src/handler/register.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,21 @@ pub type EvmHandler<'a, EXT, DB> = Handler<'a, Context<EXT, DB>, EXT, DB>;
88
pub type HandleRegister<EXT, DB> = for<'a> fn(&mut EvmHandler<'a, EXT, DB>);
99

1010
// Boxed handle register
11-
pub type HandleRegisterBox<EXT, DB> = Box<dyn for<'a> Fn(&mut EvmHandler<'a, EXT, DB>)>;
11+
pub type HandleRegisterBox<'a, EXT, DB> = Box<dyn for<'e> Fn(&mut EvmHandler<'e, EXT, DB>) + 'a>;
1212

13-
pub enum HandleRegisters<EXT, DB: Database> {
13+
pub enum HandleRegisters<'a, EXT, DB: Database> {
1414
/// Plain function register
1515
Plain(HandleRegister<EXT, DB>),
1616
/// Boxed function register.
17-
Box(HandleRegisterBox<EXT, DB>),
17+
Box(HandleRegisterBox<'a, EXT, DB>),
1818
}
1919

20-
impl<EXT, DB: Database> HandleRegisters<EXT, DB> {
20+
impl<'register, EXT, DB: Database> HandleRegisters<'register, EXT, DB> {
2121
/// Call register function to modify EvmHandler.
22-
pub fn register(&self, handler: &mut EvmHandler<'_, EXT, DB>) {
22+
pub fn register<'evm>(&self, handler: &mut EvmHandler<'evm, EXT, DB>)
23+
where
24+
'evm: 'register,
25+
{
2326
match self {
2427
HandleRegisters::Plain(f) => f(handler),
2528
HandleRegisters::Box(f) => f(handler),

0 commit comments

Comments
 (0)