summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/test.yaml31
-rw-r--r--crates/parser/src/module.rs4
-rw-r--r--crates/tinywasm/src/func.rs4
-rw-r--r--examples/rust/Cargo.toml11
-rwxr-xr-xexamples/rust/build.sh3
-rw-r--r--examples/rust/src/tinywasm.rs2
-rw-r--r--examples/rust/src/tinywasm_no_std.rs17
-rw-r--r--examples/wasm-rust.rs59
8 files changed, 111 insertions, 20 deletions
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 586e75b..427f7e6 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -5,6 +5,8 @@ on:
branches: ["**"]
pull_request:
branches: ["next", "main"]
+ schedule:
+ - cron: "0 0 * * 0"
jobs:
build-wasm:
@@ -14,8 +16,13 @@ jobs:
- uses: actions/checkout@v4
with:
submodules: true
- - name: Install Rust toolchain & Binaryen
- run: rustup update && rustup target add wasm32-unknown-unknown && sudo apt-get install -y binaryen wabt
+ - name: Install Rust toolchain
+ uses: actions-rust-lang/setup-rust-toolchain@v1
+ with:
+ toolchain: stable
+ target: wasm32-unknown-unknown
+ - name: Install Binaryen and WABT
+ run: sudo apt-get install -y binaryen wabt
- name: Build wasm
run: ./examples/rust/build.sh
- name: Save artifacts
@@ -31,27 +38,31 @@ jobs:
include:
- os: ubuntu-latest
rust: stable
- name: "Linux (stable)"
+ name: "Linux x86 (stable)"
- os: ubuntu-latest
rust: nightly
- name: "Linux (nightly)"
+ name: "Linux x86 (nightly)"
- os: ubuntu-latest
rust: stable
- name: "Linux (stable, no default features)"
+ name: "Linux x86 (stable, no default features)"
args: "--no-default-features"
- os: ubuntu-latest
rust: nightly
- name: "Linux (nightly, no default features)"
+ name: "Linux x86 (nightly, no default features)"
args: "--no-default-features"
- os: macos-14
rust: stable
name: "macOS arm64 (Apple M1)"
- os: ubuntu-latest
rust: stable
- name: "armv7 (32-Bit Raspberry Pi)"
+ name: "Linux arm64"
+ target: aarch64-unknown-linux-gnu
+ - os: ubuntu-latest
+ rust: stable
+ name: "Linux armv7"
target: armv7-unknown-linux-gnueabihf
- name: Run tests on ${{ matrix.os }}, ${{ matrix.name }})
+ name: Run tests on ${{ matrix.name }})
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
@@ -74,11 +85,11 @@ jobs:
path: examples/rust/out
- name: Run tests
- run: cargo test --workspace ${{ matrix.args }} && cargo run --example wasm-rust all
+ run: cargo test --workspace ${{ matrix.args }} && cargo test --workspace ${{ matrix.args }} --examples
if: matrix.target == ''
- name: Run clippy
- run: cargo clippy --workspace --all-targets --all-features
+ run: cargo clippy --workspace ${{ matrix.args }}
if: matrix.target == ''
- name: Run tests (${{ matrix.target }})
diff --git a/crates/parser/src/module.rs b/crates/parser/src/module.rs
index 20ed00d..ff7d109 100644
--- a/crates/parser/src/module.rs
+++ b/crates/parser/src/module.rs
@@ -168,9 +168,9 @@ impl ModuleReader {
validator.end(offset)?;
self.end_reached = true;
}
- CustomSection(reader) => {
+ CustomSection(_reader) => {
debug!("Found custom section");
- debug!("Skipping custom section: {:?}", reader.name());
+ debug!("Skipping custom section: {:?}", _reader.name());
}
UnknownSection { .. } => return Err(ParseError::UnsupportedSection("Unknown section".into())),
section => return Err(ParseError::UnsupportedSection(format!("Unsupported section: {section:?}"))),
diff --git a/crates/tinywasm/src/func.rs b/crates/tinywasm/src/func.rs
index 466dd86..7035109 100644
--- a/crates/tinywasm/src/func.rs
+++ b/crates/tinywasm/src/func.rs
@@ -37,9 +37,9 @@ impl FuncHandle {
}
// 5. For each value type and the corresponding value, check if types match
- if !(func_ty.params.iter().zip(params).enumerate().all(|(i, (ty, param))| {
+ if !(func_ty.params.iter().zip(params).enumerate().all(|(_i, (ty, param))| {
if ty != &param.val_type() {
- log::error!("param type mismatch at index {}: expected {:?}, got {:?}", i, ty, param);
+ log::error!("param type mismatch at index {}: expected {:?}, got {:?}", _i, ty, param);
false
} else {
true
diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml
index f691a1b..5c6b710 100644
--- a/examples/rust/Cargo.toml
+++ b/examples/rust/Cargo.toml
@@ -10,8 +10,13 @@ forced-target="wasm32-unknown-unknown"
edition="2021"
[dependencies]
-tinywasm={path="../../crates/tinywasm", features=["parser", "std"]}
+tinywasm={path="../../crates/tinywasm", default-features=false, features=["parser", "archive"]}
argon2={version="0.5"}
+lol_alloc="0.4.1"
+
+[features]
+default=["std"]
+std=["tinywasm/std"]
[[bin]]
name="hello"
@@ -26,6 +31,10 @@ name="tinywasm"
path="src/tinywasm.rs"
[[bin]]
+name="tinywasm_no_std"
+path="src/tinywasm_no_std.rs"
+
+[[bin]]
name="fibonacci"
path="src/fibonacci.rs"
diff --git a/examples/rust/build.sh b/examples/rust/build.sh
index ceb1de6..d1e6285 100755
--- a/examples/rust/build.sh
+++ b/examples/rust/build.sh
@@ -12,6 +12,9 @@ wasmopt_features="--enable-reference-types --enable-bulk-memory --enable-mutable
# ensure out dir exists
mkdir -p "$dest_dir"
+# build no_std
+cargo build --target wasm32-unknown-unknown --package rust-wasm-examples --profile=wasm --bin tinywasm_no_std --no-default-features
+
for bin in "${bins[@]}"; do
RUSTFLAGS="-C target-feature=$rust_features -C panic=abort" cargo build --target wasm32-unknown-unknown --package rust-wasm-examples --profile=wasm --bin "$bin"
diff --git a/examples/rust/src/tinywasm.rs b/examples/rust/src/tinywasm.rs
index 08c8135..68e6375 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/print.wasm"))?;
+ let module = tinywasm::Module::parse_stream(&include_bytes!("../out/print.wasm")[..])?;
let mut store = tinywasm::Store::default();
let mut imports = tinywasm::Imports::new();
diff --git a/examples/rust/src/tinywasm_no_std.rs b/examples/rust/src/tinywasm_no_std.rs
index 9f2b28c..c20e243 100644
--- a/examples/rust/src/tinywasm_no_std.rs
+++ b/examples/rust/src/tinywasm_no_std.rs
@@ -1,7 +1,19 @@
#![no_main]
#![no_std]
+use lol_alloc::{AssumeSingleThreaded, FreeListAllocator};
use tinywasm::{Extern, FuncContext};
+extern crate alloc;
+
+#[panic_handler]
+fn panic(_info: &core::panic::PanicInfo) -> ! {
+ loop {}
+}
+
+#[global_allocator]
+static ALLOCATOR: AssumeSingleThreaded<FreeListAllocator> =
+ unsafe { AssumeSingleThreaded::new(FreeListAllocator::new()) };
+
#[link(wasm_import_module = "env")]
extern "C" {
fn printi32(x: i32);
@@ -13,10 +25,13 @@ pub extern "C" fn hello() {
}
fn run() -> tinywasm::Result<()> {
- let module = tinywasm::Module::parse_bytes(include_bytes!("../out/print.wasm"))?;
let mut store = tinywasm::Store::default();
let mut imports = tinywasm::Imports::new();
+ let res = tinywasm::parser::Parser::new().parse_module_bytes(include_bytes!("../out/print.wasm"))?;
+ let twasm = res.serialize_twasm();
+ let module = tinywasm::Module::parse_bytes(&twasm)?;
+
imports.define(
"env",
"printi32",
diff --git a/examples/wasm-rust.rs b/examples/wasm-rust.rs
index 169fed5..a9c7572 100644
--- a/examples/wasm-rust.rs
+++ b/examples/wasm-rust.rs
@@ -43,6 +43,7 @@ fn main() -> Result<()> {
"printi32" => printi32()?,
"fibonacci" => fibonacci()?,
"tinywasm" => tinywasm()?,
+ "tinywasm_no_std" => tinywasm_no_std()?,
"argon2id" => argon2id()?,
"all" => {
println!("Running all examples");
@@ -54,6 +55,8 @@ fn main() -> Result<()> {
fibonacci()?;
println!("\ntinywasm.wasm:");
tinywasm()?;
+ println!("\ntinywasm_no_std.wasm:");
+ tinywasm_no_std()?;
println!("argon2id.wasm:");
argon2id()?;
}
@@ -64,7 +67,22 @@ fn main() -> Result<()> {
}
fn tinywasm() -> Result<()> {
- let module = Module::parse_file("./examples/rust/out/tinywasm.wasm")?;
+ let module = Module::parse_file("./examples/rust/out/tinywasm.opt.wasm")?;
+ let mut store = Store::default();
+
+ let mut imports = Imports::new();
+ imports.define("env", "printi32", Extern::typed_func(|_: FuncContext<'_>, _x: i32| Ok(())))?;
+ let instance = module.instantiate(&mut store, Some(black_box(imports)))?;
+
+ let hello = instance.exported_func::<(), ()>(&store, "hello")?;
+ hello.call(&mut store, black_box(()))?;
+ hello.call(&mut store, black_box(()))?;
+ hello.call(&mut store, black_box(()))?;
+ Ok(())
+}
+
+fn tinywasm_no_std() -> Result<()> {
+ let module = Module::parse_file("./examples/rust/out/tinywasm_no_std.opt.wasm")?;
let mut store = Store::default();
let mut imports = Imports::new();
@@ -79,7 +97,7 @@ fn tinywasm() -> Result<()> {
}
fn hello() -> Result<()> {
- let module = Module::parse_file("./examples/rust/out/hello.wasm")?;
+ let module = Module::parse_file("./examples/rust/out/hello.opt.wasm")?;
let mut store = Store::default();
let mut imports = Imports::new();
@@ -108,7 +126,7 @@ fn hello() -> Result<()> {
}
fn printi32() -> Result<()> {
- let module = Module::parse_file("./examples/rust/out/print.wasm")?;
+ let module = Module::parse_file("./examples/rust/out/print.opt.wasm")?;
let mut store = Store::default();
let mut imports = Imports::new();
@@ -151,3 +169,38 @@ fn argon2id() -> Result<()> {
Ok(())
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_hello() {
+ hello().unwrap();
+ }
+
+ #[test]
+ fn test_printi32() {
+ printi32().unwrap();
+ }
+
+ #[test]
+ fn test_fibonacci() {
+ fibonacci().unwrap();
+ }
+
+ #[test]
+ fn test_tinywasm() {
+ tinywasm().unwrap();
+ }
+
+ #[test]
+ fn test_tinywasm_no_std() {
+ tinywasm_no_std().unwrap();
+ }
+
+ #[test]
+ fn test_argon2id() {
+ argon2id().unwrap();
+ }
+}