Skip to content

Commit 56a3341

Browse files
committed
examples: implement basic examples
1 parent 6a39530 commit 56a3341

File tree

2 files changed

+170
-0
lines changed

2 files changed

+170
-0
lines changed

examples/instance.zig

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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 $add_one_t (func (param i32) (result i32)))
11+
\\ (func $add_one_f (type $add_one_t) (param $value i32) (result i32)
12+
\\ local.get $value
13+
\\ i32.const 1
14+
\\ i32.add)
15+
\\ (export "add_one" (func $add_one_f)))
16+
;
17+
18+
pub fn main() !void {
19+
run() catch |err| {
20+
// const err_msg = try wasmer.lastError(std.heap.c_allocator);
21+
// defer std.heap.c_allocator.free(err_msg);
22+
23+
// std.log.err("{s}", .{err_msg});
24+
25+
return err;
26+
};
27+
}
28+
29+
fn run() !void {
30+
var wasm_bytes = try wasmer.watToWasm(wat);
31+
defer wasm_bytes.deinit();
32+
33+
std.log.info("creating the store...", .{});
34+
35+
const engine = try wasmer.Engine.init();
36+
defer engine.deinit();
37+
const store = try wasmer.Store.init(engine);
38+
defer store.deinit();
39+
40+
std.log.info("compiling module...", .{});
41+
42+
const module = try wasmer.Module.init(store, wasm_bytes.toSlice());
43+
44+
defer module.deinit();
45+
46+
std.log.info("instantiating module...", .{});
47+
48+
const instance = try wasmer.Instance.init(store, module, &.{});
49+
defer instance.deinit();
50+
51+
std.log.info("retrieving exports...", .{});
52+
53+
const add_one = instance.getExportFunc(module, "add_one") orelse {
54+
std.log.err("failed to retrieve \"add_one\" export from instance", .{});
55+
return error.ExportNotFound;
56+
};
57+
defer add_one.deinit();
58+
59+
std.log.info("calling \"add_one\" export fn...", .{});
60+
61+
const res = try add_one.call(i32, .{@as(i32, 1)});
62+
assert(res == 2);
63+
64+
std.log.info("result of \"add_one(1)\" = {}", .{res});
65+
}

examples/memory.zig

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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+
var wasm_bytes = try wasmer.watToWasm(wat);
39+
defer wasm_bytes.deinit();
40+
41+
std.log.info("creating the store...", .{});
42+
43+
const engine = try wasmer.Engine.init();
44+
defer engine.deinit();
45+
const store = try wasmer.Store.init(engine);
46+
defer store.deinit();
47+
48+
std.log.info("compiling module...", .{});
49+
50+
const module = try wasmer.Module.init(store, wasm_bytes.toSlice());
51+
defer module.deinit();
52+
53+
std.log.info("instantiating module...", .{});
54+
55+
const instance = try wasmer.Instance.init(store, module, &.{});
56+
defer instance.deinit();
57+
58+
std.log.info("retrieving exports...", .{});
59+
60+
const get_at = instance.getExportFunc(module, "get_at") orelse {
61+
std.log.err("failed to retrieve \"get_at\" export from instance", .{});
62+
return error.ExportNotFound;
63+
};
64+
defer get_at.deinit();
65+
const set_at = instance.getExportFunc(module, "set_at") orelse {
66+
std.log.err("failed to retrieve \"set_at\" export from instance", .{});
67+
return error.ExportNotFound;
68+
};
69+
defer set_at.deinit();
70+
const mem_size = instance.getExportFunc(module, "mem_size") orelse {
71+
std.log.err("failed to retrieve \"mem_size\" export from instance", .{});
72+
return error.ExportNotFound;
73+
};
74+
defer mem_size.deinit();
75+
76+
const memory = instance.getExportMem(module, "memory") orelse {
77+
std.log.err("failed to retrieve \"memory\" export from instance", .{});
78+
return error.ExportNotFound;
79+
};
80+
defer memory.deinit();
81+
82+
memory.grow(2) catch |err| {
83+
std.log.err("Error growing memory!", .{});
84+
return err;
85+
};
86+
87+
const new_pages = memory.pages();
88+
const new_size = memory.size();
89+
std.log.info("New memory size (byted)/(pages): {d}/{d}", .{ new_size, new_pages });
90+
91+
const mem_addr: i32 = 0x2220;
92+
const val: i32 = 0xFEFEFFE;
93+
94+
set_at.call(void, .{ mem_addr, val }) catch |err| {
95+
std.log.err("Failed to call \"set_at\": {any}", .{err});
96+
return err;
97+
};
98+
99+
const result = get_at.call(i32, .{mem_addr}) catch |err| {
100+
std.log.err("Failed to call \"get_at\": {any}", .{err});
101+
return err;
102+
};
103+
104+
std.log.info("Value at 0x{x:0>4}: {d}", .{ mem_addr, result });
105+
}

0 commit comments

Comments
 (0)