Update rust embed example (#967) (#968)

* Update rust embed example (#967)

Ensures that the example works with the current API.
Drops mention of HostRef as the example is complete without it.

* Cleanup
This commit is contained in:
Gustav Eiman
2020-02-25 16:45:21 +01:00
committed by GitHub
parent f8abe1169c
commit 09a091802b

View File

@@ -41,9 +41,6 @@ use wasmtime::*;
let store = Store::default(); let store = Store::default();
``` ```
The `HostRef` will be used a lot -- it is a "convenience" object to store and refer an object between the host and
the embedded environments.
The `hello.wasm` can be read from the file system and provided to the `Module` object constructor as `&[u8]`: The `hello.wasm` can be read from the file system and provided to the `Module` object constructor as `&[u8]`:
```rust ```rust
@@ -51,30 +48,28 @@ use std::fs::read;
let hello_wasm = read("hello.wasm").expect("wasm file"); let hello_wasm = read("hello.wasm").expect("wasm file");
let module = HostRef::new(Module::new(&store, &hello_wasm).expect("wasm module")); let module = Module::new(&store, &hello_wasm).expect("wasm module");
``` ```
The module instance can now be created. Normally, you would provide exports, but in this case, there are none required: The module instance can now be created. Normally, you would provide exports, but in this case, there are none required:
```rust ```rust
let instance = Instance::new(&store, &module, &[]).expect("wasm instance"); let instance = Instance::new(&module, &[]).expect("wasm instance");
``` ```
Everything is set. If a WebAssembly module has a start function -- it was run. Everything is set. If a WebAssembly module has a start function -- it was run.
The instance's exports can be used at this point. wasmtime provides functions The instance's exports can be used at this point. wasmtime provides functions
to look up an export by name, and ensure that it's a function: to get an export by name, and ensure that it's a function:
```rust ```rust
let answer = instance.find_export_by_name("answer").expect("answer").func().expect("function"); let answer = instance.get_export("answer").expect("answer").func().expect("function");
``` ```
The exported function can be called using the `call` method. Remember that in most of the cases, The exported function can be called using the `call` method. The exported "answer" function accepts no parameters and returns a single `i32` value.
a `HostRef<_>` object will be returned, so `borrow()` or `borrow_mut()` method has to be used to refer the
specific object. The exported "answer" function accepts no parameters and returns a single `i32` value.
```rust ```rust
let result = answer.borrow().call(&[]).expect("success"); let result = answer.call(&[]).expect("success");
println!("Answer: {}", result[0].i32()); println!("Answer: {:?}", result[0].i32());
``` ```
The names of the WebAssembly module's imports and exports can be discovered by means of module's corresponding methods. The names of the WebAssembly module's imports and exports can be discovered by means of module's corresponding methods.
@@ -90,11 +85,11 @@ fn main() {
let wasm = read("hello.wasm").expect("wasm file"); let wasm = read("hello.wasm").expect("wasm file");
let module = HostRef::new(Module::new(&store, &wasm).expect("wasm module")); let module = Module::new(&store, &wasm).expect("wasm module");
let instance = Instance::new(&store, &module, &[]).expect("wasm instance"); let instance = Instance::new(&module, &[]).expect("wasm instance");
let answer = instance.find_export_by_name("answer").expect("answer").func().expect("function"); let answer = instance.get_export("answer").expect("answer").func().expect("function");
let result = answer.borrow().call(&[]).expect("success"); let result = answer.call(&[]).expect("success");
println!("Answer: {}", result[0].i32()); println!("Answer: {:?}", result[0].i32());
} }
``` ```