mirror of
https://github.com/mii443/wasmer.git
synced 2025-08-23 00:45:32 +00:00
65 lines
1.8 KiB
Rust
65 lines
1.8 KiB
Rust
//! WebAssembly is a living standard. Wasmer integrates some
|
|
//! WebAssembly features that aren't yet stable but can still be
|
|
//! turned on. This example explains how.
|
|
//!
|
|
//! You can run the example directly by executing in Wasmer root:
|
|
//!
|
|
//! ```shell
|
|
//! cargo run --example features --release --features "cranelift"
|
|
//! ```
|
|
//!
|
|
//! Ready?
|
|
|
|
use wasmer::{
|
|
imports,
|
|
sys::{EngineBuilder, Features},
|
|
wat2wasm, Instance, Module, Store, Value,
|
|
};
|
|
use wasmer_compiler_cranelift::Cranelift;
|
|
|
|
fn main() -> anyhow::Result<()> {
|
|
// Let's declare the Wasm module with the text representation.
|
|
let wasm_bytes = wat2wasm(
|
|
br#"
|
|
(module
|
|
(type $swap_t (func (param i32 i64) (result i64 i32)))
|
|
(func $swap (type $swap_t) (param $x i32) (param $y i64) (result i64 i32)
|
|
(local.get $y)
|
|
(local.get $x))
|
|
(export "swap" (func $swap)))
|
|
"#,
|
|
)?;
|
|
|
|
// Set up the compiler.
|
|
let compiler = Cranelift::default();
|
|
|
|
// Let's declare the features.
|
|
let mut features = Features::new();
|
|
// Enable the multi-value feature.
|
|
features.multi_value(true);
|
|
|
|
// Set up the engine. That's where we define the features!
|
|
let engine = EngineBuilder::new(compiler).set_features(Some(features));
|
|
|
|
// Now, let's define the store, and compile the module.
|
|
let mut store = Store::new(engine);
|
|
let module = Module::new(&store, wasm_bytes)?;
|
|
|
|
// Finally, let's instantiate the module, and execute something
|
|
// :-).
|
|
let import_object = imports! {};
|
|
let instance = Instance::new(&mut store, &module, &import_object)?;
|
|
let swap = instance.exports.get_function("swap")?;
|
|
|
|
let results = swap.call(&mut store, &[Value::I32(1), Value::I64(2)])?;
|
|
|
|
assert_eq!(results.to_vec(), vec![Value::I64(2), Value::I32(1)]);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_features() -> anyhow::Result<()> {
|
|
main()
|
|
}
|