dyu / zware

Zig WebAssembly Runtime Engine

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

zware

WebAssembly logo: a purple-blue square containing the uppercase letters W A. The square has a semicirclular notch on the top edge in the middle
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

  1. Build the test runner
zig build --build-file test/testrunner/build.zig --prefix ./
  1. Run
sh test/run-generated.sh

About

Zig WebAssembly Runtime Engine

License:MIT License


Languages

Language:Zig 79.5%Language:WebAssembly 16.6%Language:Shell 3.9%