podman
70 строк · 1.4 Кб
1package jsoniter
2
3import (
4"github.com/modern-go/reflect2"
5"reflect"
6"unsafe"
7)
8
9type dynamicEncoder struct {
10valType reflect2.Type
11}
12
13func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
14obj := encoder.valType.UnsafeIndirect(ptr)
15stream.WriteVal(obj)
16}
17
18func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool {
19return encoder.valType.UnsafeIndirect(ptr) == nil
20}
21
22type efaceDecoder struct {
23}
24
25func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
26pObj := (*interface{})(ptr)
27obj := *pObj
28if obj == nil {
29*pObj = iter.Read()
30return
31}
32typ := reflect2.TypeOf(obj)
33if typ.Kind() != reflect.Ptr {
34*pObj = iter.Read()
35return
36}
37ptrType := typ.(*reflect2.UnsafePtrType)
38ptrElemType := ptrType.Elem()
39if iter.WhatIsNext() == NilValue {
40if ptrElemType.Kind() != reflect.Ptr {
41iter.skipFourBytes('n', 'u', 'l', 'l')
42*pObj = nil
43return
44}
45}
46if reflect2.IsNil(obj) {
47obj := ptrElemType.New()
48iter.ReadVal(obj)
49*pObj = obj
50return
51}
52iter.ReadVal(obj)
53}
54
55type ifaceDecoder struct {
56valType *reflect2.UnsafeIFaceType
57}
58
59func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
60if iter.ReadNil() {
61decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew())
62return
63}
64obj := decoder.valType.UnsafeIndirect(ptr)
65if reflect2.IsNil(obj) {
66iter.ReportError("decode non empty interface", "can not unmarshal into nil")
67return
68}
69iter.ReadVal(obj)
70}
71