summaryrefslogtreecommitdiff
path: root/vendor/github.com/tetratelabs/wazero/builder.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/tetratelabs/wazero/builder.go')
-rw-r--r--vendor/github.com/tetratelabs/wazero/builder.go17
1 files changed, 16 insertions, 1 deletions
diff --git a/vendor/github.com/tetratelabs/wazero/builder.go b/vendor/github.com/tetratelabs/wazero/builder.go
index f64afabdf..b60a9e097 100644
--- a/vendor/github.com/tetratelabs/wazero/builder.go
+++ b/vendor/github.com/tetratelabs/wazero/builder.go
@@ -179,6 +179,9 @@ type HostFunctionBuilder interface {
// are deferred until Compile.
// - Functions are indexed in order of calls to NewFunctionBuilder as
// insertion ordering is needed by ABI such as Emscripten (invoke_*).
+// - The semantics of host functions assumes the existence of an "importing module" because, for example, the host function needs access to
+// the memory of the importing module. Therefore, direct use of ExportedFunction is forbidden for host modules.
+// Practically speaking, it is usually meaningless to directly call a host function from Go code as it is already somewhere in Go code.
type HostModuleBuilder interface {
// Note: until golang/go#5860, we can't use example tests to embed code in interface godocs.
@@ -341,12 +344,24 @@ func (b *hostModuleBuilder) Compile(ctx context.Context) (CompiledModule, error)
return c, nil
}
+// hostModuleInstance is a wrapper around api.Module that prevents calling ExportedFunction.
+type hostModuleInstance struct{ api.Module }
+
+// ExportedFunction implements api.Module ExportedFunction.
+func (h hostModuleInstance) ExportedFunction(name string) api.Function {
+ panic("calling ExportedFunction is forbidden on host modules. See the note on ExportedFunction interface")
+}
+
// Instantiate implements HostModuleBuilder.Instantiate
func (b *hostModuleBuilder) Instantiate(ctx context.Context) (api.Module, error) {
if compiled, err := b.Compile(ctx); err != nil {
return nil, err
} else {
compiled.(*compiledModule).closeWithModule = true
- return b.r.InstantiateModule(ctx, compiled, NewModuleConfig())
+ m, err := b.r.InstantiateModule(ctx, compiled, NewModuleConfig())
+ if err != nil {
+ return nil, err
+ }
+ return hostModuleInstance{m}, nil
}
}