Files
wazero/wasm/value.go

69 lines
1.2 KiB
Go

package wasm
import (
"fmt"
"io"
"unicode/utf8"
"github.com/mathetake/gasm/wasm/leb128"
)
type ValueType byte
const (
ValueTypeI32 ValueType = 0x7f
ValueTypeI64 ValueType = 0x7e
ValueTypeF32 ValueType = 0x7d
ValueTypeF64 ValueType = 0x7c
)
func readValueTypes(r io.Reader, num uint32) ([]ValueType, error) {
ret := make([]ValueType, num)
buf := make([]byte, num)
_, err := io.ReadFull(r, buf)
if err != nil {
return nil, err
}
for i, v := range buf {
switch vt := ValueType(v); vt {
case ValueTypeI32, ValueTypeF32, ValueTypeI64, ValueTypeF64:
ret[i] = vt
default:
return nil, fmt.Errorf("invalid value type: %d", vt)
}
}
return ret, nil
}
func readNameValue(r io.Reader) (string, error) {
vs, _, err := leb128.DecodeUint32(r)
if err != nil {
return "", fmt.Errorf("read size of name: %v", err)
}
buf := make([]byte, vs)
if _, err := io.ReadFull(r, buf); err != nil {
return "", fmt.Errorf("read bytes of name: %v", err)
}
if !utf8.Valid(buf) {
return "", fmt.Errorf("name must be valid as utf8")
}
return string(buf), nil
}
func hasSameSignature(a []ValueType, b []ValueType) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}