When running my test, the main file will crash with a CheckStackSize error. If I raise the operand_stack_size to 2048, it appears to fix the issue, but I don't know very much about WASM and I'm not sure if this is actually a good solution.
Stranger yet, when the WASM file is built in any release mode, the issue doesn't happen.
In order to run the test, a couple of the wasi implementation files in this repo have to be updated to 0.12.0, but they're all very small changes (like math.absCast to @abs)
This is the test file built to wasm32-wasi:
const std = @import("std");
pub fn main() !void {
std.debug.print("All your {s} codebase are belong to us.\n", .{"ligma"});
const stdout_file = std.io.getStdOut().writer();
var bw = std.io.bufferedWriter(stdout_file);
const stdout = bw.writer();
var i: usize = 0;
while (i < 100) : (i += 1) {
try stdout.print("{d}\n", .{i});
}
try bw.flush();
}
And the program that loads it:
const std = @import("std");
const posix = std.posix;
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 initHostFunctions(store: *zware.Store) !void {
try store.exposeHostFunction("wasi_snapshot_preview1", "proc_exit", zware.wasi.proc_exit, &[_]zware.ValType{.I32}, &[_]zware.ValType{});
try store.exposeHostFunction("wasi_snapshot_preview1", "fd_write", zware.wasi.fd_write, &[_]zware.ValType{ .I32, .I32, .I32, .I32 }, &[_]zware.ValType{.I32});
try store.exposeHostFunction("wasi_snapshot_preview1", "args_get", zware.wasi.args_get, &[_]zware.ValType{ .I32, .I32 }, &[_]zware.ValType{.I32});
try store.exposeHostFunction("wasi_snapshot_preview1", "args_sizes_get", zware.wasi.args_sizes_get, &[_]zware.ValType{ .I32, .I32 }, &[_]zware.ValType{.I32});
}
pub fn main() !void {
defer _ = gpa.deinit();
const alloc = gpa.allocator();
const bytes = @embedFile("test.wasm");
var store = Store.init(alloc);
defer store.deinit();
try initHostFunctions(&store);
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();
var in = [0]u64{};
var out = [0]u64{};
try instance.addWasiPreopen(0, "stdin", posix.STDIN_FILENO);
try instance.addWasiPreopen(0, "stdout", posix.STDOUT_FILENO);
try instance.addWasiPreopen(0, "stderr", posix.STDERR_FILENO);
try instance.invoke("_start", in[0..], out[0..], .{
//.operand_stack_size = 2048,
});
}
When running my test, the main file will crash with a
CheckStackSizeerror. If I raise theoperand_stack_sizeto 2048, it appears to fix the issue, but I don't know very much about WASM and I'm not sure if this is actually a good solution.Stranger yet, when the WASM file is built in any release mode, the issue doesn't happen.
In order to run the test, a couple of the wasi implementation files in this repo have to be updated to 0.12.0, but they're all very small changes (like
math.absCastto@abs)This is the test file built to
wasm32-wasi:And the program that loads it: