* 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>
30 lines
999 B
Rust
30 lines
999 B
Rust
use super::create_handle::create_handle;
|
|
use crate::{TableType, ValType};
|
|
use anyhow::{bail, Result};
|
|
use wasmtime_environ::entity::PrimaryMap;
|
|
use wasmtime_environ::{wasm, Module};
|
|
use wasmtime_runtime::InstanceHandle;
|
|
|
|
pub fn create_handle_with_table(table: &TableType) -> Result<InstanceHandle> {
|
|
let mut module = Module::new();
|
|
|
|
let table = wasm::Table {
|
|
minimum: table.limits().min(),
|
|
maximum: table.limits().max(),
|
|
ty: match table.element() {
|
|
ValType::FuncRef => wasm::TableElementType::Func,
|
|
_ => bail!("cannot support {:?} as a table element", table.element()),
|
|
},
|
|
};
|
|
let tunable = Default::default();
|
|
|
|
let table_plan = wasmtime_environ::TablePlan::for_table(table, &tunable);
|
|
let table_id = module.table_plans.push(table_plan);
|
|
module.exports.insert(
|
|
"table".to_string(),
|
|
wasmtime_environ::Export::Table(table_id),
|
|
);
|
|
|
|
create_handle(module, None, PrimaryMap::new(), Box::new(()))
|
|
}
|