Files
sqlite3/mem.go
Nuno Cruces 0ace464670 Refactor.
2023-01-28 12:47:39 +00:00

112 lines
1.9 KiB
Go

package sqlite3
import (
"bytes"
"math"
"github.com/tetratelabs/wazero/api"
)
type memory struct {
mod api.Module
}
func (m memory) size() uint32 {
return m.mod.Memory().Size()
}
func (m memory) read(offset, byteCount uint32) ([]byte, bool) {
if offset == 0 {
panic(nilErr)
}
return m.mod.Memory().Read(offset, byteCount)
}
func (m memory) mustRead(offset, byteCount uint32) []byte {
buf, ok := m.read(offset, byteCount)
if !ok {
panic(rangeErr)
}
return buf
}
func (m memory) readUint32(offset uint32) uint32 {
if offset == 0 {
panic(nilErr)
}
v, ok := m.mod.Memory().ReadUint32Le(offset)
if !ok {
panic(rangeErr)
}
return v
}
func (m memory) writeUint32(offset, v uint32) {
if offset == 0 {
panic(nilErr)
}
ok := m.mod.Memory().WriteUint32Le(offset, v)
if !ok {
panic(rangeErr)
}
}
func (m memory) readUint64(offset uint32) uint64 {
if offset == 0 {
panic(nilErr)
}
v, ok := m.mod.Memory().ReadUint64Le(offset)
if !ok {
panic(rangeErr)
}
return v
}
func (m memory) writeUint64(offset uint32, v uint64) {
if offset == 0 {
panic(nilErr)
}
ok := m.mod.Memory().WriteUint64Le(offset, v)
if !ok {
panic(rangeErr)
}
}
func (m memory) readFloat64(offset uint32) float64 {
return math.Float64frombits(m.readUint64(offset))
}
func (m memory) writeFloat64(offset uint32, v float64) {
m.writeUint64(offset, math.Float64bits(v))
}
func (m memory) readString(ptr, maxlen uint32) string {
switch maxlen {
case 0:
return ""
case math.MaxUint32:
//
default:
maxlen = maxlen + 1
}
buf, ok := m.read(ptr, maxlen)
if !ok {
buf = m.mustRead(ptr, m.size()-ptr)
}
if i := bytes.IndexByte(buf, 0); i < 0 {
panic(noNulErr)
} else {
return string(buf[:i])
}
}
func (m memory) writeString(ptr uint32, s string) {
siz := uint32(len(s) + 1)
buf, ok := m.read(ptr, siz)
if !ok {
panic(rangeErr)
}
buf[len(s)] = 0
copy(buf, s)
}