Skip to content

Commit 700eadb

Browse files
committed
examples: implement wasi
1 parent 3fddfb1 commit 700eadb

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

examples/wasi.zig

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
const std = @import("std");
2+
const wasmer = @import("wasmer");
3+
const assert = std.debug.assert;
4+
5+
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
6+
const allocator = gpa.allocator();
7+
8+
const wat =
9+
\\(module
10+
\\ (type $mem_size_t (func (result i32)))
11+
\\ (type $get_at_t (func (param i32) (result i32)))
12+
\\ (type $set_at_t (func (param i32) (param i32)))
13+
\\ (memory $mem 1)
14+
\\ (func $get_at (type $get_at_t) (param $idx i32) (result i32)
15+
\\ (i32.load (local.get $idx)))
16+
\\ (func $set_at (type $set_at_t) (param $idx i32) (param $val i32)
17+
\\ (i32.store (local.get $idx) (local.get $val)))
18+
\\ (func $mem_size (type $mem_size_t) (result i32)
19+
\\ (memory.size))
20+
\\ (export "get_at" (func $get_at))
21+
\\ (export "set_at" (func $set_at))
22+
\\ (export "mem_size" (func $mem_size))
23+
\\ (export "memory" (memory $mem)))
24+
;
25+
26+
pub fn main() !void {
27+
run() catch |err| {
28+
const err_msg = try wasmer.lastError(std.heap.c_allocator);
29+
defer std.heap.c_allocator.free(err_msg);
30+
31+
std.log.err("{s}", .{err_msg});
32+
33+
return err;
34+
};
35+
}
36+
37+
pub fn run() !void {
38+
std.log.info("creating the store...", .{});
39+
40+
const engine = try wasmer.Engine.init();
41+
defer engine.deinit();
42+
const store = try wasmer.Store.init(engine);
43+
defer store.deinit();
44+
45+
std.log.info("setting up WASI...", .{});
46+
47+
const wasi_config = try wasmer.WasiConfig.init();
48+
49+
const js_string =
50+
\\function greet(name) {
51+
\\ return JSON.stringify('Hello, ' + name);
52+
\\};
53+
\\
54+
\\print(greet('World'));
55+
;
56+
57+
wasi_config.setArg("--eval");
58+
wasi_config.setArg(js_string);
59+
60+
std.log.info("loading binary...", .{});
61+
62+
const file_content = @embedFile("./assets/qjs.wasm");
63+
64+
var binary = wasmer.ByteVec.fromSlice(file_content);
65+
defer binary.deinit();
66+
67+
std.log.info("compiling module...", .{});
68+
69+
const module = try wasmer.Module.init(store, binary.toSlice());
70+
defer module.deinit();
71+
72+
const wasi_env = try wasmer.WasiEnv.init(store, wasi_config);
73+
defer wasi_env.deinit();
74+
75+
std.log.info("instantiating module...", .{});
76+
77+
var imports = try wasmer.getImports(store, wasi_env, module);
78+
imports = try wasmer.getImports(store, wasi_env, module);
79+
defer imports.deinit();
80+
81+
const instance = try wasmer.Instance.initFromImports(store, module, &imports);
82+
defer instance.deinit();
83+
84+
try wasi_env.initializeInstance(store, instance);
85+
86+
std.log.info("extracting exports...", .{});
87+
88+
const run_func = try wasmer.getStartFunction(instance);
89+
defer run_func.deinit();
90+
91+
std.log.info("calling export...", .{});
92+
93+
run_func.call(void, .{}) catch |err| {
94+
std.log.err("Failed to call \"run_func\": {any}", .{err});
95+
return err;
96+
};
97+
}

0 commit comments

Comments
 (0)