mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-02-26 01:39:08 +01:00
145 lines
2.5 KiB
Go
145 lines
2.5 KiB
Go
package util
|
|
|
|
import (
|
|
"bytes"
|
|
"math"
|
|
|
|
"github.com/tetratelabs/wazero/api"
|
|
)
|
|
|
|
const (
|
|
PtrLen = 4
|
|
IntLen = 4
|
|
)
|
|
|
|
type (
|
|
i8 interface{ ~int8 | ~uint8 }
|
|
i32 interface{ ~int32 | ~uint32 }
|
|
i64 interface{ ~int64 | ~uint64 }
|
|
|
|
Stk_t = uint64
|
|
Ptr_t uint32
|
|
Res_t int32
|
|
)
|
|
|
|
func View(mod api.Module, ptr Ptr_t, size int64) []byte {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
if size == 0 {
|
|
return nil
|
|
}
|
|
if uint64(size) > math.MaxUint32 {
|
|
panic(RangeErr)
|
|
}
|
|
buf, ok := mod.Memory().Read(uint32(ptr), uint32(size))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
return buf
|
|
}
|
|
|
|
func Read[T i8](mod api.Module, ptr Ptr_t) T {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
v, ok := mod.Memory().ReadByte(uint32(ptr))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
return T(v)
|
|
}
|
|
|
|
func Write[T i8](mod api.Module, ptr Ptr_t, v T) {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
ok := mod.Memory().WriteByte(uint32(ptr), uint8(v))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
}
|
|
|
|
func Read32[T i32](mod api.Module, ptr Ptr_t) T {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
v, ok := mod.Memory().ReadUint32Le(uint32(ptr))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
return T(v)
|
|
}
|
|
|
|
func Write32[T i32](mod api.Module, ptr Ptr_t, v T) {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
ok := mod.Memory().WriteUint32Le(uint32(ptr), uint32(v))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
}
|
|
|
|
func Read64[T i64](mod api.Module, ptr Ptr_t) T {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
v, ok := mod.Memory().ReadUint64Le(uint32(ptr))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
return T(v)
|
|
}
|
|
|
|
func Write64[T i64](mod api.Module, ptr Ptr_t, v T) {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
ok := mod.Memory().WriteUint64Le(uint32(ptr), uint64(v))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
}
|
|
|
|
func ReadFloat64(mod api.Module, ptr Ptr_t) float64 {
|
|
return math.Float64frombits(Read64[uint64](mod, ptr))
|
|
}
|
|
|
|
func WriteFloat64(mod api.Module, ptr Ptr_t, v float64) {
|
|
Write64(mod, ptr, math.Float64bits(v))
|
|
}
|
|
|
|
func ReadString(mod api.Module, ptr Ptr_t, maxlen int64) string {
|
|
if ptr == 0 {
|
|
panic(NilErr)
|
|
}
|
|
if maxlen <= 0 {
|
|
return ""
|
|
}
|
|
mem := mod.Memory()
|
|
maxlen = min(maxlen, math.MaxInt32-1) + 1
|
|
buf, ok := mem.Read(uint32(ptr), uint32(maxlen))
|
|
if !ok {
|
|
buf, ok = mem.Read(uint32(ptr), mem.Size()-uint32(ptr))
|
|
if !ok {
|
|
panic(RangeErr)
|
|
}
|
|
}
|
|
if i := bytes.IndexByte(buf, 0); i < 0 {
|
|
panic(NoNulErr)
|
|
} else {
|
|
return string(buf[:i])
|
|
}
|
|
}
|
|
|
|
func WriteBytes(mod api.Module, ptr Ptr_t, b []byte) {
|
|
buf := View(mod, ptr, int64(len(b)))
|
|
copy(buf, b)
|
|
}
|
|
|
|
func WriteString(mod api.Module, ptr Ptr_t, s string) {
|
|
buf := View(mod, ptr, int64(len(s))+1)
|
|
buf[len(s)] = 0
|
|
copy(buf, s)
|
|
}
|