2018-01-17 15:32:33 +00:00
|
|
|
use parity_wasm::elements::BlockType;
|
|
|
|
|
|
|
|
pub mod stack;
|
|
|
|
|
|
|
|
/// Index of default linear memory.
|
|
|
|
pub const DEFAULT_MEMORY_INDEX: u32 = 0;
|
|
|
|
/// Index of default table.
|
|
|
|
pub const DEFAULT_TABLE_INDEX: u32 = 0;
|
|
|
|
|
|
|
|
/// Control stack frame.
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub struct BlockFrame {
|
|
|
|
/// Frame type.
|
|
|
|
pub frame_type: BlockFrameType,
|
|
|
|
/// A signature, which is a block signature type indicating the number and types of result values of the region.
|
|
|
|
pub block_type: BlockType,
|
|
|
|
/// A label for reference to block instruction.
|
|
|
|
pub begin_position: usize,
|
|
|
|
/// A label for reference from branch instructions.
|
|
|
|
pub branch_position: usize,
|
|
|
|
/// A label for reference from end instructions.
|
|
|
|
pub end_position: usize,
|
|
|
|
/// A limit integer value, which is an index into the value stack indicating where to reset it to on a branch to that label.
|
|
|
|
pub value_stack_len: usize,
|
2018-02-08 14:52:16 +00:00
|
|
|
/// Boolean which signals whether value stack became polymorphic. Value stack starts in non-polymorphic state and
|
|
|
|
/// becomes polymorphic only after an instruction that never passes control further is executed,
|
|
|
|
/// i.e. `unreachable`, `br` (but not `br_if`!), etc.
|
|
|
|
pub polymorphic_stack: bool,
|
2018-01-17 15:32:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Type of block frame.
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
|
|
pub enum BlockFrameType {
|
|
|
|
/// Function frame.
|
|
|
|
Function,
|
|
|
|
/// Usual block frame.
|
|
|
|
Block,
|
|
|
|
/// Loop frame (branching to the beginning of block).
|
|
|
|
Loop,
|
|
|
|
/// True-subblock of if expression.
|
|
|
|
IfTrue,
|
|
|
|
/// False-subblock of if expression.
|
|
|
|
IfFalse,
|
|
|
|
}
|