Don't require Store in Instance constructor (#810)

* Don't require `Store` in `Instance` constructor

This can be inferred from the `Module` argument. Additionally add a
`store` accessor to an `Instance` in case it's needed to instantiate
another `Module`.

cc #708

* Update more constructors

* Fix a doctest

* Don't ignore store in `wasm_instance_new`

* Run rustfmt
This commit is contained in:
Alex Crichton
2020-01-13 17:50:57 -06:00
committed by GitHub
parent f592811c9a
commit 420dcd76fd
19 changed files with 56 additions and 28 deletions

View File

@@ -686,7 +686,6 @@ pub unsafe extern "C" fn wasm_instance_new(
imports: *const *const wasm_extern_t,
result: *mut *mut wasm_trap_t,
) -> *mut wasm_instance_t {
let store = &(*store).store.borrow();
let mut externs: Vec<Extern> = Vec::with_capacity((*module).imports.len());
for i in 0..(*module).imports.len() {
let import = *imports.add(i);
@@ -697,8 +696,21 @@ pub unsafe extern "C" fn wasm_instance_new(
ExternHost::Memory(e) => Extern::Memory(e.borrow().clone()),
});
}
let store = &(*store).store.borrow();
let module = &(*module).module.borrow();
match Instance::new(store, module, &externs) {
// FIXME(WebAssembly/wasm-c-api#126) what else can we do with the `store`
// argument?
if !Store::ptr_eq(&store, module.store()) {
if !result.is_null() {
let trap = Trap::new("wasm_store_t must match store in wasm_module_t");
let trap = Box::new(wasm_trap_t {
trap: HostRef::new(trap),
});
(*result) = Box::into_raw(trap);
}
return ptr::null_mut();
}
match Instance::new(module, &externs) {
Ok(instance) => {
let instance = Box::new(wasm_instance_t {
instance: HostRef::new(instance),