1
2
3
4
5 package gob
6
7 import (
8 "bufio"
9 "bytes"
10 "io"
11 "os"
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 os.Error
29 }
30
31
32 func NewDecoder(r io.Reader) *Decoder {
33 dec := new(Decoder)
34 dec.r = bufio.NewReader(r)
35 dec.wireType = make(map[typeId]*wireType)
36 dec.decoderCache = make(map[reflect.Type]map[typeId]**decEngine)
37 dec.ignorerCache = make(map[typeId]**decEngine)
38 dec.countBuf = make([]byte, 9)
39
40 return dec
41 }
42
43
44 func (dec *Decoder) recvType(id typeId) {
45
46 if id < firstUserId || dec.wireType[id] != nil {
47 dec.err = os.NewError("gob: duplicate type received")
48 return
49 }
50
51
52 wire := new(wireType)
53 dec.decodeValue(tWireType, reflect.ValueOf(wire))
54 if dec.err != nil {
55 return
56 }
57
58 dec.wireType[id] = wire
59 }
60
61
62
63 func (dec *Decoder) recvMessage() bool {
64
65 nbytes, _, err := decodeUintReader(dec.r, dec.countBuf)
66 if err != nil {
67 dec.err = err
68 return false
69 }
70 dec.readMessage(int(nbytes))
71 return dec.err == nil
72 }
73
74
75 func (dec *Decoder) readMessage(nbytes int) {
76
77 if cap(dec.tmp) < nbytes {
78 dec.tmp = make([]byte, nbytes+100)
79 }
80 dec.tmp = dec.tmp[:nbytes]
81
82
83 _, dec.err = io.ReadFull(dec.r, dec.tmp)
84 if dec.err != nil {
85 if dec.err == os.EOF {
86 dec.err = io.ErrUnexpectedEOF
87 }
88 return
89 }
90 dec.buf.Write(dec.tmp)
91 }
92
93
94 func toInt(x uint64) int64 {
95 i := int64(x >> 1)
96 if x&1 != 0 {
97 i = ^i
98 }
99 return i
100 }
101
102 func (dec *Decoder) nextInt() int64 {
103 n, _, err := decodeUintReader(&dec.buf, dec.countBuf)
104 if err != nil {
105 dec.err = err
106 }
107 return toInt(n)
108 }
109
110 func (dec *Decoder) nextUint() uint64 {
111 n, _, err := decodeUintReader(&dec.buf, dec.countBuf)
112 if err != nil {
113 dec.err = err
114 }
115 return n
116 }
117
118
119
120
121
122
123
124
125 func (dec *Decoder) decodeTypeSequence(isInterface bool) typeId {
126 for dec.err == nil {
127 if dec.buf.Len() == 0 {
128 if !dec.recvMessage() {
129 break
130 }
131 }
132
133 id := typeId(dec.nextInt())
134 if id >= 0 {
135
136 return id
137 }
138
139 dec.recvType(-id)
140
141
142
143
144 if dec.buf.Len() > 0 {
145 if !isInterface {
146 dec.err = os.NewError("extra data in buffer")
147 break
148 }
149 dec.nextUint()
150 }
151 }
152 return -1
153 }
154
155
156
157
158
159
160 func (dec *Decoder) Decode(e interface{}) os.Error {
161 if e == nil {
162 return dec.DecodeValue(reflect.Value{})
163 }
164 value := reflect.ValueOf(e)
165
166
167 if value.Type().Kind() != reflect.Ptr {
168 dec.err = os.NewError("gob: attempt to decode into a non-pointer")
169 return dec.err
170 }
171 return dec.DecodeValue(value)
172 }
173
174
175
176
177
178 func (dec *Decoder) DecodeValue(v reflect.Value) os.Error {
179 if v.IsValid() {
180 if v.Kind() == reflect.Ptr && !v.IsNil() {
181
182 } else if !v.CanSet() {
183 return os.NewError("gob: DecodeValue of unassignable value")
184 }
185 }
186
187 dec.mutex.Lock()
188 defer dec.mutex.Unlock()
189
190 dec.buf.Reset()
191 dec.err = nil
192 id := dec.decodeTypeSequence(false)
193 if dec.err == nil {
194 dec.decodeValue(id, v)
195 }
196 return dec.err
197 }
198
199
200
201
202 var debugFunc func(io.Reader)