* Document and update the API of the `externals.rs` module This commit ensures that all public methods and items are documented in the `externals.rs` module, notably all external values that can be imported and exported in WebAssembly. Along the way this also tidies up the API and fixes a few bugs: * `Global::new` now returns a `Result` and fails if the provided value does not match the type of the global. * `Global::set` now returns a `Result` and fails if the global is either immutable or the provided value doesn't match the type of the global. * `Table::new` now fails if the provided initializer does not match the element type. * `Table::get` now returns `Option<Val>` instead of implicitly returning null. * `Table::set` now returns `Result<()>`, returning an error on out of bounds or if the input type is of the wrong type. * `Table::grow` now returns `Result<u32>`, returning the previous number of table elements if succesful or an error if the maximum is reached or the initializer value is of the wrong type. Additionally a bug was fixed here where if the wrong initializer was provided the table would be grown still, but initialization would fail. * `Memory::data` was renamed to `Memory::data_unchecked_mut`. Additionally `Memory::data_unchecked` was added. Lots of caveats were written down about how using the method can go wrong. * `Memory::grow` now returns `Result<u32>`, returning an error if growth fails or the number of pages previous the growth if successful. * Run rustfmt * Fix another test * Update crates/api/src/externals.rs Co-Authored-By: Sergei Pepyakin <s.pepyakin@gmail.com> Co-authored-by: Sergei Pepyakin <s.pepyakin@gmail.com>
35 lines
840 B
Rust
35 lines
840 B
Rust
use anyhow::{Context as _, Result};
|
|
use wasmtime::*;
|
|
|
|
#[test]
|
|
fn test_invoke_func_via_table() -> Result<()> {
|
|
let store = Store::default();
|
|
|
|
let binary = wat::parse_str(
|
|
r#"
|
|
(module
|
|
(func $f (result i64) (i64.const 42))
|
|
|
|
(table (export "table") 1 1 anyfunc)
|
|
(elem (i32.const 0) $f)
|
|
)
|
|
"#,
|
|
)?;
|
|
let module = Module::new(&store, &binary).context("> Error compiling module!")?;
|
|
let instance = Instance::new(&module, &[]).context("> Error instantiating module!")?;
|
|
|
|
let f = instance
|
|
.get_export("table")
|
|
.unwrap()
|
|
.table()
|
|
.unwrap()
|
|
.get(0)
|
|
.unwrap()
|
|
.funcref()
|
|
.unwrap()
|
|
.clone();
|
|
let result = f.call(&[]).unwrap();
|
|
assert_eq!(result[0].unwrap_i64(), 42);
|
|
Ok(())
|
|
}
|