summaryrefslogtreecommitdiff
path: root/examples/rust
diff options
context:
space:
mode:
Diffstat (limited to 'examples/rust')
-rw-r--r--examples/rust/Cargo.toml4
-rwxr-xr-xexamples/rust/build.sh4
-rw-r--r--examples/rust/src/hello.rs30
-rw-r--r--examples/rust/src/print.rs18
-rw-r--r--examples/rust/src/tinywasm.rs2
5 files changed, 45 insertions, 13 deletions
diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml
index d557392..837f7f3 100644
--- a/examples/rust/Cargo.toml
+++ b/examples/rust/Cargo.toml
@@ -17,6 +17,10 @@ name="hello"
path="src/hello.rs"
[[bin]]
+name="print"
+path="src/print.rs"
+
+[[bin]]
name="tinywasm"
path="src/tinywasm.rs"
diff --git a/examples/rust/build.sh b/examples/rust/build.sh
index a8c587a..a13357d 100755
--- a/examples/rust/build.sh
+++ b/examples/rust/build.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
cd "$(dirname "$0")"
-bins=("hello" "tinywasm" "fibonacci")
+bins=("hello" "fibonacci" "print" "tinywasm")
exclude_wat=("tinywasm")
out_dir="./target/wasm32-unknown-unknown/wasm"
dest_dir="out"
@@ -10,7 +10,7 @@ dest_dir="out"
mkdir -p "$dest_dir"
for bin in "${bins[@]}"; do
- cargo build --target wasm32-unknown-unknown --package rust-wasm-examples --profile=wasm --bin "$bin"
+ RUSTFLAGS="-C target-feature=+reference-types -C panic=abort" cargo build --target wasm32-unknown-unknown --package rust-wasm-examples --profile=wasm --bin "$bin"
cp "$out_dir/$bin.wasm" "$dest_dir/"
wasm-opt "$dest_dir/$bin.wasm" -o "$dest_dir/$bin.wasm" -O --intrinsic-lowering -O
diff --git a/examples/rust/src/hello.rs b/examples/rust/src/hello.rs
index 34f3c7f..6bb6d97 100644
--- a/examples/rust/src/hello.rs
+++ b/examples/rust/src/hello.rs
@@ -1,18 +1,28 @@
-#![no_std]
#![no_main]
-#[cfg(not(test))]
-#[panic_handler]
-fn panic(_info: &core::panic::PanicInfo) -> ! {
- core::arch::wasm32::unreachable()
-}
-
#[link(wasm_import_module = "env")]
extern "C" {
- fn printi32(x: i32);
+ fn print_utf8(location: i32, len: i32);
+}
+
+const ARG: &[u8] = &[0u8; 100];
+
+#[no_mangle]
+pub unsafe extern "C" fn arg_ptr() -> i32 {
+ ARG.as_ptr() as i32
}
#[no_mangle]
-pub unsafe extern "C" fn add_and_print(lh: i32, rh: i32) {
- printi32(lh + rh);
+pub unsafe extern "C" fn arg_size() -> i32 {
+ ARG.len() as i32
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn hello(len: i32) {
+ let arg = core::str::from_utf8(&ARG[0..len as usize]).unwrap();
+ let res = format!("Hello, {}!", arg).as_bytes().to_vec();
+
+ let len = res.len() as i32;
+ let ptr = res.leak().as_ptr() as i32;
+ print_utf8(ptr, len);
}
diff --git a/examples/rust/src/print.rs b/examples/rust/src/print.rs
new file mode 100644
index 0000000..34f3c7f
--- /dev/null
+++ b/examples/rust/src/print.rs
@@ -0,0 +1,18 @@
+#![no_std]
+#![no_main]
+
+#[cfg(not(test))]
+#[panic_handler]
+fn panic(_info: &core::panic::PanicInfo) -> ! {
+ core::arch::wasm32::unreachable()
+}
+
+#[link(wasm_import_module = "env")]
+extern "C" {
+ fn printi32(x: i32);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn add_and_print(lh: i32, rh: i32) {
+ printi32(lh + rh);
+}
diff --git a/examples/rust/src/tinywasm.rs b/examples/rust/src/tinywasm.rs
index 0fb9261..08c8135 100644
--- a/examples/rust/src/tinywasm.rs
+++ b/examples/rust/src/tinywasm.rs
@@ -12,7 +12,7 @@ pub extern "C" fn hello() {
}
fn run() -> tinywasm::Result<()> {
- let module = tinywasm::Module::parse_bytes(include_bytes!("../out/hello.wasm"))?;
+ let module = tinywasm::Module::parse_bytes(include_bytes!("../out/print.wasm"))?;
let mut store = tinywasm::Store::default();
let mut imports = tinywasm::Imports::new();