pub struct FuncTranslationState {
    pub(crate) stack: Vec<Value>,
    pub(crate) control_stack: Vec<ControlStackFrame>,
    pub(crate) reachable: bool,
    globals: HashMap<GlobalIndex, GlobalVariable>,
    heaps: HashMap<MemoryIndex, Heap>,
    signatures: HashMap<SignatureIndex, (SigRef, usize)>,
    functions: HashMap<FunctionIndex, (FuncRef, usize)>,
}
Expand description

Contains information passed along during a function’s translation and that records:

  • The current value and control stacks.
  • The depth of the two unreachable control blocks stacks, that are manipulated when translating unreachable code;

Fields§

§stack: Vec<Value>

A stack of values corresponding to the active values in the input wasm function at this point.

§control_stack: Vec<ControlStackFrame>

A stack of active control flow operations at this point in the input wasm function.

§reachable: bool

Is the current translation state still reachable? This is false when translating operators like End, Return, or Unreachable.

§globals: HashMap<GlobalIndex, GlobalVariable>§heaps: HashMap<MemoryIndex, Heap>§signatures: HashMap<SignatureIndex, (SigRef, usize)>§functions: HashMap<FunctionIndex, (FuncRef, usize)>

Implementations§

source§

impl FuncTranslationState

source

pub fn reachable(&self) -> bool

True if the current translation state expresses reachable code, false if it is unreachable.

source§

impl FuncTranslationState

source

pub(crate) fn new() -> Self

Construct a new, empty, FuncTranslationState

source

fn clear(&mut self)

source

pub(crate) fn initialize(&mut self, sig: &Signature, exit_block: Block)

Initialize the state for compiling a function with the given signature.

This resets the state to containing only a single block representing the whole function. The exit block is the last block in the function which will contain the return instruction.

source

pub(crate) fn push1(&mut self, val: Value)

Push a value.

source

pub(crate) fn pushn(&mut self, vals: &[Value])

Push multiple values.

source

pub(crate) fn pop1(&mut self) -> Value

Pop one value.

source

pub(crate) fn peek1(&self) -> Value

Peek at the top of the stack without popping it.

source

pub(crate) fn pop2(&mut self) -> (Value, Value)

Pop two values. Return them in the order they were pushed.

source

pub(crate) fn pop3(&mut self) -> (Value, Value, Value)

Pop three values. Return them in the order they were pushed.

source

fn ensure_length_is_at_least(&self, n: usize)

Helper to ensure the stack size is at least as big as n; note that due to debug_assert this will not execute in non-optimized builds.

source

pub(crate) fn popn(&mut self, n: usize)

Pop the top n values on the stack.

The popped values are not returned. Use peekn to look at them before popping.

source

pub(crate) fn peekn(&self, n: usize) -> &[Value]

Peek at the top n values on the stack in the order they were pushed.

source

pub(crate) fn peekn_mut(&mut self, n: usize) -> &mut [Value]

Peek at the top n values on the stack in the order they were pushed.

source

pub(crate) fn push_block( &mut self, following_code: Block, num_param_types: usize, num_result_types: usize, )

Push a block on the control stack.

source

pub(crate) fn push_loop( &mut self, header: Block, following_code: Block, num_param_types: usize, num_result_types: usize, )

Push a loop on the control stack.

source

pub(crate) fn push_if( &mut self, destination: Block, else_data: ElseData, num_param_types: usize, num_result_types: usize, blocktype: BlockType, )

Push an if on the control stack.

source§

impl FuncTranslationState

Methods for handling entity references.

source

pub(crate) fn get_global<FE: FuncEnvironment + ?Sized>( &mut self, func: &mut Function, index: u32, environ: &mut FE, ) -> WasmResult<GlobalVariable>

Get the GlobalVariable reference that should be used to access the global variable index. Create the reference if necessary. Also return the WebAssembly type of the global.

source

pub(crate) fn get_heap<FE: FuncEnvironment + ?Sized>( &mut self, func: &mut Function, index: u32, environ: &mut FE, ) -> WasmResult<Heap>

Get the Heap reference that should be used to access linear memory index. Create the reference if necessary.

source

pub(crate) fn get_indirect_sig<FE: FuncEnvironment + ?Sized>( &mut self, func: &mut Function, index: u32, environ: &mut FE, ) -> WasmResult<(SigRef, usize)>

Get the SigRef reference that should be used to make an indirect call with signature index. Also return the number of WebAssembly arguments in the signature.

Create the signature if necessary.

source

pub(crate) fn get_direct_func<FE: FuncEnvironment + ?Sized>( &mut self, func: &mut Function, index: u32, environ: &mut FE, ) -> WasmResult<(FuncRef, usize)>

Get the FuncRef reference that should be used to make a direct call to function index. Also return the number of WebAssembly arguments in the signature.

Create the function reference if necessary.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcastable for T
where T: Any + Send + Sync + 'static,

§

fn upcast_any_ref(&self) -> &(dyn Any + 'static)

upcast ref
§

fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)

upcast mut ref
§

fn upcast_any_box(self: Box<T>) -> Box<dyn Any>

upcast boxed dyn
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more