From 68276af76b25560fbe9df0fcd15f73242f4b2fab Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Fri, 28 Feb 2025 13:16:25 -0500 Subject: wasm: split out host-specific bits Signed-off-by: Xe Iaso --- wasm/wasm.go | 14 -------------- wasm/wasm_host.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 wasm/wasm_host.go diff --git a/wasm/wasm.go b/wasm/wasm.go index 5981c06..88c1a11 100644 --- a/wasm/wasm.go +++ b/wasm/wasm.go @@ -2,24 +2,10 @@ package wasm import ( "unsafe" - - "github.com/tetratelabs/wazero/api" ) type String uint64 -func (value String) Load(module api.Module) string { - return string(value.LoadBytes(module)) -} - -func (value String) LoadBytes(module api.Module) []byte { - data, ok := module.Memory().Read(uint32(value>>32), uint32(value)) - if !ok { - panic("memory read out of bounds") - } - return data -} - func FromString(value string) String { position := uint32(uintptr(unsafe.Pointer(unsafe.StringData(value)))) bytes := uint32(len(value)) diff --git a/wasm/wasm_host.go b/wasm/wasm_host.go new file mode 100644 index 0000000..64b8654 --- /dev/null +++ b/wasm/wasm_host.go @@ -0,0 +1,41 @@ +//go:build !wasip1 + +package wasm + +import ( + "context" + "fmt" + + "github.com/tetratelabs/wazero/api" +) + +func (value String) Load(module api.Module) string { + return string(value.LoadBytes(module)) +} + +func (value String) LoadBytes(module api.Module) []byte { + data, ok := module.Memory().Read(uint32(value>>32), uint32(value)) + if !ok { + panic("memory read out of bounds") + } + return data +} + +func (buffer Buffer) Load(module api.Module) []byte { + data, ok := module.Memory().Read(buffer.Address(), buffer.Length()) + if !ok { + panic("memory read out of bounds") + } + return data +} + +func Store(ctx context.Context, module api.Module, data []byte) (Buffer, error) { + results, err := module.ExportedFunction("malloc").Call(ctx, uint64(len(data))) + if err != nil { + return 0, fmt.Errorf("wasm: failed to call malloc: %w", err) + } + + buffer := Buffer(results[0]) + module.Memory().Write(buffer.Address(), data) + return buffer, nil +} -- cgit v1.2.3