1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#![deny(unsafe_code)]

extern crate wain_ast;

mod globals;
mod import;
mod machine;
mod memory;
mod stack;
mod table;
mod trap;
mod value;

pub use import::{DefaultImporter, ImportError, Importer};
pub use machine::{Machine, Run};
pub use memory::Memory;
pub use stack::Stack;

use trap::Result;
use wain_ast::Module;

/// A convenient function to execute a WebAssembly module.
///
/// This function takes parsed and validated WebAssembly module and executes it until the end.
///
/// For standard I/O speed, this function buffers io::Stdin and io::Stdout objects because currently
/// getchar() and putchar() don't buffer its input/output. This behavior may change in the future.
///
/// If the behavior is not acceptable, please make an abstract machine instance with
/// Machine::instantiate and execute by Machine::execute method.
///
/// You will need importer for initializing Machine struct. Please use DefaultImporter::with_stdio()
/// or make your own importer struct which implements Importer trait.
pub fn execute(module: Module<'_>) -> Result<Run> {
    let importer = DefaultImporter::default();
    let mut machine = Machine::instantiate(&module, importer)?;
    machine.execute()
}