diff options
| author | 2025-04-14 09:43:56 +0200 | |
|---|---|---|
| committer | 2025-04-14 09:43:56 +0200 | |
| commit | 51b9ef5c346f333e558eca38fd954464322f3b7d (patch) | |
| tree | bf5cd0de887a27c1afc66345b1a464921d96e503 /vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go | |
| parent | [docs] Remind the user that password resets don't work without restarting. (#... (diff) | |
| download | gotosocial-51b9ef5c346f333e558eca38fd954464322f3b7d.tar.xz | |
[chore]: Bump github.com/gin-contrib/gzip from 1.2.2 to 1.2.3 (#4000)
Bumps [github.com/gin-contrib/gzip](https://github.com/gin-contrib/gzip) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/gin-contrib/gzip/releases)
- [Changelog](https://github.com/gin-contrib/gzip/blob/master/.goreleaser.yaml)
- [Commits](https://github.com/gin-contrib/gzip/compare/v1.2.2...v1.2.3)
---
updated-dependencies:
- dependency-name: github.com/gin-contrib/gzip
dependency-version: 1.2.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Diffstat (limited to 'vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go')
| -rw-r--r-- | vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go | 47 |
1 files changed, 25 insertions, 22 deletions
diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go index 0c063d55f..0285f0f8f 100644 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go +++ b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go @@ -13,32 +13,44 @@ type efaceDecoder struct { } func (d *efaceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*interface{})(vp) = interface{}(nil) - return nil - } - - eface := *(*rt.GoEface)(vp) - - // not pointer type, or nil pointer, or *interface{} - if eface.Value == nil || eface.Type.Kind() != reflect.Ptr || rt.PtrElem(eface.Type) == anyType { + /* check the defined pointer type for issue 379 */ + eface := (*rt.GoEface)(vp) + + /* + not pointer type, or nil pointer, or self-pointed interface{}, such as + ```go + var v interface{} + v = &v + return v + ``` see `issue758_test.go`. + */ + if eface.Value == nil || eface.Type.Kind() != reflect.Ptr || eface.Value == vp { ret, err := node.AsEface(ctx) if err != nil { return err } - *(*interface{})(vp) = ret return nil } + if node.IsNull() { + if eface.Type.Indirect() || (!eface.Type.Indirect() && eface.Type.Pack().Elem().Kind() != reflect.Ptr) { + *(*interface{})(vp) = nil + return nil + } + } + etp := rt.PtrElem(eface.Type) vp = eface.Value - /* check the defined pointer type for issue 379 */ if eface.Type.IsNamed() { + // check named pointer type, avoid call its `Unmarshaler` newp := vp etp = eface.Type vp = unsafe.Pointer(&newp) + } else if !eface.Type.Indirect() { + // check direct value + etp = rt.UnpackType(eface.Type.Pack().Elem()) } dec, err := findOrCompile(etp) @@ -65,19 +77,10 @@ func (d *ifaceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error } vt := iface.Itab.Vt - - // not pointer type, or nil pointer, or *interface{} - if vp == nil || vt.Kind() != reflect.Ptr || rt.PtrElem(vt) == anyType { - ret, err := node.AsEface(ctx) - if err != nil { - return err - } - - *(*interface{})(vp) = ret - return nil + if vt.Kind() != reflect.Ptr || iface.Value == nil { + return error_type(d.typ) } - etp := rt.PtrElem(vt) vp = iface.Value |
