diff --git a/crates/revm/src/builder.rs b/crates/revm/src/builder.rs index ea8cdef305..28a5406acb 100644 --- a/crates/revm/src/builder.rs +++ b/crates/revm/src/builder.rs @@ -340,7 +340,7 @@ impl<'a, BuilderStage, EXT, DB: Database> EvmBuilder<'a, BuilderStage, EXT, DB> /// When called, EvmBuilder will transition from SetGenericStage to HandlerStage. pub fn append_handler_register_box( mut self, - handle_register: register::HandleRegisterBox, + handle_register: register::HandleRegisterBox<'a, EXT, DB>, ) -> EvmBuilder<'a, HandlerStage, EXT, DB> { self.handler .append_handler_register(register::HandleRegisters::Box(handle_register)); diff --git a/crates/revm/src/handler.rs b/crates/revm/src/handler.rs index 66f2561b16..5c74315fca 100644 --- a/crates/revm/src/handler.rs +++ b/crates/revm/src/handler.rs @@ -27,7 +27,7 @@ pub struct Handler<'a, H: Host + 'a, EXT, DB: Database> { /// Instruction table type. pub instruction_table: InstructionTables<'a, H>, /// Registers that will be called on initialization. - pub registers: Vec>, + pub registers: Vec>, /// Validity handles. pub validation: ValidationHandler<'a, EXT, DB>, /// Pre execution handle. @@ -179,7 +179,7 @@ impl<'a, EXT, DB: Database> EvmHandler<'a, EXT, DB> { } /// Append handle register. - pub fn append_handler_register(&mut self, register: HandleRegisters) { + pub fn append_handler_register(&mut self, register: HandleRegisters<'a, EXT, DB>) { register.register(self); self.registers.push(register); } @@ -191,13 +191,13 @@ impl<'a, EXT, DB: Database> EvmHandler<'a, EXT, DB> { } /// Append boxed handle register. - pub fn append_handler_register_box(&mut self, register: HandleRegisterBox) { + pub fn append_handler_register_box(&mut self, register: HandleRegisterBox<'a, EXT, DB>) { register(self); self.registers.push(HandleRegisters::Box(register)); } /// Pop last handle register and reapply all registers that are left. - pub fn pop_handle_register(&mut self) -> Option> { + pub fn pop_handle_register(&mut self) -> Option> { let out = self.registers.pop(); if out.is_some() { let registers = core::mem::take(&mut self.registers); @@ -252,7 +252,7 @@ mod test { #[test] fn test_handler_register_pop() { - let register = |inner: &Rc>| -> HandleRegisterBox<(), EmptyDB> { + let register = |inner: &Rc>| -> HandleRegisterBox<'_, (), EmptyDB> { let inner = inner.clone(); Box::new(move |h| { *inner.borrow_mut() += 1; diff --git a/crates/revm/src/handler/register.rs b/crates/revm/src/handler/register.rs index 4b9fa31377..e05225c17c 100644 --- a/crates/revm/src/handler/register.rs +++ b/crates/revm/src/handler/register.rs @@ -8,18 +8,21 @@ pub type EvmHandler<'a, EXT, DB> = Handler<'a, Context, EXT, DB>; pub type HandleRegister = for<'a> fn(&mut EvmHandler<'a, EXT, DB>); // Boxed handle register -pub type HandleRegisterBox = Box Fn(&mut EvmHandler<'a, EXT, DB>)>; +pub type HandleRegisterBox<'a, EXT, DB> = Box Fn(&mut EvmHandler<'e, EXT, DB>) + 'a>; -pub enum HandleRegisters { +pub enum HandleRegisters<'a, EXT, DB: Database> { /// Plain function register Plain(HandleRegister), /// Boxed function register. - Box(HandleRegisterBox), + Box(HandleRegisterBox<'a, EXT, DB>), } -impl HandleRegisters { +impl<'register, EXT, DB: Database> HandleRegisters<'register, EXT, DB> { /// Call register function to modify EvmHandler. - pub fn register(&self, handler: &mut EvmHandler<'_, EXT, DB>) { + pub fn register<'evm>(&self, handler: &mut EvmHandler<'evm, EXT, DB>) + where + 'evm: 'register, + { match self { HandleRegisters::Plain(f) => f(handler), HandleRegisters::Box(f) => f(handler),