summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/internal/encoder/alg
diff options
context:
space:
mode:
authorLibravatar kim <grufwub@gmail.com>2025-10-13 16:49:53 +0200
committerLibravatar tobi <tobi.smethurst@protonmail.com>2025-10-17 15:32:55 +0200
commitea7eeada77a52fd58a9e1a949a39eccc7bce955a (patch)
treeede9f651d0bd7782b565883f9384341530f8320f /vendor/github.com/bytedance/sonic/internal/encoder/alg
parent[bugfix] repeated posts on timeline endpoints (#4494) (diff)
downloadgotosocial-ea7eeada77a52fd58a9e1a949a39eccc7bce955a.tar.xz
[chore] update dependencies (#4495)
- github.com/coreos/go-oidc/v3: v3.15.0 -> v3.16.0 - github.com/go-playground/form/v4: v4.2.1 -> v4.3.0 - github.com/go-swagger/go-swagger: v0.32.3 -> v0.33.1 - golang.org/x/crypto: v0.42.0 -> v0.43.0 - golang.org/x/image: v0.31.0 -> v0.32.0 - golang.org/x/net: v0.45.0 -> v0.46.0 - golang.org/x/oauth2: v0.31.0 -> v0.32.0 - golang.org/x/sys: v0.36.0 -> v0.37.0 - golang.org/x/text: v0.29.0 -> v0.30.0 - modernc.org/sqlite: v1.39.0 -> v1.39.1 (w/ concurrency workaround) Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4495 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
Diffstat (limited to 'vendor/github.com/bytedance/sonic/internal/encoder/alg')
-rw-r--r--vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go109
-rw-r--r--vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go104
-rw-r--r--vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go11
-rw-r--r--vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go2
4 files changed, 101 insertions, 125 deletions
diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go
index 090afac13..4664d90ca 100644
--- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go
+++ b/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go
@@ -84,15 +84,24 @@ func (self *MapIterator) data() (p []_MapPair) {
func (self *MapIterator) append(t *rt.GoType, k unsafe.Pointer, v unsafe.Pointer) (err error) {
p := self.add()
p.v = v
+ tk := t.Kind()
- /* check for strings */
- if tk := t.Kind(); tk != reflect.String {
- return self.appendGeneric(p, t, tk, k)
+ // followed as `encoding/json/emcode.go:resolveKeyName
+ if tk == reflect.String {
+ p.k = *(*string)(k)
+ return nil
}
- /* fast path for strings */
- p.k = *(*string)(k)
- return nil
+ // check if the key implements the encoding.TextMarshaler interface
+ if t.Pack().Implements(vars.EncodingTextMarshalerType) {
+ if tk != reflect.Interface {
+ return self.appendConcrete(p, t, k)
+ } else {
+ return self.appendInterface(p, t, k)
+ }
+ }
+
+ return self.appendGeneric(p, t, tk, k)
}
func (self *MapIterator) appendGeneric(p *_MapPair, t *rt.GoType, v reflect.Kind, k unsafe.Pointer) error {
@@ -109,34 +118,43 @@ func (self *MapIterator) appendGeneric(p *_MapPair, t *rt.GoType, v reflect.Kind
case reflect.Uint64 : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uint64)(k)), 10)) ; return nil
case reflect.Uintptr : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uintptr)(k)), 10)) ; return nil
case reflect.Bool : if *(*bool)(k) { p.k = "true" } else { p.k = "false" }; return nil
- case reflect.Interface : return self.appendInterface(p, t, k)
- case reflect.Struct, reflect.Ptr : return self.appendConcrete(p, t, k)
- default : panic("unexpected map key type")
+ default : return vars.Error_type(t.Pack())
}
}
-func (self *MapIterator) appendConcrete(p *_MapPair, t *rt.GoType, k unsafe.Pointer) (err error) {
+func (self *MapIterator) appendConcrete(p *_MapPair, t *rt.GoType, k unsafe.Pointer) error {
// compiler has already checked that the type implements the encoding.MarshalText interface
if !t.Indirect() {
k = *(*unsafe.Pointer)(k)
}
+
+ // check the TextMarshaler interface
eface := rt.GoEface{Value: k, Type: t}.Pack()
- out, err := eface.(encoding.TextMarshaler).MarshalText()
+ e, ok := eface.(encoding.TextMarshaler)
+ if !ok {
+ return vars.Error_type(t.Pack())
+ }
+
+ // check for nil pointer
+ if t.Kind() == reflect.Ptr && k == nil {
+ p.k = ""
+ return nil
+ }
+
+ out, err := e.MarshalText()
if err != nil {
return err
}
p.k = rt.Mem2Str(out)
- return
+ return nil
}
func (self *MapIterator) appendInterface(p *_MapPair, t *rt.GoType, k unsafe.Pointer) (err error) {
if len(rt.IfaceType(t).Methods) == 0 {
panic("unexpected map key type")
- } else if p.k, err = asText(k); err == nil {
- return nil
- } else {
- return
}
+ p.k, err = asText(k)
+ return
}
func IteratorStop(p *MapIterator) {
@@ -206,3 +224,62 @@ func asText(v unsafe.Pointer) (string, error) {
r, e := (*(*encoding.TextMarshaler)(unsafe.Pointer(&text))).MarshalText()
return rt.Mem2Str(r), e
}
+
+func IsValidNumber(s string) bool {
+ // This function implements the JSON numbers grammar.
+ // See https://tools.ietf.org/html/rfc7159#section-6
+ // and https://www.json.org/img/number.png
+
+ if s == "" {
+ return false
+ }
+
+ // Optional -
+ if s[0] == '-' {
+ s = s[1:]
+ if s == "" {
+ return false
+ }
+ }
+
+ // Digits
+ switch {
+ default:
+ return false
+
+ case s[0] == '0':
+ s = s[1:]
+
+ case '1' <= s[0] && s[0] <= '9':
+ s = s[1:]
+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
+ s = s[1:]
+ }
+ }
+
+ // . followed by 1 or more digits.
+ if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
+ s = s[2:]
+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
+ s = s[1:]
+ }
+ }
+
+ // e or E followed by an optional - or + and
+ // 1 or more digits.
+ if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
+ s = s[1:]
+ if s[0] == '+' || s[0] == '-' {
+ s = s[1:]
+ if s == "" {
+ return false
+ }
+ }
+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
+ s = s[1:]
+ }
+ }
+
+ // Make sure we are at the end.
+ return s == ""
+}
diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go
deleted file mode 100644
index e2610fbc8..000000000
--- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * Copyright 2024 ByteDance Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package alg
-
-import (
- "encoding"
- "encoding/json"
- "reflect"
- "unsafe"
-
- "github.com/bytedance/sonic/internal/encoder/vars"
- "github.com/bytedance/sonic/internal/resolver"
- "github.com/bytedance/sonic/internal/rt"
-)
-
-func Compact(p *[]byte, v []byte) error {
- buf := vars.NewBuffer()
- err := json.Compact(buf, v)
-
- /* check for errors */
- if err != nil {
- return err
- }
-
- /* add to result */
- v = buf.Bytes()
- *p = append(*p, v...)
-
- /* return the buffer into pool */
- vars.FreeBuffer(buf)
- return nil
-}
-
-func EncodeNil(rb *[]byte) error {
- *rb = append(*rb, 'n', 'u', 'l', 'l')
- return nil
-}
-
-// func Make_EncodeTypedPointer(computor func(*rt.GoType, ...interface{}) (interface{}, error)) func(*[]byte, *rt.GoType, *unsafe.Pointer, *vars.Stack, uint64) error {
-// return func(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error {
-// if vt == nil {
-// return EncodeNil(buf)
-// } else if fn, err := vars.FindOrCompile(vt, (fv&(1<<BitPointerValue)) != 0, computor); err != nil {
-// return err
-// } else if vt.Indirect() {
-// err := fn(buf, *vp, sb, fv)
-// return err
-// } else {
-// err := fn(buf, unsafe.Pointer(vp), sb, fv)
-// return err
-// }
-// }
-// }
-
-func EncodeJsonMarshaler(buf *[]byte, val json.Marshaler, opt uint64) error {
- if ret, err := val.MarshalJSON(); err != nil {
- return err
- } else {
- if opt&(1<<BitCompactMarshaler) != 0 {
- return Compact(buf, ret)
- }
- if opt&(1<<BitNoValidateJSONMarshaler) == 0 {
- if ok, s := Valid(ret); !ok {
- return vars.Error_marshaler(ret, s)
- }
- }
- *buf = append(*buf, ret...)
- return nil
- }
-}
-
-func EncodeTextMarshaler(buf *[]byte, val encoding.TextMarshaler, opt uint64) error {
- if ret, err := val.MarshalText(); err != nil {
- return err
- } else {
- if opt&(1<<BitNoQuoteTextMarshaler) != 0 {
- *buf = append(*buf, ret...)
- return nil
- }
- *buf = Quote(*buf, rt.Mem2Str(ret), false)
- return nil
- }
-}
-
-func IsZero(val unsafe.Pointer, fv *resolver.FieldMeta) bool {
- rv := reflect.NewAt(fv.Type, val).Elem()
- b1 := fv.IsZero == nil && rv.IsZero()
- b2 := fv.IsZero != nil && fv.IsZero(rv)
- return b1 || b2
-}
diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go
index ecdbfb7bd..f98914961 100644
--- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go
+++ b/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go
@@ -1,5 +1,5 @@
-//go:build (amd64 && go1.16 && !go1.25) || (arm64 && go1.20 && !go1.25)
-// +build amd64,go1.16,!go1.25 arm64,go1.20,!go1.25
+//go:build (amd64 && go1.16 && !go1.26) || (arm64 && go1.20 && !go1.26)
+// +build amd64,go1.16,!go1.26 arm64,go1.20,!go1.26
/**
* Copyright 2024 ByteDance Inc.
@@ -61,7 +61,6 @@ func Valid(data []byte) (ok bool, start int) {
var typeByte = rt.UnpackEface(byte(0)).Type
-//go:nocheckptr
func Quote(buf []byte, val string, double bool) []byte {
if len(val) == 0 {
if double {
@@ -77,6 +76,8 @@ func Quote(buf []byte, val string, double bool) []byte {
}
sp := rt.IndexChar(val, 0)
nb := len(val)
+
+ buf = rt.GuardSlice2(buf, nb+1)
b := (*rt.GoSlice)(unsafe.Pointer(&buf))
// input buffer
@@ -104,7 +105,9 @@ func Quote(buf []byte, val string, double bool) []byte {
ret = ^ret
// update input buffer
nb -= ret
- sp = unsafe.Pointer(uintptr(sp) + uintptr(ret))
+ if nb > 0 {
+ sp = unsafe.Pointer(uintptr(sp) + uintptr(ret))
+ }
}
runtime.KeepAlive(buf)
diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go
index cd8369834..cd9beab04 100644
--- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go
+++ b/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go
@@ -1,4 +1,4 @@
-// +build !amd64,!arm64 go1.25 !go1.16 arm64,!go1.20
+// +build !amd64,!arm64 go1.26 !go1.16 arm64,!go1.20
/**
* Copyright 2024 ByteDance Inc.