From 5657303e97764cad59cdc7b641c942f4eba9eeba Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 30 May 2020 22:03:18 +0800 Subject: [PATCH] add test.ts --- deno_test_wasm/test.ts | 30 +++++++++++++++++++++++++++++ deno_test_wasm/test_wasm/build.sh | 1 + deno_test_wasm/test_wasm/src/lib.rs | 1 + 3 files changed, 32 insertions(+) create mode 100644 deno_test_wasm/test.ts create mode 100644 deno_test_wasm/test_wasm/build.sh diff --git a/deno_test_wasm/test.ts b/deno_test_wasm/test.ts new file mode 100644 index 0000000..542bdea --- /dev/null +++ b/deno_test_wasm/test.ts @@ -0,0 +1,30 @@ +const wasmCode = await Deno.readFile("./test_wasm/target/wasm32-unknown-unknown/debug/test_wasm.wasm"); +const wasmModule = new WebAssembly.Module(wasmCode); +const wasmInstance = new WebAssembly.Instance(wasmModule); + +const linearMemory = wasmInstance.exports.memory; + +function writeString() { + let s = "hello world !"; + let encoded = new TextEncoder().encode(s); + let ptr = wasmInstance.exports.malloc(encoded.length); + const mem = new Uint8Array(linearMemory.buffer, ptr); + for (let i = 0; i < encoded.length; i++) { + mem[i] = encoded[i]; + } + return ptr; +} + +// from https://tilman.xyz/blog/2019/12/building-webassembly-for-deno/ +function readString(memory, ptr) { + const mem = new Uint8Array(memory.buffer, ptr); + let length; + for (length = 0; mem[length] !== 0; length ++); + return new TextDecoder("utf-8").decode(new Uint8Array(mem.buffer, ptr, length)); +} + +let ptr = writeString(); +console.log("DECODED:\n" + readString(linearMemory, ptr) + " @" + ptr); + +let ptr2 = wasmInstance.exports.to_uppercase(ptr); +console.log("DECODED:\n" + readString(linearMemory, ptr2) + " @" + ptr2); diff --git a/deno_test_wasm/test_wasm/build.sh b/deno_test_wasm/test_wasm/build.sh new file mode 100644 index 0000000..b878198 --- /dev/null +++ b/deno_test_wasm/test_wasm/build.sh @@ -0,0 +1 @@ +cargo build --target wasm32-unknown-unknown diff --git a/deno_test_wasm/test_wasm/src/lib.rs b/deno_test_wasm/test_wasm/src/lib.rs index 74ef50e..4532acb 100644 --- a/deno_test_wasm/test_wasm/src/lib.rs +++ b/deno_test_wasm/test_wasm/src/lib.rs @@ -7,6 +7,7 @@ pub extern "C" fn malloc(len: usize) -> *mut c_char { s.into_raw() } +#[no_mangle] pub extern "C" fn to_uppercase(ptr: *mut c_char) -> *mut c_char { let s = unsafe { CString::from_raw(ptr) }; let s2 = CString::new(s.to_string_lossy().to_uppercase()).unwrap();