waffle

Struct Module

Source
pub struct Module<'a> {
    pub orig_bytes: Option<&'a [u8]>,
    pub funcs: EntityVec<Func, FuncDecl<'a>>,
    pub signatures: EntityVec<Signature, SignatureData>,
    pub globals: EntityVec<Global, GlobalData>,
    pub tables: EntityVec<Table, TableData>,
    pub imports: Vec<Import>,
    pub exports: Vec<Export>,
    pub memories: EntityVec<Memory, MemoryData>,
    pub start_func: Option<Func>,
    pub debug: Debug,
    pub debug_map: DebugMap,
    pub custom_sections: BTreeMap<String, Vec<u8>>,
}

Fields§

§orig_bytes: Option<&'a [u8]>

The original Wasm module this module was parsed from, if any. Used only for “lazy function bodies”, which retain a range that can refer into this slice.

§funcs: EntityVec<Func, FuncDecl<'a>>

The functions in this module: imports, un-expanded (“lazily parsed”) functions, functions as IR, or IR compiled into new bytecode.

§signatures: EntityVec<Signature, SignatureData>

Type signatures, referred to by funcs, imports and exports.

§globals: EntityVec<Global, GlobalData>

Global variables in this module.

§tables: EntityVec<Table, TableData>

Tables in this module.

§imports: Vec<Import>

Imports into this module. Function imports must also have an entry at the appropriate function index in funcs.

§exports: Vec<Export>

Exports from this module.

§memories: EntityVec<Memory, MemoryData>

Memories/heapds that this module contains.

§start_func: Option<Func>

The “start function” invoked at instantiation, if any.

§debug: Debug

Debug-info associated with function bodies: interning pools for source file names and locations in those files.

§debug_map: DebugMap

Maps from original Wasm bytecode offsets to source locations.

§custom_sections: BTreeMap<String, Vec<u8>>

Implementations§

Source§

impl<'a> Module<'a>

Source

pub fn empty() -> Module<'static>

Source

pub fn from_wasm_bytes( bytes: &'a [u8], options: &FrontendOptions, ) -> Result<Self>

Parse a WebAssembly module, as a slice of bytes in memory, into a waffle Module ready to be manipulated and recompile.

Source

pub fn without_orig_bytes(self) -> Module<'static>

Take this module and strip its reference to the original bytes, producing a module with the same logical contents.

Note that this has a few side-effects:

  • Any (non-debug) custom sections are lost; i.e., they will not be roundtripped from the original Wasm module.
  • All function bodies are expanded to IR so they can be recompiled into new bytecode. The bytecode should be equivalent, but will not literally be the same bytecode as the original module.
Source§

impl<'a> Module<'a>

Source

pub fn to_wasm_bytes(&self) -> Result<Vec<u8>>

Source

pub fn to_encoded_module(&self) -> Result<Module>

Source

pub fn per_func_body<F: Fn(&mut FunctionBody)>(&mut self, f: F)

Source

pub fn take_per_func_body<F: FnMut(&mut Self, &mut FunctionBody)>( &mut self, f: F, )

Source

pub fn try_per_func_body<F: FnMut(&mut FunctionBody) -> Result<(), E>, E>( &mut self, f: F, ) -> Result<(), E>

Source

pub fn try_take_per_func_body<F: FnMut(&mut Self, &mut FunctionBody) -> Result<(), E>, E>( &mut self, f: F, ) -> Result<(), E>

Source

pub fn expand_func<'b>(&'b mut self, id: Func) -> Result<&'b mut FuncDecl<'a>>

Expand a function body, parsing its lazy reference to original bytecode into IR if needed.

Source

pub fn clone_and_expand_body(&self, id: Func) -> Result<FunctionBody>

Clone a function body without expanding it, and return a new function body with IR expanded. Useful when a tool appends new functions that are processed versions of an original function (which itself must remain as well).

Source

pub fn expand_all_funcs(&mut self) -> Result<()>

For all functions that are lazy references to initial bytecode, expand them into IR.

Source

pub fn display<'b>(&'b self) -> ModuleDisplay<'b>
where 'b: 'a,

Return a wrapper that implements Display on this module, pretty-printing it as textual IR.

Trait Implementations§

Source§

impl<'a> Clone for Module<'a>

Source§

fn clone(&self) -> Module<'a>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for Module<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Module<'a>

§

impl<'a> RefUnwindSafe for Module<'a>

§

impl<'a> Send for Module<'a>

§

impl<'a> Sync for Module<'a>

§

impl<'a> Unpin for Module<'a>

§

impl<'a> UnwindSafe for Module<'a>

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
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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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
Source§

impl<F, A, B, T> OpValue<F, Either<A, B>> for T
where F: Func, T: OpValue<F, A>, <T as OpValue<F, A>>::Residue: OpValue<F, B>,

Source§

type Residue = <<T as OpValue<F, A>>::Residue as OpValue<F, B>>::Residue

Source§

type Capture = Either<<T as OpValue<F, A>>::Capture, <<T as OpValue<F, A>>::Residue as OpValue<F, B>>::Capture>

Source§

type Spit = Either<<T as OpValue<F, A>>::Spit, <<T as OpValue<F, A>>::Residue as OpValue<F, B>>::Spit>

Source§

fn disasm( self, f: &mut F, ) -> Result<(Either<A, B>, <T as OpValue<F, Either<A, B>>>::Capture, <T as OpValue<F, Either<A, B>>>::Spit), <T as OpValue<F, Either<A, B>>>::Residue>

Source§

fn of( f: &mut F, o: Either<A, B>, c: <T as OpValue<F, Either<A, B>>>::Capture, s: <T as OpValue<F, Either<A, B>>>::Spit, ) -> Option<T>

Source§

fn lift(f: &mut F, r: <T as OpValue<F, Either<A, B>>>::Residue) -> Option<T>

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

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

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

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>,

Source§

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.