initial commit

main
_ 2022-09-21 01:12:16 +00:00
commit c6171db924
8 changed files with 1482 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target
/wasm_guest/target

1241
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

9
Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "wasm_test"
version = "0.1.0"
edition = "2021"
license = "Apache-2.0"
[dependencies]
anyhow = "1.0.65"
wasmtime = "1.0.0"

12
README.md Normal file
View File

@ -0,0 +1,12 @@
Example code for passing strings into wasm functions with wasmtime.
```bash
cargo install wasm-pack
cd wasm_guest
wasm-pack build
cd ..
cargo run
```
This repo is Apache-2.0 to match the wasmtime license, unlike my other repos.

31
src/main.rs Normal file
View File

@ -0,0 +1,31 @@
use anyhow::Result;
use wasmtime::*;
fn main() -> Result<()> {
let engine = Engine::default ();
let module = Module::from_file (&engine, "wasm_guest/pkg/wasm_guest_bg.wasm")?;
let linker = Linker::new (&engine);
let mut store = Store::new (&engine, ());
let instance = linker.instantiate (&mut store, &module)?;
{
let malloc = instance.get_typed_func::<(i32), (i32), _> (&mut store, "our_malloc")?;
let parse_string = instance.get_typed_func::<(i32, i32), (f64), _> (&mut store, "parse_string")?;
let memory = instance.get_memory (&mut store, "memory").unwrap ();
let s = "{\"bogus\": 42}";
let ptr = malloc.call (&mut store, (s.len () as i32))?;
dbg! (ptr);
memory.write (&mut store, ptr as usize, s.as_bytes ());
dbg! (parse_string.call (&mut store, (ptr, s.len () as i32))?);
}
Ok(())
}

156
wasm_guest/Cargo.lock generated Normal file
View File

@ -0,0 +1,156 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "bumpalo"
version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "itoa"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
[[package]]
name = "log"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
[[package]]
name = "once_cell"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
[[package]]
name = "proc-macro2"
version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
"proc-macro2",
]
[[package]]
name = "ryu"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
[[package]]
name = "serde"
version = "1.0.144"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
[[package]]
name = "serde_json"
version = "1.0.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "syn"
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52205623b1b0f064a4e71182c3b18ae902267282930c6d5462c91b859668426e"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
[[package]]
name = "wasm-bindgen"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
dependencies = [
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
[[package]]
name = "wasm_guest"
version = "0.1.0"
dependencies = [
"serde_json",
"wasm-bindgen",
]

12
wasm_guest/Cargo.toml Normal file
View File

@ -0,0 +1,12 @@
[package]
name = "wasm_guest"
version = "0.1.0"
edition = "2021"
license = "Apache-2.0"
[lib]
crate-type = ["cdylib"]
[dependencies]
serde_json = "1.0.85"
wasm-bindgen = "0.2.83"

19
wasm_guest/src/lib.rs Normal file
View File

@ -0,0 +1,19 @@
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn our_malloc (len: i32) -> i32 {
let mut v: Vec <u8> = Vec::with_capacity (len as usize);
let ptr = v.as_mut_ptr ();
std::mem::forget (v);
ptr as i32
}
#[wasm_bindgen]
pub fn parse_string (s: &str) -> f64 {
let val: serde_json::Value = serde_json::from_str (s).unwrap ();
let val = val.get ("bogus").unwrap ();
match val {
serde_json::Value::Number (x) => x.as_f64 ().unwrap (),
_ => panic! ("bogus isn't a number"),
}
}