We at one point considered making `ModuleBuilder` create complete WebAssembly binaries. However, we recently spun out [wabin](https://github.com/tetratelabs/wabin), which allows this. Meanwhile, the features in `ModuleBuilder` were confusing and misused. For example, the only two cases memory was exported on GitHub were done by accident. This is because host functions act on the guest's memory, not their own. Hence, this removes memory and globals from host side definitions, and renames the type to HostModuleBuilder to clarify this is not ever going to be used to construct normal Wasm binaries. Most importantly, this simplifies the API and reduces a lot of code. It is important to make changes like this, particularly deleting any experimental things that didn't end up useful. Signed-off-by: Adrian Cole <adrian@tetrate.io> Co-authored-by: Anuraag Agrawal <anuraaga@gmail.com>
Zig allocation example
This example shows how to pass strings in and out of a Wasm function defined in
Zig, built with zig build.
Ex.
$ go run greet.go wazero
wasm >> Hello, wazero!
go >> Hello, wazero!
greet.zig does a few things of interest:
- Uses
@ptrToIntto change a Zig pointer to a numeric type - Uses
[*]u8as an argument to take a pointer and slices it to build back a string
The Zig code exports "malloc" and "free", which we use for that purpose.
Notes
This example uses @panic() rather than unreachable to handle errors
since unreachable emits a call to panic only in Debug and ReleaseSafe
mode. In ReleaseFast and ReleaseSmall mode, it would lead into undefined
behavior.
If building wasm with a pre-release version of Zig 0.10.0, use -fstage1 to
avoid bugs in the new compiler.