WASI Example

This example builds a small WebAssembly module that writes Hello, World! through the WASI fd_write import.

examples/example_wasi.py
# SPDX-FileCopyrightText: 2026 Jacques Supcik <jacques.supcik@hefr.ch>
#
# SPDX-License-Identifier: MIT

from wasm_gen import (
    ActiveData,
    BaseFunction,
    Export,
    Function,
    FunctionType,
    Import,
    Memory,
    MemoryType,
    Module,
)
from wasm_gen import instructions as I  # noqa
from wasm_gen.type import i32_t

m = Module()

f1 = BaseFunction(
    type=FunctionType(params=[i32_t, i32_t, i32_t, i32_t], results=[i32_t])
)
m.imports.append(Import(node=f1, module="wasi_snapshot_preview1", name="fd_write"))

f2 = Function(type=FunctionType(params=[], results=[]))
f2.body.extend(
    [
        I.I32Const(value=0),
        I.I32Const(value=8),
        I.I32Store(align=2, offset=0),
        I.I32Const(value=4),
        I.I32Const(value=14),
        I.I32Store(align=2, offset=0),
        I.I32Const(value=1),
        I.I32Const(value=0),
        I.I32Const(value=1),
        I.I32Const(value=20),
        I.Call(function=f1),
        I.Drop(),
        I.End(),
    ]
)
m.funcs.append(f2)

m1 = Memory(type=MemoryType(min_pages=1))
m.memories.append(m1)

d = ActiveData(offset=8)
d.expr.append(I.I32Const(value=8))
d._data.write(b"Hello, World!\n")
m.data.append(d)

m.exports.extend(
    [
        Export(node=f2, name="_start"),
        Export(node=m1, name="memory"),
    ]
)

with open("test.wasm", "wb") as f:
    f.write(bytes(m))