mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 17:22:26 -05:00 
			
		
		
		
	This allows for building GoToSocial with [SQLite transpiled to WASM](https://github.com/ncruces/go-sqlite3) and accessed through [Wazero](https://wazero.io/).
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package util
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"math"
 | |
| 
 | |
| 	"github.com/tetratelabs/wazero/api"
 | |
| )
 | |
| 
 | |
| func View(mod api.Module, ptr uint32, size uint64) []byte {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	if size > math.MaxUint32 {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| 	if size == 0 {
 | |
| 		return nil
 | |
| 	}
 | |
| 	buf, ok := mod.Memory().Read(ptr, uint32(size))
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| 	return buf
 | |
| }
 | |
| 
 | |
| func ReadUint8(mod api.Module, ptr uint32) uint8 {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	v, ok := mod.Memory().ReadByte(ptr)
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| 	return v
 | |
| }
 | |
| 
 | |
| func ReadUint32(mod api.Module, ptr uint32) uint32 {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	v, ok := mod.Memory().ReadUint32Le(ptr)
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| 	return v
 | |
| }
 | |
| 
 | |
| func WriteUint8(mod api.Module, ptr uint32, v uint8) {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	ok := mod.Memory().WriteByte(ptr, v)
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func WriteUint32(mod api.Module, ptr uint32, v uint32) {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	ok := mod.Memory().WriteUint32Le(ptr, v)
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ReadUint64(mod api.Module, ptr uint32) uint64 {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	v, ok := mod.Memory().ReadUint64Le(ptr)
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| 	return v
 | |
| }
 | |
| 
 | |
| func WriteUint64(mod api.Module, ptr uint32, v uint64) {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	ok := mod.Memory().WriteUint64Le(ptr, v)
 | |
| 	if !ok {
 | |
| 		panic(RangeErr)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ReadFloat64(mod api.Module, ptr uint32) float64 {
 | |
| 	return math.Float64frombits(ReadUint64(mod, ptr))
 | |
| }
 | |
| 
 | |
| func WriteFloat64(mod api.Module, ptr uint32, v float64) {
 | |
| 	WriteUint64(mod, ptr, math.Float64bits(v))
 | |
| }
 | |
| 
 | |
| func ReadString(mod api.Module, ptr, maxlen uint32) string {
 | |
| 	if ptr == 0 {
 | |
| 		panic(NilErr)
 | |
| 	}
 | |
| 	switch maxlen {
 | |
| 	case 0:
 | |
| 		return ""
 | |
| 	case math.MaxUint32:
 | |
| 		// avoid overflow
 | |
| 	default:
 | |
| 		maxlen = maxlen + 1
 | |
| 	}
 | |
| 	mem := mod.Memory()
 | |
| 	buf, ok := mem.Read(ptr, maxlen)
 | |
| 	if !ok {
 | |
| 		buf, ok = mem.Read(ptr, mem.Size()-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 uint32, b []byte) {
 | |
| 	buf := View(mod, ptr, uint64(len(b)))
 | |
| 	copy(buf, b)
 | |
| }
 | |
| 
 | |
| func WriteString(mod api.Module, ptr uint32, s string) {
 | |
| 	buf := View(mod, ptr, uint64(len(s)+1))
 | |
| 	buf[len(s)] = 0
 | |
| 	copy(buf, s)
 | |
| }
 |