pub(crate) struct InstData {
pub(crate) opcode: u8,
pub(crate) flags: InstFlags,
base_gas: u16,
stack_io: (u8, u8),
pub(crate) data: u32,
pub(crate) gas_section: GasSection,
pub(crate) stack_section: StackSection,
}Expand description
A single instruction in the bytecode.
Fields§
§opcode: u8The opcode byte.
flags: InstFlagsFlags.
base_gas: u16The base gas cost of the opcode.
This may not be the final/full gas cost of the opcode as it may also have a dynamic cost.
stack_io: (u8, u8)Stack inputs and outputs.
data: u32Instruction-specific data, populated at parse time and refined by analysis.
Interpretation depends on opcode; access via the typed methods on InstData:
PUSH0..=PUSH32,DUPN | SWAPN | EXCHANGE: encodedU256Imm.PC: program counter of this instruction.JUMPDEST: program counter in low 31 bits, reachable flag in high bit (InstData::JUMPDEST_REACHABLE).JUMP | JUMPIwithInstFlags::STATIC_JUMP: target instruction index.- otherwise: unused.
gas_section: GasSectionThe gas section this instruction belongs to.
stack_section: StackSectionThe stack section this instruction belongs to.
Implementations§
Source§impl InstData
impl InstData
Sourcepub(crate) const JUMPDEST_REACHABLE: u32
pub(crate) const JUMPDEST_REACHABLE: u32
High bit of data set when a JUMPDEST is a reachable static jump target.
Sourcefn new(opcode: u8) -> Self
fn new(opcode: u8) -> Self
Creates a new instruction data with the given opcode byte. Note that this may not be a valid instruction.
Sourcepub(crate) const fn imm_len(&self) -> u8
pub(crate) const fn imm_len(&self) -> u8
Returns the length of the immediate data of this instruction.
Sourcepub(crate) fn stack_io(&self) -> (u8, u8)
pub(crate) fn stack_io(&self) -> (u8, u8)
Returns the number of input and output stack elements of this instruction.
Sourcepub(crate) const fn to_op(&self) -> Opcode<'static>
pub(crate) const fn to_op(&self) -> Opcode<'static>
Converts this instruction to a raw opcode. Note that the immediate data is not resolved.
Sourcepub(crate) fn is_jump(&self) -> bool
pub(crate) fn is_jump(&self) -> bool
Returns true if this instruction is a jump instruction (JUMP/JUMPI).
Sourcepub(crate) fn is_static_jump(&self) -> bool
pub(crate) fn is_static_jump(&self) -> bool
Returns true if this instruction is a jump instruction (JUMP/JUMPI), and the
target known statically.
Sourcepub(crate) const fn is_jumpdest(&self) -> bool
pub(crate) const fn is_jumpdest(&self) -> bool
Returns true if this instruction is a JUMPDEST.
Sourcepub(crate) fn is_reachable_jumpdest(&self, has_dynamic_jumps: bool) -> bool
pub(crate) fn is_reachable_jumpdest(&self, has_dynamic_jumps: bool) -> bool
Returns true if this instruction is a reachable JUMPDEST.
Sourcepub(crate) fn imm(&self) -> U256Imm
pub(crate) fn imm(&self) -> U256Imm
Returns the U256Imm of a PUSH*/DUPN/SWAPN/EXCHANGE instruction.
Sourcepub(crate) fn imm_byte(&self) -> u8
pub(crate) fn imm_byte(&self) -> u8
Returns the inline u8 immediate of a DUPN/SWAPN/EXCHANGE instruction.
Sourcepub(crate) fn pc_imm(&self) -> u32
pub(crate) fn pc_imm(&self) -> u32
Returns the program counter stored inline for a PC instruction.
Sourcepub(crate) fn jumpdest_pc(&self) -> u32
pub(crate) fn jumpdest_pc(&self) -> u32
Returns the program counter of a JUMPDEST.
Sourcepub(crate) fn is_jumpdest_reachable(&self) -> bool
pub(crate) fn is_jumpdest_reachable(&self) -> bool
Returns true if this JUMPDEST is the target of a resolved static jump.
Sourcepub(crate) fn set_jumpdest_reachable(&mut self)
pub(crate) fn set_jumpdest_reachable(&mut self)
Marks this JUMPDEST as a reachable static jump target.
Sourcepub(crate) fn static_jump_target(&self) -> Inst
pub(crate) fn static_jump_target(&self) -> Inst
Returns the static target of a JUMP/JUMPI with InstFlags::STATIC_JUMP.
Sourcepub(crate) fn set_static_jump_target(&mut self, target: Inst)
pub(crate) fn set_static_jump_target(&mut self, target: Inst)
Sets the static jump target. Caller must also set InstFlags::STATIC_JUMP.
Sourcepub(crate) fn is_stack_section_head(&self) -> bool
pub(crate) fn is_stack_section_head(&self) -> bool
Returns true if this instruction starts a new stack section.
Sourcepub(crate) fn is_dead_code(&self) -> bool
pub(crate) fn is_dead_code(&self) -> bool
Returns true if this instruction is dead code.
Sourcepub(crate) fn requires_gasleft(&self, spec_id: SpecId) -> bool
pub(crate) fn requires_gasleft(&self, spec_id: SpecId) -> bool
Returns true if this instruction requires to know gasleft().
Note that this does not include CALL and CREATE.
Sourcepub(crate) fn can_fall_through(&self) -> bool
pub(crate) fn can_fall_through(&self) -> bool
Returns true if execution can fall through to the next sequential instruction.
Sourcepub(crate) fn is_branching(&self) -> bool
pub(crate) fn is_branching(&self) -> bool
Returns true if we know that this instruction will branch or stop execution.
Sourcepub(crate) fn is_diverging(&self) -> bool
pub(crate) fn is_diverging(&self) -> bool
Returns true if we know that this instruction will stop execution.
Sourcepub(crate) const fn may_suspend(&self) -> bool
pub(crate) const fn may_suspend(&self) -> bool
Returns true if this instruction may suspend execution.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for InstData
impl RefUnwindSafe for InstData
impl Send for InstData
impl Sync for InstData
impl Unpin for InstData
impl UnsafeUnpin for InstData
impl UnwindSafe for InstData
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§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,
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 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,
§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> 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.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 20 bytes