Source file src/pkg/encoding/gob/decoder.go
1
2
3
4
5 package gob
6
7 import (
8 "bufio"
9 "bytes"
10 "errors"
11 "io"
12 "reflect"
13 "sync"
14 )
15
16
17
18 type Decoder struct {
19 mutex sync.Mutex
20 r io.Reader
21 buf bytes.Buffer
22 wireType map[typeId]*wireType
23 decoderCache map[reflect.Type]map[typeId]**decEngine
24 ignorerCache map[typeId]**decEngine
25 freeList *decoderState
26 countBuf []byte
27 tmp []byte
28 err error
29 }
30
31
32
33
34 func NewDecoder(r io.Reader) *Decoder {
35 dec := new(Decoder)
36
37 if _, ok := r.(io.ByteReader); !ok {
38 r = bufio.NewReader(r)
39 }
40 dec.r = r
41 dec.wireType = make(map[typeId]*wireType)
42 dec.decoderCache = make(map[reflect.Type]map[typeId]**decEngine)
43 dec.ignorerCache = make(map[typeId]**decEngine)
44 dec.countBuf = make([]byte, 9)
45
46 return dec
47 }
48
49
50 func (dec *Decoder) recvType(id typeId) {
51
52 if id < firstUserId || dec.wireType[id] != nil {
53 dec.err = errors.New("gob: duplicate type received")
54 return
55 }
56
57
58 wire := new(wireType)
59 dec.decodeValue(tWireType, reflect.ValueOf(wire))
60 if dec.err != nil {
61 return
62 }
63
64 dec.wireType[id] = wire
65 }
66
67 var errBadCount = errors.New("invalid message length")
68
69
70
71 func (dec *Decoder) recvMessage() bool {
72
73 nbytes, _, err := decodeUintReader(dec.r, dec.countBuf)
74 if err != nil {
75 dec.err = err
76 return false
77 }
78
79
80 if nbytes >= 1<<30 {
81 dec.err = errBadCount
82 return false
83 }
84 dec.readMessage(int(nbytes))
85 return dec.err == nil
86 }
87
88
89 func (dec *Decoder) readMessage(nbytes int) {
90
91 const maxBuf = 10 * 1024
92 nTmp := nbytes
93 if nTmp > maxBuf {
94 nTmp = maxBuf
95 }
96 if cap(dec.tmp) < nTmp {
97 nAlloc := nTmp + 100
98 if nAlloc > maxBuf {
99 nAlloc = maxBuf
100 }
101 dec.tmp = make([]byte, nAlloc)
102 }
103 dec.tmp = dec.tmp[:nTmp]
104
105
106 dec.buf.Grow(nbytes)
107 for nbytes > 0 {
108 if nbytes < nTmp {
109 dec.tmp = dec.tmp[:nbytes]
110 }
111 var nRead int
112 nRead, dec.err = io.ReadFull(dec.r, dec.tmp)
113 if dec.err != nil {
114 if dec.err == io.EOF {
115 dec.err = io.ErrUnexpectedEOF
116 }
117 return
118 }
119 dec.buf.Write(dec.tmp)
120 nbytes -= nRead
121 }
122 }
123
124
125 func toInt(x uint64) int64 {
126 i := int64(x >> 1)
127 if x&1 != 0 {
128 i = ^i
129 }
130 return i
131 }
132
133 func (dec *Decoder) nextInt() int64 {
134 n, _, err := decodeUintReader(&dec.buf, dec.countBuf)
135 if err != nil {
136 dec.err = err
137 }
138 return toInt(n)
139 }
140
141 func (dec *Decoder) nextUint() uint64 {
142 n, _, err := decodeUintReader(&dec.buf, dec.countBuf)
143 if err != nil {
144 dec.err = err
145 }
146 return n
147 }
148
149
150
151
152
153
154
155
156 func (dec *Decoder) decodeTypeSequence(isInterface bool) typeId {
157 for dec.err == nil {
158 if dec.buf.Len() == 0 {
159 if !dec.recvMessage() {
160 break
161 }
162 }
163
164 id := typeId(dec.nextInt())
165 if id >= 0 {
166
167 return id
168 }
169
170 dec.recvType(-id)
171
172
173
174
175 if dec.buf.Len() > 0 {
176 if !isInterface {
177 dec.err = errors.New("extra data in buffer")
178 break
179 }
180 dec.nextUint()
181 }
182 }
183 return -1
184 }
185
186
187
188
189
190
191 func (dec *Decoder) Decode(e interface{}) error {
192 if e == nil {
193 return dec.DecodeValue(reflect.Value{})
194 }
195 value := reflect.ValueOf(e)
196
197
198 if value.Type().Kind() != reflect.Ptr {
199 dec.err = errors.New("gob: attempt to decode into a non-pointer")
200 return dec.err
201 }
202 return dec.DecodeValue(value)
203 }
204
205
206
207
208
209 func (dec *Decoder) DecodeValue(v reflect.Value) error {
210 if v.IsValid() {
211 if v.Kind() == reflect.Ptr && !v.IsNil() {
212
213 } else if !v.CanSet() {
214 return errors.New("gob: DecodeValue of unassignable value")
215 }
216 }
217
218 dec.mutex.Lock()
219 defer dec.mutex.Unlock()
220
221 dec.buf.Reset()
222 dec.err = nil
223 id := dec.decodeTypeSequence(false)
224 if dec.err == nil {
225 dec.decodeValue(id, v)
226 }
227 return dec.err
228 }
229
230
231
232
233 var debugFunc func(io.Reader)
View as plain text