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,
},
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 theBlock
that 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: Block
blocktype: BlockType
consequent_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: Block
Loop
Implementations§
source§impl ControlStackFrame
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.
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