Struct massa_execution_worker::execution::ExecutionState
source · pub(crate) struct ExecutionState {Show 15 fields
config: ExecutionConfig,
pub active_history: Arc<RwLock<ActiveHistory>>,
pub active_cursor: Slot,
pub final_cursor: Slot,
final_events_cache: Box<dyn EventCacheController>,
final_state: Arc<RwLock<dyn FinalStateController>>,
execution_context: Arc<Mutex<ExecutionContext>>,
execution_interface: Box<dyn Interface>,
stats_counter: ExecutionStatsCounter,
pub module_cache: Arc<RwLock<ModuleCache>>,
mip_store: MipStore,
wallet: Arc<RwLock<Wallet>>,
selector: Box<dyn SelectorController>,
channels: ExecutionChannels,
massa_metrics: MassaMetrics,
}Expand description
Structure holding consistent speculative and final execution states, and allowing access to them.
Fields§
§config: ExecutionConfig§active_history: Arc<RwLock<ActiveHistory>>§active_cursor: Slot§final_cursor: Slot§final_events_cache: Box<dyn EventCacheController>§final_state: Arc<RwLock<dyn FinalStateController>>§execution_context: Arc<Mutex<ExecutionContext>>§execution_interface: Box<dyn Interface>§stats_counter: ExecutionStatsCounter§module_cache: Arc<RwLock<ModuleCache>>§mip_store: MipStore§wallet: Arc<RwLock<Wallet>>§selector: Box<dyn SelectorController>§channels: ExecutionChannels§massa_metrics: MassaMetricsprometheus metrics
Implementations§
source§impl ExecutionState
impl ExecutionState
sourcepub fn new(
config: ExecutionConfig,
final_state: Arc<RwLock<dyn FinalStateController>>,
mip_store: MipStore,
selector: Box<dyn SelectorController>,
channels: ExecutionChannels,
wallet: Arc<RwLock<Wallet>>,
massa_metrics: MassaMetrics,
event_cache: Box<dyn EventCacheController>,
) -> ExecutionState
pub fn new( config: ExecutionConfig, final_state: Arc<RwLock<dyn FinalStateController>>, mip_store: MipStore, selector: Box<dyn SelectorController>, channels: ExecutionChannels, wallet: Arc<RwLock<Wallet>>, massa_metrics: MassaMetrics, event_cache: Box<dyn EventCacheController>, ) -> ExecutionState
sourcepub fn get_final_state_fingerprint(&self) -> Hash
pub fn get_final_state_fingerprint(&self) -> Hash
Get the fingerprint of the final state
sourcepub fn get_stats(&self) -> ExecutionStats
pub fn get_stats(&self) -> ExecutionStats
Get execution statistics
sourcepub fn apply_final_execution_output(&mut self, exec_out: ExecutionOutput)
pub fn apply_final_execution_output(&mut self, exec_out: ExecutionOutput)
Applies the output of an execution to the final execution state. The newly applied final output should be from the slot just after the last executed final slot
§Arguments
exec_out: execution output to apply
sourcepub fn apply_active_execution_output(&mut self, exec_out: ExecutionOutput)
pub fn apply_active_execution_output(&mut self, exec_out: ExecutionOutput)
Applies an execution output to the active (non-final) state The newly active final output should be from the slot just after the last executed active slot
§Arguments
exec_out: execution output to apply
sourcefn prepare_operation_for_execution(
&self,
operation: &SecureShareOperation,
sender_addr: Address,
) -> Result<ExecutionContextSnapshot, ExecutionError>
fn prepare_operation_for_execution( &self, operation: &SecureShareOperation, sender_addr: Address, ) -> Result<ExecutionContextSnapshot, ExecutionError>
Helper function. Within a locked execution context (lock is taken at the beginning of the function then released at the end):
- if not yet executed then transfer fee and add the operation to the context then return a context snapshot
§Arguments
operation: operation to be schedulesender_addr: sender address for the operation (for fee transfer)
sourcepub fn execute_operation(
&self,
operation: &SecureShareOperation,
block_slot: Slot,
remaining_block_gas: &mut u64,
block_credits: &mut Amount,
) -> Result<(), ExecutionError>
pub fn execute_operation( &self, operation: &SecureShareOperation, block_slot: Slot, remaining_block_gas: &mut u64, block_credits: &mut Amount, ) -> Result<(), ExecutionError>
Execute an operation in the context of a block. Assumes the execution context was initialized at the beginning of the slot.
§Arguments
operation: operation to executeblock_slot: slot of the block in which the op is includedremaining_block_gas: mutable reference towards the remaining gas in the blockblock_credits: mutable reference towards the total block reward/fee credits
sourcefn execute_denunciation(
&self,
denunciation: &Denunciation,
block_slot: &Slot,
block_credits: &mut Amount,
) -> Result<DenunciationResult, ExecutionError>
fn execute_denunciation( &self, denunciation: &Denunciation, block_slot: &Slot, block_credits: &mut Amount, ) -> Result<DenunciationResult, ExecutionError>
Execute a denunciation in the context of a block.
§Arguments
denunciation: denunciation to processblock_credits: mutable reference towards the total block reward/fee credits
sourcepub fn execute_roll_sell_op(
&self,
operation: &OperationType,
seller_addr: Address,
operation_id: OperationId,
) -> Result<(), ExecutionError>
pub fn execute_roll_sell_op( &self, operation: &OperationType, seller_addr: Address, operation_id: OperationId, ) -> Result<(), ExecutionError>
Execute an operation of type RollSell
Will panic if called with another operation type
§Arguments
operation: theWrappedOperationto process, must be anRollSellsender_addr: address of the sender
sourcepub fn execute_roll_buy_op(
&self,
operation: &OperationType,
buyer_addr: Address,
operation_id: OperationId,
) -> Result<(), ExecutionError>
pub fn execute_roll_buy_op( &self, operation: &OperationType, buyer_addr: Address, operation_id: OperationId, ) -> Result<(), ExecutionError>
Execute an operation of type RollBuy
Will panic if called with another operation type
§Arguments
operation: theWrappedOperationto process, must be anRollBuybuyer_addr: address of the buyer
sourcepub fn execute_transaction_op(
&self,
operation: &OperationType,
sender_addr: Address,
operation_id: OperationId,
) -> Result<(), ExecutionError>
pub fn execute_transaction_op( &self, operation: &OperationType, sender_addr: Address, operation_id: OperationId, ) -> Result<(), ExecutionError>
Execute an operation of type Transaction
Will panic if called with another operation type
§Arguments
operation: theWrappedOperationto process, must be aTransactionoperation_id: ID of the operationsender_addr: address of the sender
sourcepub fn execute_executesc_op(
&self,
operation: &OperationType,
sender_addr: Address,
) -> Result<(), ExecutionError>
pub fn execute_executesc_op( &self, operation: &OperationType, sender_addr: Address, ) -> Result<(), ExecutionError>
Execute an operation of type ExecuteSC
Will panic if called with another operation type
§Arguments
operation: theWrappedOperationto process, must be anExecuteSCsender_addr: address of the sender
sourcepub fn execute_callsc_op(
&self,
operation: &OperationType,
sender_addr: Address,
operation_id: OperationId,
) -> Result<(), ExecutionError>
pub fn execute_callsc_op( &self, operation: &OperationType, sender_addr: Address, operation_id: OperationId, ) -> Result<(), ExecutionError>
Execute an operation of type CallSC
Will panic if called with another operation type
§Arguments
operation: theWrappedOperationto process, must be anCallSCblock_creator_addr: address of the block creatoroperation_id: ID of the operationsender_addr: address of the sender
sourcepub fn execute_async_message(
&self,
message: AsyncMessage,
bytecode: Option<Bytecode>,
) -> Result<AsyncMessageExecutionResult, ExecutionError>
pub fn execute_async_message( &self, message: AsyncMessage, bytecode: Option<Bytecode>, ) -> Result<AsyncMessageExecutionResult, ExecutionError>
Tries to execute an asynchronous message If the execution failed reimburse the message sender.
§Arguments
- message: message information
- bytecode: executable target bytecode, or None if unavailable
fn execute_deferred_call( &self, id: &DeferredCallId, call: DeferredCall, ) -> Result<DeferredCallExecutionResult, ExecutionError>
sourcepub fn execute_slot(
&mut self,
slot: &Slot,
exec_target: Option<&(BlockId, ExecutionBlockMetadata)>,
selector: Box<dyn SelectorController>,
) -> ExecutionOutput
pub fn execute_slot( &mut self, slot: &Slot, exec_target: Option<&(BlockId, ExecutionBlockMetadata)>, selector: Box<dyn SelectorController>, ) -> ExecutionOutput
Executes a full slot (with or without a block inside) without causing any changes to the state, just yielding the execution output.
§Arguments
slot: slot to executeexec_target: metadata of the block to execute, if not missselector: Reference to the selector
§Returns
An ExecutionOutput structure summarizing the output of the executed slot
sourcepub fn execute_candidate_slot(
&mut self,
slot: &Slot,
exec_target: Option<&(BlockId, ExecutionBlockMetadata)>,
selector: Box<dyn SelectorController>,
)
pub fn execute_candidate_slot( &mut self, slot: &Slot, exec_target: Option<&(BlockId, ExecutionBlockMetadata)>, selector: Box<dyn SelectorController>, )
Execute a candidate slot
sourcepub fn execute_final_slot(
&mut self,
slot: &Slot,
exec_target: Option<&(BlockId, ExecutionBlockMetadata)>,
selector: Box<dyn SelectorController>,
)
pub fn execute_final_slot( &mut self, slot: &Slot, exec_target: Option<&(BlockId, ExecutionBlockMetadata)>, selector: Box<dyn SelectorController>, )
Execute an SCE-final slot
sourcepub(crate) fn execute_readonly_request(
&self,
req: ReadOnlyExecutionRequest,
) -> Result<ReadOnlyExecutionOutput, ExecutionError>
pub(crate) fn execute_readonly_request( &self, req: ReadOnlyExecutionRequest, ) -> Result<ReadOnlyExecutionOutput, ExecutionError>
Runs a read-only execution request.
The executed bytecode appears to be able to read and write the consensus state,
but all accumulated changes are simply returned as an ExecutionOutput object,
and not actually applied to the consensus state.
§Arguments
req: a read-only execution request
§Returns
ExecutionOutput describing the output of the execution, or an error
sourcepub fn get_final_and_candidate_balance(
&self,
address: &Address,
) -> (Option<Amount>, Option<Amount>)
pub fn get_final_and_candidate_balance( &self, address: &Address, ) -> (Option<Amount>, Option<Amount>)
Gets a balance both at the latest final and candidate executed slots
sourcepub fn get_final_and_active_bytecode(
&self,
address: &Address,
) -> (Option<Bytecode>, Option<Bytecode>)
pub fn get_final_and_active_bytecode( &self, address: &Address, ) -> (Option<Bytecode>, Option<Bytecode>)
Gets a balance both at the latest final and candidate executed slots
sourcepub fn get_final_and_candidate_rolls(&self, address: &Address) -> (u64, u64)
pub fn get_final_and_candidate_rolls(&self, address: &Address) -> (u64, u64)
Gets roll counts both at the latest final and active executed slots
sourcepub fn get_final_and_active_data_entry(
&self,
address: &Address,
key: &[u8],
) -> (Option<Vec<u8>>, Option<Vec<u8>>)
pub fn get_final_and_active_data_entry( &self, address: &Address, key: &[u8], ) -> (Option<Vec<u8>>, Option<Vec<u8>>)
Gets a data entry both at the latest final and active executed slots
pub fn get_final_datastore_keys( &self, addr: &Address, prefix: &[u8], start_key: Bound<Vec<u8>>, end_key: Bound<Vec<u8>>, count: Option<u32>, ) -> Option<BTreeSet<Vec<u8>>>
sourcepub fn get_final_and_candidate_datastore_keys(
&self,
addr: &Address,
prefix: &[u8],
start_key: Bound<Vec<u8>>,
end_key: Bound<Vec<u8>>,
count: Option<u32>,
) -> (Option<BTreeSet<Vec<u8>>>, Option<BTreeSet<Vec<u8>>>)
pub fn get_final_and_candidate_datastore_keys( &self, addr: &Address, prefix: &[u8], start_key: Bound<Vec<u8>>, end_key: Bound<Vec<u8>>, count: Option<u32>, ) -> (Option<BTreeSet<Vec<u8>>>, Option<BTreeSet<Vec<u8>>>)
Get every final and active datastore key of the given address
pub fn get_address_cycle_infos( &self, address: &Address, ) -> Vec<ExecutionAddressCycleInfo>
sourcepub fn get_cycle_active_rolls(&self, cycle: u64) -> BTreeMap<Address, u64>
pub fn get_cycle_active_rolls(&self, cycle: u64) -> BTreeMap<Address, u64>
Returns for a given cycle the stakers taken into account
by the selector. That correspond to the roll_counts in cycle - 3.
By default it returns an empty map.
sourcepub fn get_filtered_sc_output_event(
&self,
filter: EventFilter,
) -> Vec<SCOutputEvent>
pub fn get_filtered_sc_output_event( &self, filter: EventFilter, ) -> Vec<SCOutputEvent>
Gets execution events optionally filtered by:
- start slot
- end slot
- emitter address
- original caller address
- operation id
- event state (final, candidate or both)
sourcepub fn get_denunciation_execution_status(
&self,
denunciation_index: &DenunciationIndex,
) -> (bool, bool)
pub fn get_denunciation_execution_status( &self, denunciation_index: &DenunciationIndex, ) -> (bool, bool)
Check if a denunciation has been executed given a DenunciationIndex
Returns a tuple of booleans:
- first boolean is true if the denunciation has been executed speculatively
- second boolean is true if the denunciation has been executed in the final state
sourcepub fn get_cycle_infos(
&self,
cycle: u64,
restrict_to_addresses: Option<&PreHashSet<Address>>,
) -> Option<ExecutionQueryCycleInfos>
pub fn get_cycle_infos( &self, cycle: u64, restrict_to_addresses: Option<&PreHashSet<Address>>, ) -> Option<ExecutionQueryCycleInfos>
Get cycle infos
sourcepub fn get_address_future_deferred_credits(
&self,
address: &Address,
max_slot: Bound<Slot>,
) -> BTreeMap<Slot, Amount>
pub fn get_address_future_deferred_credits( &self, address: &Address, max_slot: Bound<Slot>, ) -> BTreeMap<Slot, Amount>
Get future deferred credits of an address
sourcepub fn get_address_deferred_credits(
&self,
address: &Address,
) -> (BTreeMap<Slot, Amount>, BTreeMap<Slot, Amount>)
pub fn get_address_deferred_credits( &self, address: &Address, ) -> (BTreeMap<Slot, Amount>, BTreeMap<Slot, Amount>)
Get future deferred credits of an address Returns tuple: (speculative, final)
sourcepub fn get_ops_exec_status(
&self,
batch: &[OperationId],
) -> Vec<(Option<bool>, Option<bool>)>
pub fn get_ops_exec_status( &self, batch: &[OperationId], ) -> Vec<(Option<bool>, Option<bool>)>
Get the execution status of a batch of operations.
Return value: vector of
(Option<speculative_status>, Option<final_status>)
If an Option is None it means that the op execution was not found.
Note that old op executions are forgotten.
Otherwise, the status is a boolean indicating whether the execution was successful (true) or if there was an error (false.)
sourcepub fn update_versioning_stats(
&mut self,
block_info: &Option<ExecutedBlockInfo>,
slot: &Slot,
)
pub fn update_versioning_stats( &mut self, block_info: &Option<ExecutedBlockInfo>, slot: &Slot, )
Update MipStore with block header stats
pub fn deferred_call_quote( &self, target_slot: Slot, max_request_gas: u64, params_size: u64, ) -> (Slot, u64, bool, Amount)
pub fn deferred_call_info( &self, call_id: &DeferredCallId, ) -> Option<DeferredCall>
pub fn get_deferred_calls_by_slot(&self, slot: Slot) -> Vec<DeferredCallId>
Auto Trait Implementations§
impl Freeze for ExecutionState
impl !RefUnwindSafe for ExecutionState
impl Send for ExecutionState
impl Sync for ExecutionState
impl Unpin for ExecutionState
impl !UnwindSafe for ExecutionState
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
§fn deserialize(
&self,
deserializer: &mut D,
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>
§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,
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,
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,
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,
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,
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,
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,
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,
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,
§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> 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>
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>
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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
§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,
§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,
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,
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
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
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
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§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
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
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
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
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
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
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
.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
.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
.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
.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
.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
.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
.tap_deref() only in debug builds, and is erased in release
builds.