mirror of
https://github.com/mii443/wasmer.git
synced 2025-08-23 00:45:32 +00:00
examples:funcref.rs: warning: unused imports: `ExternRef`, `FromToNativeWasmType`, `FunctionType`, `Function`, and `RuntimeError` --> examples/funcref.rs:3:14 examples/memory_grow.rs: warning: unused import: `Pages` --> examples/memory_grow.rs:9:51 warning: unused variable: `result` --> examples/memory_grow.rs:33:9 warning: unused variable: `result` --> examples/memory_grow.rs:36:9 Signed-off-by: Charalampos Mitrodimas <charmitro@posteo.net>
76 lines
2.6 KiB
Rust
76 lines
2.6 KiB
Rust
use std::error::Error;
|
|
use wasmer::{imports, Instance, Module, Store, Table, TableType, Type, Value};
|
|
|
|
fn main() -> Result<(), Box<dyn Error>> {
|
|
// 1) Create a default Wasmer Store.
|
|
let mut store = Store::default();
|
|
|
|
// 2) Our first WAT module ("module A") that exports `add_one`.
|
|
let module_a_wat = r#"(module
|
|
(type $t0 (func (param i32) (result i32)))
|
|
(func $add_one (type $t0) (param $x i32) (result i32)
|
|
local.get $x
|
|
i32.const 1
|
|
i32.add)
|
|
(export "add_one" (func $add_one))
|
|
)"#;
|
|
|
|
// 3) Our second WAT module ("module B") that imports the table and uses `call_ref`.
|
|
let module_b_wat = r#"(module
|
|
(type $t0 (func (param i32) (result i32)))
|
|
(import "env" "table" (table 1 funcref))
|
|
(func $call_func (param i32) (result i32)
|
|
(local.get 0)
|
|
(call_indirect (type $t0)
|
|
(i32.const 0)
|
|
)
|
|
)
|
|
(export "call_func" (func $call_func))
|
|
)"#;
|
|
|
|
// 4) Compile module A.
|
|
let module_a = Module::new(&store, module_a_wat)?;
|
|
// 5) Instantiate module A (no imports needed).
|
|
let instance_a = Instance::new(&mut store, &module_a, &imports! {})?;
|
|
|
|
// 6) Get the exported function `add_one`.
|
|
let add_one_func = instance_a.exports.get_function("add_one")?;
|
|
|
|
// 7) Create a Table for `function`.
|
|
// Initial size = 1, Max size = 1 (optional).
|
|
let table_type = TableType::new(Type::FuncRef, 1, Some(1)); // anyref => ExternRef in Wasmer
|
|
let table = Table::new(&mut store, table_type, Value::FuncRef(None))?;
|
|
|
|
// 8) Place the `add_one_func` into table[0] as an ExternRef.
|
|
// Note: In older Wasmer versions, you might need `Value::FuncRef`.
|
|
// But for the new `anyref`, we store it as `Value::ExternRef(Some(...))`.
|
|
table.set(&mut store, 0, Value::FuncRef(Some(add_one_func.clone())))?;
|
|
|
|
// 9) Compile module B (which imports the table).
|
|
let module_b = Module::new(&store, module_b_wat)?;
|
|
|
|
// 10) Create an ImportObject providing the table to module B.
|
|
let import_object = imports! {
|
|
"env" => {
|
|
"table" => table.clone(),
|
|
}
|
|
};
|
|
|
|
// 11) Instantiate module B with that import.
|
|
let instance_b = Instance::new(&mut store, &module_b, &import_object)?;
|
|
|
|
// 12) Get the exported `call_func` from module B.
|
|
let call_func = instance_b.exports.get_function("call_func")?;
|
|
|
|
// 13) Call `call_func(41)`, which should end up calling `add_one(41)`.
|
|
let results = call_func.call(&mut store, &[Value::I32(41)])?;
|
|
|
|
// 14) Print the result (should be 42).
|
|
println!(
|
|
"Result from module B calling module A's `add_one(41)`: {}",
|
|
results[0].i32().unwrap()
|
|
);
|
|
|
|
Ok(())
|
|
}
|