From 34198fa18adce7e70101d20a351722d6cb1be93a Mon Sep 17 00:00:00 2001 From: effulgentsia <477547+effulgentsia@users.noreply.github.com> Date: Tue, 24 Mar 2026 11:25:20 -0700 Subject: [PATCH] Add Go bindings for missing linker unknown-imports functions --- linker.go | 38 ++++++++++++++++++++++++++++++++ linker_test.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/linker.go b/linker.go index a7eb8ef..1bfbfa5 100644 --- a/linker.go +++ b/linker.go @@ -211,6 +211,44 @@ func (l *Linker) DefineWasi() error { return mkError(err) } +// DefineUnknownImportsAsTraps defines all otherwise-missing imports of the +// module as functions that immediately trap. +// +// Returns an error if the imports could not be defined. +func (l *Linker) DefineUnknownImportsAsTraps(module *Module) error { + err := C.wasmtime_linker_define_unknown_imports_as_traps( + l.ptr(), + module.ptr(), + ) + runtime.KeepAlive(l) + runtime.KeepAlive(module) + if err == nil { + return nil + } + + return mkError(err) +} + +// DefineUnknownImportsAsDefaultValues defines all otherwise-missing imports of +// the module as values that return the default for their type. +// +// Returns an error if the imports could not be defined. +func (l *Linker) DefineUnknownImportsAsDefaultValues(store Storelike, module *Module) error { + err := C.wasmtime_linker_define_unknown_imports_as_default_values( + l.ptr(), + store.Context(), + module.ptr(), + ) + runtime.KeepAlive(l) + runtime.KeepAlive(store) + runtime.KeepAlive(module) + if err == nil { + return nil + } + + return mkError(err) +} + // Instantiate instantiates a module with all imports defined in this linker. // // Returns an error if the instance's imports couldn't be satisfied, had the diff --git a/linker_test.go b/linker_test.go index c72ed54..01b1034 100644 --- a/linker_test.go +++ b/linker_test.go @@ -182,6 +182,66 @@ func TestLinkerFuncs(t *testing.T) { require.Equal(t, 6, called, "expected a call") } +func TestLinkerDefineUnknownImportsAsTraps(t *testing.T) { + engine := NewEngine() + wasm, err := Wat2Wasm(` + (module + (import "unknown" "f" (func)) + (func (export "run") call 0) + ) + `) + require.NoError(t, err) + module, err := NewModule(engine, wasm) + require.NoError(t, err) + + store := NewStore(engine) + linker := NewLinker(engine) + defer linker.Close() + _, err = linker.Instantiate(store, module) + require.Error(t, err) + + err = linker.DefineUnknownImportsAsTraps(module) + require.NoError(t, err) + instance, err := linker.Instantiate(store, module) + require.NoError(t, err) + + run := instance.GetFunc(store, "run") + require.NotNil(t, run) + _, err = run.Call(store) + require.Error(t, err) +} + +func TestLinkerDefineUnknownImportsAsDefaultValues(t *testing.T) { + engine := NewEngine() + wasm, err := Wat2Wasm(` + (module + (import "unknown" "f" (func (result i32))) + (func (export "run") (result i32) call 0) + ) + `) + require.NoError(t, err) + module, err := NewModule(engine, wasm) + require.NoError(t, err) + + store := NewStore(engine) + linker := NewLinker(engine) + defer linker.Close() + + _, err = linker.Instantiate(store, module) + require.Error(t, err) + + err = linker.DefineUnknownImportsAsDefaultValues(store, module) + require.NoError(t, err) + instance, err := linker.Instantiate(store, module) + require.NoError(t, err) + + run := instance.GetFunc(store, "run") + require.NotNil(t, run) + result, err := run.Call(store) + require.NoError(t, err) + require.Equal(t, int32(0), result) +} + func TestPanicInHostFunctionDuringInstantiate(t *testing.T) { engine := NewEngine() linker := NewLinker(engine)