This adds `RuntimeConfig.WithFeatureMutableGlobal(enabled bool)`, which allows disabling of mutable globals. When disabled, any attempt to add a mutable global, either explicitly or implicitly via decoding wasm will fail. To support this, there's a new `Features` bitflag that can allow up to 63 feature toggles without passing structs. While here, I fixed a significant performance problem in decoding binary: Before ``` BenchmarkCodecExample/binary.DecodeModule-16 184243 5623 ns/op 3848 B/op 184 allocs/op ``` Now ``` BenchmarkCodecExample/binary.DecodeModule-16 294084 3520 ns/op 2176 B/op 91 allocs/op ``` Signed-off-by: Adrian Cole <adrian@tetrate.io>
42 lines
865 B
Go
42 lines
865 B
Go
package binary
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/tetratelabs/wazero/internal/leb128"
|
|
wasm "github.com/tetratelabs/wazero/internal/wasm"
|
|
)
|
|
|
|
func decodeDataSegment(r *bytes.Reader) (*wasm.DataSegment, error) {
|
|
d, _, err := leb128.DecodeUint32(r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("read memory index: %v", err)
|
|
}
|
|
|
|
if d != 0 {
|
|
return nil, fmt.Errorf("invalid memory index: %d", d)
|
|
}
|
|
|
|
expr, err := decodeConstantExpression(r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("read offset expression: %v", err)
|
|
}
|
|
|
|
vs, _, err := leb128.DecodeUint32(r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get the size of vector: %v", err)
|
|
}
|
|
|
|
b := make([]byte, vs)
|
|
if _, err := io.ReadFull(r, b); err != nil {
|
|
return nil, fmt.Errorf("read bytes for init: %v", err)
|
|
}
|
|
|
|
return &wasm.DataSegment{
|
|
OffsetExpression: expr,
|
|
Init: b,
|
|
}, nil
|
|
}
|