Awesome
Rust-WASM
A WASM interpreter written in Rust.
Except for parsing the text format, the implementation is complete, i.e., all the specification is implemented and the official test suite is fully covered (as of 2019-10-27).
Getting Started
The project is composed of a library (rust_wasm
) as well as a test suite.
Prerequisites
You need Rust (at least 1.34.0) to build the project.
Building the library
cargo build [--release]
Running the tests
cargo test
Using the API
The official embedding API is supported. Because the API specification is written in a pure style, we slightly modified it to best fit Rust (e.g., using mutable reference instead of returning a new store each time).
Invoking the main
function
use rust_wasm::*;
use std::fs::File;
use std::io::BufReader;
fn main() {
let mut store = init_store();
let f = File::open("filename").unwrap();
let module = decode_module(BufReader::new(f)).unwrap();
let module_instance = instantiate_module(&mut store, module, &[]).unwrap();
if let ExternVal::Func(main_addr) = get_export(&module_instance, "main").unwrap() {
let res = invoke_func(&mut store, main_addr, Vec::new());
println!("{:?}", res);
}
}
Listing module exports/imports
use rust_wasm::*;
use std::fs::File;
use std::io::BufReader;
fn main() {
let f = File::open("filename").unwrap();
let module = decode_module(BufReader::new(f)).unwrap();
let mod_exports = module_exports(&module);
let mod_imports = module_imports(&module);
}
Declaring a host function
use rust_wasm::*;
fn main() {
let mut store = init_store();
let func_type = types::Func { args: vec![types::I32, types::F64], result: vec![types::I64] };
let print_count_args = |args: &[values::Value], ret: &mut[values::Value]| {
println!("{:?}", args);
ret[0] = values::Value::I64(args.len() as u64);
None
};
let func_addr = alloc_func(&mut store, &func_type, Box::new(print_count_args));
}
Managing imports resolution when instantiating multiple modules
This is left to the embedder. Nonetheless, you can see a working example inside tests/scripts/run.rs
.