diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/internal')
6 files changed, 82 insertions, 59 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go index 468ff741c..e705f3181 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go @@ -7,9 +7,6 @@ import ( "github.com/tetratelabs/wazero/api" ) -type i32 interface{ ~int32 | ~uint32 } -type i64 interface{ ~int64 | ~uint64 } - type funcVI[T0 i32] func(context.Context, api.Module, T0) func (fn funcVI[T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go index e4e338549..f9f39b449 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go @@ -20,7 +20,7 @@ func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { s.holes = 0 } -func GetHandle(ctx context.Context, id uint32) any { +func GetHandle(ctx context.Context, id Ptr_t) any { if id == 0 { return nil } @@ -28,14 +28,14 @@ func GetHandle(ctx context.Context, id uint32) any { return s.handles[^id] } -func DelHandle(ctx context.Context, id uint32) error { +func DelHandle(ctx context.Context, id Ptr_t) error { if id == 0 { return nil } s := ctx.Value(moduleKey{}).(*moduleState) a := s.handles[^id] s.handles[^id] = nil - if l := uint32(len(s.handles)); l == ^id { + if l := Ptr_t(len(s.handles)); l == ^id { s.handles = s.handles[:l-1] } else { s.holes++ @@ -46,7 +46,7 @@ func DelHandle(ctx context.Context, id uint32) error { return nil } -func AddHandle(ctx context.Context, a any) uint32 { +func AddHandle(ctx context.Context, a any) Ptr_t { if a == nil { panic(NilErr) } @@ -59,12 +59,12 @@ func AddHandle(ctx context.Context, a any) uint32 { if h == nil { s.holes-- s.handles[id] = a - return ^uint32(id) + return ^Ptr_t(id) } } } // Add a new slot. s.handles = append(s.handles, a) - return -uint32(len(s.handles)) + return -Ptr_t(len(s.handles)) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go index 7f6849a42..846237405 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go @@ -2,6 +2,7 @@ package util import ( "encoding/json" + "math" "strconv" "time" "unsafe" @@ -20,7 +21,7 @@ func (j JSON) Scan(value any) error { case int64: buf = strconv.AppendInt(nil, v, 10) case float64: - buf = strconv.AppendFloat(nil, v, 'g', -1, 64) + buf = AppendNumber(nil, v) case time.Time: buf = append(buf, '"') buf = v.AppendFormat(buf, time.RFC3339Nano) @@ -33,3 +34,17 @@ func (j JSON) Scan(value any) error { return json.Unmarshal(buf, j.Value) } + +func AppendNumber(dst []byte, f float64) []byte { + switch { + case math.IsNaN(f): + dst = append(dst, "null"...) + case math.IsInf(f, 1): + dst = append(dst, "9.0e999"...) + case math.IsInf(f, -1): + dst = append(dst, "-9.0e999"...) + default: + return strconv.AppendFloat(dst, f, 'g', -1, 64) + } + return dst +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go index a09523fd1..bfb1a6440 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go @@ -7,110 +7,121 @@ import ( "github.com/tetratelabs/wazero/api" ) -func View(mod api.Module, ptr uint32, size uint64) []byte { +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 > math.MaxUint32 { - panic(RangeErr) - } if size == 0 { return nil } - buf, ok := mod.Memory().Read(ptr, uint32(size)) + if uint64(size) > math.MaxUint32 { + panic(RangeErr) + } + buf, ok := mod.Memory().Read(uint32(ptr), uint32(size)) if !ok { panic(RangeErr) } return buf } -func ReadUint8(mod api.Module, ptr uint32) uint8 { +func Read[T i8](mod api.Module, ptr Ptr_t) T { if ptr == 0 { panic(NilErr) } - v, ok := mod.Memory().ReadByte(ptr) + v, ok := mod.Memory().ReadByte(uint32(ptr)) if !ok { panic(RangeErr) } - return v + return T(v) } -func ReadUint32(mod api.Module, ptr uint32) uint32 { +func Write[T i8](mod api.Module, ptr Ptr_t, v T) { if ptr == 0 { panic(NilErr) } - v, ok := mod.Memory().ReadUint32Le(ptr) + ok := mod.Memory().WriteByte(uint32(ptr), uint8(v)) if !ok { panic(RangeErr) } - return v } -func WriteUint8(mod api.Module, ptr uint32, v uint8) { +func Read32[T i32](mod api.Module, ptr Ptr_t) T { if ptr == 0 { panic(NilErr) } - ok := mod.Memory().WriteByte(ptr, v) + v, ok := mod.Memory().ReadUint32Le(uint32(ptr)) if !ok { panic(RangeErr) } + return T(v) } -func WriteUint32(mod api.Module, ptr uint32, v uint32) { +func Write32[T i32](mod api.Module, ptr Ptr_t, v T) { if ptr == 0 { panic(NilErr) } - ok := mod.Memory().WriteUint32Le(ptr, v) + ok := mod.Memory().WriteUint32Le(uint32(ptr), uint32(v)) if !ok { panic(RangeErr) } } -func ReadUint64(mod api.Module, ptr uint32) uint64 { +func Read64[T i64](mod api.Module, ptr Ptr_t) T { if ptr == 0 { panic(NilErr) } - v, ok := mod.Memory().ReadUint64Le(ptr) + v, ok := mod.Memory().ReadUint64Le(uint32(ptr)) if !ok { panic(RangeErr) } - return v + return T(v) } -func WriteUint64(mod api.Module, ptr uint32, v uint64) { +func Write64[T i64](mod api.Module, ptr Ptr_t, v T) { if ptr == 0 { panic(NilErr) } - ok := mod.Memory().WriteUint64Le(ptr, v) + ok := mod.Memory().WriteUint64Le(uint32(ptr), uint64(v)) if !ok { panic(RangeErr) } } -func ReadFloat64(mod api.Module, ptr uint32) float64 { - return math.Float64frombits(ReadUint64(mod, ptr)) +func ReadFloat64(mod api.Module, ptr Ptr_t) float64 { + return math.Float64frombits(Read64[uint64](mod, ptr)) } -func WriteFloat64(mod api.Module, ptr uint32, v float64) { - WriteUint64(mod, ptr, math.Float64bits(v)) +func WriteFloat64(mod api.Module, ptr Ptr_t, v float64) { + Write64(mod, ptr, math.Float64bits(v)) } -func ReadString(mod api.Module, ptr, maxlen uint32) string { +func ReadString(mod api.Module, ptr Ptr_t, maxlen int64) string { if ptr == 0 { panic(NilErr) } - switch maxlen { - case 0: + if maxlen <= 0 { return "" - case math.MaxUint32: - // avoid overflow - default: - maxlen = maxlen + 1 } mem := mod.Memory() - buf, ok := mem.Read(ptr, maxlen) + maxlen = min(maxlen, math.MaxInt32-1) + 1 + buf, ok := mem.Read(uint32(ptr), uint32(maxlen)) if !ok { - buf, ok = mem.Read(ptr, mem.Size()-ptr) + buf, ok = mem.Read(uint32(ptr), mem.Size()-uint32(ptr)) if !ok { panic(RangeErr) } @@ -122,13 +133,13 @@ func ReadString(mod api.Module, ptr, maxlen uint32) string { } } -func WriteBytes(mod api.Module, ptr uint32, b []byte) { - buf := View(mod, ptr, uint64(len(b))) +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 uint32, s string) { - buf := View(mod, ptr, uint64(len(s)+1)) +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) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go index 4ff056666..42a247529 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go @@ -25,9 +25,9 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped // Allocate page aligned memmory. alloc := mod.ExportedFunction("aligned_alloc") - stack := [...]uint64{ - uint64(unix.Getpagesize()), - uint64(size), + stack := [...]Stk_t{ + Stk_t(unix.Getpagesize()), + Stk_t(size), } if err := alloc.CallWithStack(ctx, stack[:]); err != nil { panic(err) @@ -37,20 +37,20 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped } // Save the newly allocated region. - ptr := uint32(stack[0]) - buf := View(mod, ptr, uint64(size)) - res := &MappedRegion{ + ptr := Ptr_t(stack[0]) + buf := View(mod, ptr, int64(size)) + ret := &MappedRegion{ Ptr: ptr, size: size, addr: unsafe.Pointer(&buf[0]), } - s.regions = append(s.regions, res) - return res + s.regions = append(s.regions, ret) + return ret } type MappedRegion struct { addr unsafe.Pointer - Ptr uint32 + Ptr Ptr_t size int32 used bool } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go index efff1e733..913a5f733 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go @@ -29,13 +29,13 @@ func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, si return nil, err } - res := &MappedRegion{Handle: h, addr: a} + ret := &MappedRegion{Handle: h, addr: a} // SliceHeader, although deprecated, avoids a go vet warning. - sh := (*reflect.SliceHeader)(unsafe.Pointer(&res.Data)) + sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data)) sh.Len = int(size) sh.Cap = int(size) sh.Data = a - return res, nil + return ret, nil } func (r *MappedRegion) Unmap() error { |