pub enum ControlStackFrame {
If {
destination: Block,
else_data: ElseData,
num_param_values: usize,
num_return_values: usize,
original_stack_size: usize,
exit_is_branched_to: bool,
blocktype: BlockType,
head_is_reachable: bool,
consequent_ends_reachable: Option<bool>,
},
Block {
destination: Block,
num_param_values: usize,
num_return_values: usize,
original_stack_size: usize,
exit_is_branched_to: bool,
try_table_info: Option<(HandlerStateCheckpoint, Vec<Block>)>,
},
Loop {
destination: Block,
header: Block,
num_param_values: usize,
num_return_values: usize,
original_stack_size: usize,
},
}Expand description
A control stack frame can be an if, a block or a loop, each one having the following
fields:
destination: reference to theBlockthat will hold the code after the control block;num_return_values: number of values returned by the control block;original_stack_size: size of the value stack at the beginning of the control block.
Moreover, the if frame has the branch_inst field that points to the brz instruction
separating the true and false branch. The loop frame has a header field that references
the Block that contains the beginning of the body of the loop.
Variants§
If
Fields
destination: Blockblocktype: BlockTypeconsequent_ends_reachable: Option<bool>What was the reachability at the end of the consequent?
This is None until we’re finished translating the consequent, and
is set to Some either by hitting an else when we will begin
translating the alternative, or by hitting an end in which case
there is no alternative.
Block
Fields
destination: Blocktry_table_info: Option<(HandlerStateCheckpoint, Vec<Block>)>When this block corresponds to a try-table, keep the handler state checkpoint and the list of catch blocks to seal once the scope ends.
Loop
Implementations§
Source§impl ControlStackFrame
Helper methods for the control stack objects.
impl ControlStackFrame
Helper methods for the control stack objects.
pub fn num_return_values(&self) -> usize
pub fn num_param_values(&self) -> usize
pub fn following_code(&self) -> Block
pub fn br_destination(&self) -> Block
Sourcefn original_stack_size(&self) -> usize
fn original_stack_size(&self) -> usize
Private helper. Use truncate_value_stack_to_else_params() or
truncate_value_stack_to_original_size() to restore value-stack state.
pub fn is_loop(&self) -> bool
pub fn exit_is_branched_to(&self) -> bool
pub fn set_branched_to_exit(&mut self)
Sourcepub fn truncate_value_stack_to_else_params(&self, stack: &mut Vec<Value>)
pub fn truncate_value_stack_to_else_params(&self, stack: &mut Vec<Value>)
Pop values from the value stack so that it is left at the input-parameters to an else-block.
Sourcepub fn truncate_value_stack_to_original_size(&self, stack: &mut Vec<Value>)
pub fn truncate_value_stack_to_original_size(&self, stack: &mut Vec<Value>)
Pop values from the value stack so that it is left at the state it was before this control-flow frame.
Sourcepub fn restore_catch_handlers(
&self,
handlers: &mut HandlerState,
builder: &mut FunctionBuilder<'_>,
)
pub fn restore_catch_handlers( &self, handlers: &mut HandlerState, builder: &mut FunctionBuilder<'_>, )
Restore exception handler state and seal catch blocks when exiting a try-table scope.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ControlStackFrame
impl RefUnwindSafe for ControlStackFrame
impl Send for ControlStackFrame
impl Sync for ControlStackFrame
impl Unpin for ControlStackFrame
impl UnwindSafe for ControlStackFrame
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> 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