Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions linker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
60 changes: 60 additions & 0 deletions linker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading