pub(super) struct VStack<T> {
base_offset: i32,
top_offset: i32,
slots: Vec<Option<VSlot<T>>>,
}Expand description
A section-local virtual stack indexed by section-relative offsets.
Offsets are relative to section_start_sp:
- Negative offsets (
-inputs .. 0) represent values that existed on the stack before the section started (the section’s inputs). - Non-negative offsets represent values pushed within the section.
Fields§
§base_offset: i32Lowest tracked offset (inclusive), relative to section_start_sp.
top_offset: i32One-past-top offset, relative to section_start_sp.
Equivalent to section_len_offset + len_offset in FunctionCx.
slots: Vec<Option<VSlot<T>>>Slot states, indexed by (offset - base_offset).
Implementations§
Source§impl<T: Copy> VStack<T>
impl<T: Copy> VStack<T>
Sourcepub(super) fn reset(&mut self, inputs: usize, max_growth: usize)
pub(super) fn reset(&mut self, inputs: usize, max_growth: usize)
Resets the virtual stack for a new section.
inputs is the number of stack values consumed by the section (the section’s
minimum required stack depth). max_growth is the maximum number of slots the
section pushes beyond the entry height.
All input slots start as VSlot::Materialized because they were written by
the previous section (or the function entry) and are already in memory.
Sourcepub(super) fn top_offset(&self) -> i32
pub(super) fn top_offset(&self) -> i32
Returns the current top offset (one-past-top, relative to section start).
Sourcepub(super) fn offset_at_depth(&self, depth: usize) -> i32
pub(super) fn offset_at_depth(&self, depth: usize) -> i32
Returns the section-relative offset for a given operand depth (0 = TOS, 1 = second from top, etc.).
fn idx(&self, offset: i32) -> usize
Sourcepub(super) fn get(&self, depth: usize) -> VSlot<T>
pub(super) fn get(&self, depth: usize) -> VSlot<T>
Returns the slot state at the given operand depth.
Sourcepub(super) fn get_at_offset(&self, offset: i32) -> VSlot<T>
pub(super) fn get_at_offset(&self, offset: i32) -> VSlot<T>
Returns the slot state at the given section-relative offset.
Returns VSlot::Materialized if the offset is outside the tracked range.
Sourcepub(super) fn set(&mut self, depth: usize, value: T)
pub(super) fn set(&mut self, depth: usize, value: T)
Sets a slot to virtual at the given operand depth.
Sourcepub(super) fn set_at_offset(&mut self, offset: i32, value: T)
pub(super) fn set_at_offset(&mut self, offset: i32, value: T)
Sets a slot to virtual at a section-relative offset.
Sourcepub(super) fn push_mem(&mut self)
pub(super) fn push_mem(&mut self)
Pushes a materialized marker onto the top of the stack. Used when a builtin writes directly to the physical stack slot.
Sourcepub(super) fn live_range(&self) -> Range<i32>
pub(super) fn live_range(&self) -> Range<i32>
Returns the live range of offsets (base_offset..top_offset).
Sourcepub(super) fn virtual_count(&self) -> usize
pub(super) fn virtual_count(&self) -> usize
Returns the number of virtual (non-materialized) slots in the live range.
Sourcepub(super) fn pending_stores(
&self,
range: Range<i32>,
) -> impl Iterator<Item = (i32, T)> + '_
pub(super) fn pending_stores( &self, range: Range<i32>, ) -> impl Iterator<Item = (i32, T)> + '_
Returns pending virtual slots that need physical stores in the given range,
yielding (offset, value) pairs.
Offsets outside the tracked range are silently skipped (they are already materialized by the previous section or not yet live).
Sourcepub(super) fn mark_materialized_range(&mut self, range: Range<i32>)
pub(super) fn mark_materialized_range(&mut self, range: Range<i32>)
Marks all slots in the given range as materialized.
Offsets outside the tracked range are silently skipped.
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for VStack<T>
impl<T> RefUnwindSafe for VStack<T>where
T: RefUnwindSafe,
impl<T> Send for VStack<T>where
T: Send,
impl<T> Sync for VStack<T>where
T: Sync,
impl<T> Unpin for VStack<T>where
T: Unpin,
impl<T> UnsafeUnpin for VStack<T>
impl<T> UnwindSafe for VStack<T>where
T: 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
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: 32 bytes