pub struct MyHandler<EVM> {
pub _phantom: PhantomData<EVM>,
}
Fields§
§_phantom: PhantomData<EVM>
Trait Implementations§
Source§impl<EVM> Handler for MyHandler<EVM>where
EVM: EvmTr<Context: ContextTr<Journal: JournalTr<FinalOutput = JournalOutput>>, Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>, Instructions: InstructionProvider<Context = EVM::Context, InterpreterTypes = EthInterpreter>>,
impl<EVM> Handler for MyHandler<EVM>where
EVM: EvmTr<Context: ContextTr<Journal: JournalTr<FinalOutput = JournalOutput>>, Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>, Instructions: InstructionProvider<Context = EVM::Context, InterpreterTypes = EthInterpreter>>,
Source§type Error = EVMError<<<<EVM as EvmTr>::Context as ContextTr>::Db as Database>::Error>
type Error = EVMError<<<<EVM as EvmTr>::Context as ContextTr>::Db as Database>::Error>
The error type returned by this handler.
Source§type Frame = EthFrame<EVM, EVMError<<<<EVM as EvmTr>::Context as ContextTr>::Db as Database>::Error>, <<EVM as EvmTr>::Instructions as InstructionProvider>::InterpreterTypes>
type Frame = EthFrame<EVM, EVMError<<<<EVM as EvmTr>::Context as ContextTr>::Db as Database>::Error>, <<EVM as EvmTr>::Instructions as InstructionProvider>::InterpreterTypes>
The Frame type containing data for frame execution. Supports Call, Create and EofCreate frames.
Source§type HaltReason = HaltReason
type HaltReason = HaltReason
The halt reason type included in the output
Source§fn reward_beneficiary(
&self,
_evm: &mut Self::Evm,
_exec_result: &mut FrameResult,
) -> Result<(), Self::Error>
fn reward_beneficiary( &self, _evm: &mut Self::Evm, _exec_result: &mut FrameResult, ) -> Result<(), Self::Error>
Transfers transaction fees to the block beneficiary’s account.
Source§fn run(
&mut self,
evm: &mut Self::Evm,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn run( &mut self, evm: &mut Self::Evm, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
The main entry point for transaction execution. Read more
Source§fn run_without_catch_error(
&mut self,
evm: &mut Self::Evm,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn run_without_catch_error( &mut self, evm: &mut Self::Evm, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
Called by
Handler::run
to execute the core handler logic. Read moreSource§fn validate(
&self,
evm: &mut Self::Evm,
) -> Result<InitialAndFloorGas, Self::Error>
fn validate( &self, evm: &mut Self::Evm, ) -> Result<InitialAndFloorGas, Self::Error>
Validates the execution environment and transaction parameters. Read more
Source§fn pre_execution(&self, evm: &mut Self::Evm) -> Result<u64, Self::Error>
fn pre_execution(&self, evm: &mut Self::Evm) -> Result<u64, Self::Error>
Prepares the EVM state for execution. Read more
Source§fn execution(
&mut self,
evm: &mut Self::Evm,
init_and_floor_gas: &InitialAndFloorGas,
) -> Result<FrameResult, Self::Error>
fn execution( &mut self, evm: &mut Self::Evm, init_and_floor_gas: &InitialAndFloorGas, ) -> Result<FrameResult, Self::Error>
Creates and executes the initial frame, then processes the execution loop. Read more
Source§fn post_execution(
&self,
evm: &mut Self::Evm,
exec_result: FrameResult,
init_and_floor_gas: InitialAndFloorGas,
eip7702_gas_refund: i64,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn post_execution( &self, evm: &mut Self::Evm, exec_result: FrameResult, init_and_floor_gas: InitialAndFloorGas, eip7702_gas_refund: i64, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
Handles the final steps of transaction execution. Read more
Source§fn validate_env(&self, evm: &mut Self::Evm) -> Result<(), Self::Error>
fn validate_env(&self, evm: &mut Self::Evm) -> Result<(), Self::Error>
Validates block, transaction and configuration fields. Read more
Source§fn validate_initial_tx_gas(
&self,
evm: &Self::Evm,
) -> Result<InitialAndFloorGas, Self::Error>
fn validate_initial_tx_gas( &self, evm: &Self::Evm, ) -> Result<InitialAndFloorGas, Self::Error>
Calculates initial gas costs based on transaction type and input data. Read more
Source§fn validate_tx_against_state(
&self,
evm: &mut Self::Evm,
) -> Result<(), Self::Error>
fn validate_tx_against_state( &self, evm: &mut Self::Evm, ) -> Result<(), Self::Error>
Loads caller account to access nonce and balance. Read more
Source§fn load_accounts(&self, evm: &mut Self::Evm) -> Result<(), Self::Error>
fn load_accounts(&self, evm: &mut Self::Evm) -> Result<(), Self::Error>
Loads access list and beneficiary account, marking them as warm in the
context::Journal
.Source§fn apply_eip7702_auth_list(
&self,
evm: &mut Self::Evm,
) -> Result<u64, Self::Error>
fn apply_eip7702_auth_list( &self, evm: &mut Self::Evm, ) -> Result<u64, Self::Error>
Processes the authorization list, validating authority signatures, nonces and chain IDs.
Applies valid authorizations to accounts. Read more
Source§fn deduct_caller(&self, evm: &mut Self::Evm) -> Result<(), Self::Error>
fn deduct_caller(&self, evm: &mut Self::Evm) -> Result<(), Self::Error>
Deducts maximum possible fee and transfer value from caller’s balance. Read more
Source§fn first_frame_input(
&mut self,
evm: &mut Self::Evm,
gas_limit: u64,
) -> Result<FrameInput, Self::Error>
fn first_frame_input( &mut self, evm: &mut Self::Evm, gas_limit: u64, ) -> Result<FrameInput, Self::Error>
Creates initial frame input using transaction parameters, gas limit and configuration.
Source§fn last_frame_result(
&self,
evm: &mut Self::Evm,
frame_result: &mut <Self::Frame as Frame>::FrameResult,
) -> Result<(), Self::Error>
fn last_frame_result( &self, evm: &mut Self::Evm, frame_result: &mut <Self::Frame as Frame>::FrameResult, ) -> Result<(), Self::Error>
Processes the result of the initial call and handles returned gas.
Source§fn first_frame_init(
&mut self,
evm: &mut Self::Evm,
frame_input: <Self::Frame as Frame>::FrameInit,
) -> Result<ItemOrResult<Self::Frame, <Self::Frame as Frame>::FrameResult>, Self::Error>
fn first_frame_init( &mut self, evm: &mut Self::Evm, frame_input: <Self::Frame as Frame>::FrameInit, ) -> Result<ItemOrResult<Self::Frame, <Self::Frame as Frame>::FrameResult>, Self::Error>
Initializes the first frame from the provided frame input.
Source§fn frame_init(
&mut self,
frame: &Self::Frame,
evm: &mut Self::Evm,
frame_input: <Self::Frame as Frame>::FrameInit,
) -> Result<ItemOrResult<Self::Frame, <Self::Frame as Frame>::FrameResult>, Self::Error>
fn frame_init( &mut self, frame: &Self::Frame, evm: &mut Self::Evm, frame_input: <Self::Frame as Frame>::FrameInit, ) -> Result<ItemOrResult<Self::Frame, <Self::Frame as Frame>::FrameResult>, Self::Error>
Initializes a new frame from the provided frame input and previous frame. Read more
Source§fn frame_call(
&mut self,
frame: &mut Self::Frame,
evm: &mut Self::Evm,
) -> Result<ItemOrResult<<Self::Frame as Frame>::FrameInit, <Self::Frame as Frame>::FrameResult>, Self::Error>
fn frame_call( &mut self, frame: &mut Self::Frame, evm: &mut Self::Evm, ) -> Result<ItemOrResult<<Self::Frame as Frame>::FrameInit, <Self::Frame as Frame>::FrameResult>, Self::Error>
Executes a frame and returns either input for a new frame or the frame’s result. Read more
Source§fn frame_return_result(
&mut self,
frame: &mut Self::Frame,
evm: &mut Self::Evm,
result: <Self::Frame as Frame>::FrameResult,
) -> Result<(), Self::Error>
fn frame_return_result( &mut self, frame: &mut Self::Frame, evm: &mut Self::Evm, result: <Self::Frame as Frame>::FrameResult, ) -> Result<(), Self::Error>
Processes a frame’s result by inserting it into the parent frame.
Source§fn run_exec_loop(
&mut self,
evm: &mut Self::Evm,
frame: Self::Frame,
) -> Result<FrameResult, Self::Error>
fn run_exec_loop( &mut self, evm: &mut Self::Evm, frame: Self::Frame, ) -> Result<FrameResult, Self::Error>
Executes the main frame processing loop. Read more
Source§fn eip7623_check_gas_floor(
&self,
_evm: &mut Self::Evm,
exec_result: &mut <Self::Frame as Frame>::FrameResult,
init_and_floor_gas: InitialAndFloorGas,
)
fn eip7623_check_gas_floor( &self, _evm: &mut Self::Evm, exec_result: &mut <Self::Frame as Frame>::FrameResult, init_and_floor_gas: InitialAndFloorGas, )
Validates that the minimum gas floor requirements are satisfied. Read more
Source§fn refund(
&self,
evm: &mut Self::Evm,
exec_result: &mut <Self::Frame as Frame>::FrameResult,
eip7702_refund: i64,
)
fn refund( &self, evm: &mut Self::Evm, exec_result: &mut <Self::Frame as Frame>::FrameResult, eip7702_refund: i64, )
Calculates the final gas refund amount, including any EIP-7702 refunds.
Source§fn reimburse_caller(
&self,
evm: &mut Self::Evm,
exec_result: &mut <Self::Frame as Frame>::FrameResult,
) -> Result<(), Self::Error>
fn reimburse_caller( &self, evm: &mut Self::Evm, exec_result: &mut <Self::Frame as Frame>::FrameResult, ) -> Result<(), Self::Error>
Returns unused gas costs to the transaction sender’s account.
Source§fn output(
&self,
evm: &mut Self::Evm,
result: <Self::Frame as Frame>::FrameResult,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn output( &self, evm: &mut Self::Evm, result: <Self::Frame as Frame>::FrameResult, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
Processes the final execution output. Read more
Source§fn catch_error(
&self,
evm: &mut Self::Evm,
error: Self::Error,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn catch_error( &self, evm: &mut Self::Evm, error: Self::Error, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
Handles cleanup when an error occurs during execution. Read more
Source§impl<EVM> InspectorHandler for MyHandler<EVM>where
EVM: InspectorEvmTr<Inspector: Inspector<<<Self as Handler>::Evm as EvmTr>::Context, EthInterpreter>, Context: ContextTr<Journal: JournalTr<FinalOutput = JournalOutput>>, Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>, Instructions: InstructionProvider<Context = EVM::Context, InterpreterTypes = EthInterpreter>>,
impl<EVM> InspectorHandler for MyHandler<EVM>where
EVM: InspectorEvmTr<Inspector: Inspector<<<Self as Handler>::Evm as EvmTr>::Context, EthInterpreter>, Context: ContextTr<Journal: JournalTr<FinalOutput = JournalOutput>>, Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>, Instructions: InstructionProvider<Context = EVM::Context, InterpreterTypes = EthInterpreter>>,
type IT = EthInterpreter
Source§fn inspect_run(
&mut self,
evm: &mut Self::Evm,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn inspect_run( &mut self, evm: &mut Self::Evm, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
Entry point for inspection. Read more
Source§fn inspect_run_without_catch_error(
&mut self,
evm: &mut Self::Evm,
) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
fn inspect_run_without_catch_error( &mut self, evm: &mut Self::Evm, ) -> Result<ResultAndState<Self::HaltReason>, Self::Error>
Run inspection without catching error. Read more
Source§fn inspect_execution(
&mut self,
evm: &mut Self::Evm,
init_and_floor_gas: &InitialAndFloorGas,
) -> Result<FrameResult, Self::Error>
fn inspect_execution( &mut self, evm: &mut Self::Evm, init_and_floor_gas: &InitialAndFloorGas, ) -> Result<FrameResult, Self::Error>
Run execution loop with inspection support Read more
Source§fn inspect_first_frame_init(
&mut self,
evm: &mut Self::Evm,
frame_input: <Self::Frame as Frame>::FrameInit,
) -> Result<ItemOrResult<Self::Frame, <Self::Frame as Frame>::FrameResult>, Self::Error>
fn inspect_first_frame_init( &mut self, evm: &mut Self::Evm, frame_input: <Self::Frame as Frame>::FrameInit, ) -> Result<ItemOrResult<Self::Frame, <Self::Frame as Frame>::FrameResult>, Self::Error>
Initialize first frame. Read more
Source§fn inspect_frame_call(
&mut self,
frame: &mut Self::Frame,
evm: &mut Self::Evm,
) -> Result<ItemOrResult<<Self::Frame as Frame>::FrameInit, <Self::Frame as Frame>::FrameResult>, Self::Error>
fn inspect_frame_call( &mut self, frame: &mut Self::Frame, evm: &mut Self::Evm, ) -> Result<ItemOrResult<<Self::Frame as Frame>::FrameInit, <Self::Frame as Frame>::FrameResult>, Self::Error>
Run inspection on frame. Read more
Source§fn inspect_run_exec_loop(
&mut self,
evm: &mut Self::Evm,
frame: Self::Frame,
) -> Result<FrameResult, Self::Error>
fn inspect_run_exec_loop( &mut self, evm: &mut Self::Evm, frame: Self::Frame, ) -> Result<FrameResult, Self::Error>
Run inspection on execution loop. Read more
Auto Trait Implementations§
impl<EVM> Freeze for MyHandler<EVM>
impl<EVM> RefUnwindSafe for MyHandler<EVM>where
EVM: RefUnwindSafe,
impl<EVM> Send for MyHandler<EVM>where
EVM: Send,
impl<EVM> Sync for MyHandler<EVM>where
EVM: Sync,
impl<EVM> Unpin for MyHandler<EVM>where
EVM: Unpin,
impl<EVM> UnwindSafe for MyHandler<EVM>where
EVM: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
Formats each item in a sequence. Read more
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self
, then passes self.deref()
into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref()
only in debug builds, and is erased in release
builds.