summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go
diff options
context:
space:
mode:
authorLibravatar dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>2025-04-14 09:43:56 +0200
committerLibravatar GitHub <noreply@github.com>2025-04-14 09:43:56 +0200
commit51b9ef5c346f333e558eca38fd954464322f3b7d (patch)
treebf5cd0de887a27c1afc66345b1a464921d96e503 /vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go
parent[docs] Remind the user that password resets don't work without restarting. (#... (diff)
downloadgotosocial-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.go47
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