summaryrefslogtreecommitdiff
path: root/vendor/github.com/tetratelabs/wazero/internal/wasm
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/tetratelabs/wazero/internal/wasm')
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/wasm/binary/value.go3
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/wasm/func_validation.go9
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go10
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/wasm/store.go31
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/wasm/store_module_list.go4
5 files changed, 38 insertions, 19 deletions
diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/binary/value.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/binary/value.go
index 755ee5ea3..dfc4417ed 100644
--- a/vendor/github.com/tetratelabs/wazero/internal/wasm/binary/value.go
+++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/binary/value.go
@@ -54,7 +54,6 @@ func decodeUTF8(r *bytes.Reader, contextFormat string, contextArgs ...interface{
return "", 0, fmt.Errorf("%s is not valid UTF-8", fmt.Sprintf(contextFormat, contextArgs...))
}
- // TODO: use unsafe.String after flooring Go 1.20.
- ret := *(*string)(unsafe.Pointer(&buf))
+ ret := unsafe.String(&buf[0], int(size))
return ret, size + uint32(sizeOfSize), nil
}
diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/func_validation.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/func_validation.go
index ce2c7254d..604489228 100644
--- a/vendor/github.com/tetratelabs/wazero/internal/wasm/func_validation.go
+++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/func_validation.go
@@ -451,14 +451,14 @@ func (m *Module) validateFunctionWithMaxStackValues(
return fmt.Errorf("read immediate: %w", err)
}
- list := make([]uint32, nl)
+ sts.ls = sts.ls[:0]
for i := uint32(0); i < nl; i++ {
l, n, err := leb128.DecodeUint32(br)
if err != nil {
return fmt.Errorf("read immediate: %w", err)
}
num += n
- list[i] = l
+ sts.ls = append(sts.ls, l)
}
ln, n, err := leb128.DecodeUint32(br)
if err != nil {
@@ -511,7 +511,7 @@ func (m *Module) validateFunctionWithMaxStackValues(
}
}
- for _, l := range list {
+ for _, l := range sts.ls {
if int(l) >= len(controlBlockStack.stack) {
return fmt.Errorf("invalid l param given for %s", OpcodeBrTableName)
}
@@ -2003,6 +2003,8 @@ var vecSplatValueTypes = [...]ValueType{
type stacks struct {
vs valueTypeStack
cs controlBlockStack
+ // ls is the label slice that is reused for each br_table instruction.
+ ls []uint32
}
func (sts *stacks) reset(functionType *FunctionType) {
@@ -2012,6 +2014,7 @@ func (sts *stacks) reset(functionType *FunctionType) {
sts.vs.maximumStackPointer = 0
sts.cs.stack = sts.cs.stack[:0]
sts.cs.stack = append(sts.cs.stack, controlBlock{blockType: functionType})
+ sts.ls = sts.ls[:0]
}
type controlBlockStack struct {
diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go
index 947b16112..8e072fd12 100644
--- a/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go
+++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go
@@ -52,7 +52,8 @@ type MemoryInstance struct {
definition api.MemoryDefinition
// Mux is used in interpreter mode to prevent overlapping calls to atomic instructions,
- // introduced with WebAssembly threads proposal.
+ // introduced with WebAssembly threads proposal, and in compiler mode to make memory modifications
+ // within Grow non-racy for the Go race detector.
Mux sync.Mutex
// waiters implements atomic wait and notify. It is implemented similarly to golang.org/x/sync/semaphore,
@@ -227,6 +228,11 @@ func MemoryPagesToBytesNum(pages uint32) (bytesNum uint64) {
// Grow implements the same method as documented on api.Memory.
func (m *MemoryInstance) Grow(delta uint32) (result uint32, ok bool) {
+ if m.Shared {
+ m.Mux.Lock()
+ defer m.Mux.Unlock()
+ }
+
currentPages := m.Pages()
if delta == 0 {
return currentPages, true
@@ -299,6 +305,7 @@ func PagesToUnitOfBytes(pages uint32) string {
// Uses atomic write to update the length of a slice.
func atomicStoreLengthAndCap(slice *[]byte, length uintptr, cap uintptr) {
+ //nolint:staticcheck
slicePtr := (*reflect.SliceHeader)(unsafe.Pointer(slice))
capPtr := (*uintptr)(unsafe.Pointer(&slicePtr.Cap))
atomic.StoreUintptr(capPtr, cap)
@@ -308,6 +315,7 @@ func atomicStoreLengthAndCap(slice *[]byte, length uintptr, cap uintptr) {
// Uses atomic write to update the length of a slice.
func atomicStoreLength(slice *[]byte, length uintptr) {
+ //nolint:staticcheck
slicePtr := (*reflect.SliceHeader)(unsafe.Pointer(slice))
lenPtr := (*uintptr)(unsafe.Pointer(&slicePtr.Len))
atomic.StoreUintptr(lenPtr, length)
diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go
index 1db661e85..dda6e5b63 100644
--- a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go
+++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go
@@ -3,6 +3,7 @@ package wasm
import (
"context"
"encoding/binary"
+ "errors"
"fmt"
"sync"
"sync/atomic"
@@ -352,7 +353,7 @@ func (s *Store) instantiate(
return nil, err
}
- if err = m.resolveImports(module); err != nil {
+ if err = m.resolveImports(ctx, module); err != nil {
return nil, err
}
@@ -410,12 +411,22 @@ func (s *Store) instantiate(
return
}
-func (m *ModuleInstance) resolveImports(module *Module) (err error) {
+func (m *ModuleInstance) resolveImports(ctx context.Context, module *Module) (err error) {
+ // Check if ctx contains an ImportResolver.
+ resolveImport, _ := ctx.Value(expctxkeys.ImportResolverKey{}).(experimental.ImportResolver)
+
for moduleName, imports := range module.ImportPerModule {
var importedModule *ModuleInstance
- importedModule, err = m.s.module(moduleName)
- if err != nil {
- return err
+ if resolveImport != nil {
+ if v := resolveImport(moduleName); v != nil {
+ importedModule = v.(*ModuleInstance)
+ }
+ }
+ if importedModule == nil {
+ importedModule, err = m.s.module(moduleName)
+ if err != nil {
+ return err
+ }
}
for _, i := range imports {
@@ -649,20 +660,20 @@ func (s *Store) GetFunctionTypeID(t *FunctionType) (FunctionTypeID, error) {
}
// CloseWithExitCode implements the same method as documented on wazero.Runtime.
-func (s *Store) CloseWithExitCode(ctx context.Context, exitCode uint32) (err error) {
+func (s *Store) CloseWithExitCode(ctx context.Context, exitCode uint32) error {
s.mux.Lock()
defer s.mux.Unlock()
// Close modules in reverse initialization order.
+ var errs []error
for m := s.moduleList; m != nil; m = m.next {
// If closing this module errs, proceed anyway to close the others.
- if e := m.closeWithExitCode(ctx, exitCode); e != nil && err == nil {
- // TODO: use multiple errors handling in Go 1.20.
- err = e // first error
+ if err := m.closeWithExitCode(ctx, exitCode); err != nil {
+ errs = append(errs, err)
}
}
s.moduleList = nil
s.nameToModule = nil
s.nameToModuleCap = 0
s.typeIDs = nil
- return
+ return errors.Join(errs...)
}
diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/store_module_list.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/store_module_list.go
index 17c63e38e..ede3047de 100644
--- a/vendor/github.com/tetratelabs/wazero/internal/wasm/store_module_list.go
+++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/store_module_list.go
@@ -3,8 +3,6 @@ package wasm
import (
"errors"
"fmt"
-
- "github.com/tetratelabs/wazero/api"
)
// deleteModule makes the moduleName available for instantiation again.
@@ -88,7 +86,7 @@ func (s *Store) registerModule(m *ModuleInstance) error {
}
// Module implements wazero.Runtime Module
-func (s *Store) Module(moduleName string) api.Module {
+func (s *Store) Module(moduleName string) *ModuleInstance {
m, err := s.module(moduleName)
if err != nil {
return nil