zware
zware copied to clipboard
Zig WebAssembly Runtime Engine
zware

Zig WebAssembly Runtime Engine
About
zware
is a library for executing WebAssembly embedded in Zig programs.
Example
From examples/fib
:
const std = @import("std");
const zware = @import("zware");
const Store = zware.Store;
const Module = zware.Module;
const Instance = zware.Instance;
const GeneralPurposeAllocator = std.heap.GeneralPurposeAllocator;
var gpa = GeneralPurposeAllocator(.{}){};
pub fn main() !void {
defer _ = gpa.deinit();
const alloc = gpa.allocator();
const bytes = @embedFile("fib.wasm");
var store = Store.init(alloc);
defer store.deinit();
var module = Module.init(alloc, bytes);
defer module.deinit();
try module.decode();
var instance = Instance.init(alloc, &store, module);
try instance.instantiate();
defer instance.deinit();
const n = 39;
var in = [1]u64{n};
var out = [1]u64{0};
try instance.invoke("fib", in[0..], out[0..], .{});
std.debug.print("fib({}) = {}\n", .{ n, @bitCast(i32, @truncate(u32, out[0])) });
}
Requirements
Compile-time
- Zig 0.10.0
Run-time
- None, zig generates static binaries:
➜ zware git:(master) ✗ ldd fib
not a dynamic executable
Goals
- Embed WebAssembly programs in other zig programs
- Be fast enough to be useful
- Implement WASI
Status
- The project is very much alpha quality
- WebAssembly 2.0 supported (apart from the vector / SIMD support which is WIP)
- The WebAssembly official testsuite passes and zware includes a fuzzer
Running the testsuite
- Build the test runner
zig build --build-file test/testrunner/build.zig --prefix ./
- Run
sh test/run-generated.sh