Enum bytecode::stackless_bytecode::Bytecode
source · pub enum Bytecode {
Assign(AttrId, TempIndex, TempIndex, AssignKind),
Call(AttrId, Vec<TempIndex>, Operation, Vec<TempIndex>, Option<AbortAction>),
Ret(AttrId, Vec<TempIndex>),
Load(AttrId, TempIndex, Constant),
Branch(AttrId, Label, Label, TempIndex),
Jump(AttrId, Label),
Label(AttrId, Label),
Abort(AttrId, TempIndex),
Nop(AttrId),
SaveMem(AttrId, MemoryLabel, QualifiedInstId<StructId>),
SaveSpecVar(AttrId, MemoryLabel, QualifiedInstId<SpecVarId>),
Prop(AttrId, PropKind, Exp),
}
Expand description
The stackless bytecode.
Variants§
Assign(AttrId, TempIndex, TempIndex, AssignKind)
Call(AttrId, Vec<TempIndex>, Operation, Vec<TempIndex>, Option<AbortAction>)
Ret(AttrId, Vec<TempIndex>)
Load(AttrId, TempIndex, Constant)
Branch(AttrId, Label, Label, TempIndex)
Jump(AttrId, Label)
Label(AttrId, Label)
Abort(AttrId, TempIndex)
Nop(AttrId)
SaveMem(AttrId, MemoryLabel, QualifiedInstId<StructId>)
SaveSpecVar(AttrId, MemoryLabel, QualifiedInstId<SpecVarId>)
Prop(AttrId, PropKind, Exp)
Implementations§
source§impl Bytecode
impl Bytecode
pub fn get_attr_id(&self) -> AttrId
pub fn is_exit(&self) -> bool
pub fn is_return(&self) -> bool
pub fn is_unconditional_branch(&self) -> bool
pub fn is_conditional_branch(&self) -> bool
pub fn is_branch(&self) -> bool
sourcepub fn branch_dests(&self) -> Vec<Label> ⓘ
pub fn branch_dests(&self) -> Vec<Label> ⓘ
Return the destination(s) if self is a branch/jump instruction
sourcepub fn label_offsets(code: &[Bytecode]) -> BTreeMap<Label, CodeOffset>
pub fn label_offsets(code: &[Bytecode]) -> BTreeMap<Label, CodeOffset>
Returns a mapping from labels to code offsets.
sourcepub fn get_successors(
pc: CodeOffset,
code: &[Bytecode],
label_offsets: &BTreeMap<Label, CodeOffset>
) -> Vec<CodeOffset> ⓘ
pub fn get_successors( pc: CodeOffset, code: &[Bytecode], label_offsets: &BTreeMap<Label, CodeOffset> ) -> Vec<CodeOffset> ⓘ
Return the successor offsets of this instruction. In addition to the code, a map of label to code offset need to be passed in.
sourcepub fn get_exits(code: &[Bytecode]) -> Vec<CodeOffset> ⓘ
pub fn get_exits(code: &[Bytecode]) -> Vec<CodeOffset> ⓘ
Returns the code offsets at which the code exits(aborts or returns).
sourcepub fn remap_all_vars<F>(
self,
func_target: &FunctionTarget<'_>,
f: &mut F
) -> Selfwhere
F: FnMut(TempIndex) -> TempIndex,
pub fn remap_all_vars<F>( self, func_target: &FunctionTarget<'_>, f: &mut F ) -> Selfwhere F: FnMut(TempIndex) -> TempIndex,
Remaps variables in the instruction.
sourcepub fn remap_src_vars<F>(
self,
func_target: &FunctionTarget<'_>,
f: &mut F
) -> Selfwhere
F: FnMut(TempIndex) -> TempIndex,
pub fn remap_src_vars<F>( self, func_target: &FunctionTarget<'_>, f: &mut F ) -> Selfwhere F: FnMut(TempIndex) -> TempIndex,
Remaps variables in source position in the instruction.
pub fn instantiate(&self, env: &GlobalEnv, params: &[Type]) -> Self
sourcepub fn modifies(
&self,
func_target: &FunctionTarget<'_>
) -> (Vec<TempIndex>, Vec<(TempIndex, bool)>)
pub fn modifies( &self, func_target: &FunctionTarget<'_> ) -> (Vec<TempIndex>, Vec<(TempIndex, bool)>)
Return the temporaries this instruction modifies and how the temporaries are modified.
For a temporary with TempIndex $t, if $t is modified by the instruction and
- $t is a value or an immutable reference, it will show up in the first Vec
- $t is a mutable reference and only its value is modified, not the reference itself, it will show up in the second Vec as ($t, false).
- $t is a mutable reference and the reference itself is modified (i.e., the location and path it is pointing to), it will show up in the second Vec as ($t, true).
source§impl Bytecode
impl Bytecode
sourcepub fn display<'env>(
&'env self,
func_target: &'env FunctionTarget<'env>,
label_offsets: &'env BTreeMap<Label, CodeOffset>
) -> BytecodeDisplay<'env>
pub fn display<'env>( &'env self, func_target: &'env FunctionTarget<'env>, label_offsets: &'env BTreeMap<Label, CodeOffset> ) -> BytecodeDisplay<'env>
Creates a format object for a bytecode in context of a function target.
Trait Implementations§
source§impl PartialEq<Bytecode> for Bytecode
impl PartialEq<Bytecode> for Bytecode
impl Eq for Bytecode
impl StructuralEq for Bytecode
impl StructuralPartialEq for Bytecode
Auto Trait Implementations§
impl RefUnwindSafe for Bytecode
impl !Send for Bytecode
impl !Sync for Bytecode
impl Unpin for Bytecode
impl UnwindSafe for Bytecode
Blanket Implementations§
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key
and return true
if they are equal.