1
2
3
4
5 package gob
6
7 import (
8 "bytes"
9 "math"
10 "reflect"
11 "unsafe"
12 )
13
14 const uint64Size = int(unsafe.Sizeof(uint64(0)))
15
16
17
18
19
20 type encoderState struct {
21 enc *Encoder
22 b *bytes.Buffer
23 sendZero bool
24 fieldnum int
25 buf [1 + uint64Size]byte
26 next *encoderState
27 }
28
29 func (enc *Encoder) newEncoderState(b *bytes.Buffer) *encoderState {
30 e := enc.freeList
31 if e == nil {
32 e = new(encoderState)
33 e.enc = enc
34 } else {
35 enc.freeList = e.next
36 }
37 e.sendZero = false
38 e.fieldnum = 0
39 e.b = b
40 return e
41 }
42
43 func (enc *Encoder) freeEncoderState(e *encoderState) {
44 e.next = enc.freeList
45 enc.freeList = e
46 }
47
48
49
50
51
52
53
54 func (state *encoderState) encodeUint(x uint64) {
55 if x <= 0x7F {
56 err := state.b.WriteByte(uint8(x))
57 if err != nil {
58 error(err)
59 }
60 return
61 }
62 var n, m int
63 m = uint64Size
64 for n = 1; x > 0; n++ {
65 state.buf[m] = uint8(x)
66 x >>= 8
67 m--
68 }
69 state.buf[m] = uint8(-(n - 1))
70 n, err := state.b.Write(state.buf[m : uint64Size+1])
71 if err != nil {
72 error(err)
73 }
74 }
75
76
77
78
79 func (state *encoderState) encodeInt(i int64) {
80 var x uint64
81 if i < 0 {
82 x = uint64(^i<<1) | 1
83 } else {
84 x = uint64(i << 1)
85 }
86 state.encodeUint(uint64(x))
87 }
88
89
90 type encOp func(i *encInstr, state *encoderState, p unsafe.Pointer)
91
92
93 type encInstr struct {
94 op encOp
95 field int
96 indir int
97 offset uintptr
98 }
99
100
101
102 func (state *encoderState) update(instr *encInstr) {
103 if instr != nil {
104 state.encodeUint(uint64(instr.field - state.fieldnum))
105 state.fieldnum = instr.field
106 }
107 }
108
109
110
111
112
113
114
115
116
117
118
119 func encIndirect(p unsafe.Pointer, indir int) unsafe.Pointer {
120 for ; indir > 0; indir-- {
121 p = *(*unsafe.Pointer)(p)
122 if p == nil {
123 return unsafe.Pointer(nil)
124 }
125 }
126 return p
127 }
128
129
130 func encBool(i *encInstr, state *encoderState, p unsafe.Pointer) {
131 b := *(*bool)(p)
132 if b || state.sendZero {
133 state.update(i)
134 if b {
135 state.encodeUint(1)
136 } else {
137 state.encodeUint(0)
138 }
139 }
140 }
141
142
143 func encInt(i *encInstr, state *encoderState, p unsafe.Pointer) {
144 v := int64(*(*int)(p))
145 if v != 0 || state.sendZero {
146 state.update(i)
147 state.encodeInt(v)
148 }
149 }
150
151
152 func encUint(i *encInstr, state *encoderState, p unsafe.Pointer) {
153 v := uint64(*(*uint)(p))
154 if v != 0 || state.sendZero {
155 state.update(i)
156 state.encodeUint(v)
157 }
158 }
159
160
161 func encInt8(i *encInstr, state *encoderState, p unsafe.Pointer) {
162 v := int64(*(*int8)(p))
163 if v != 0 || state.sendZero {
164 state.update(i)
165 state.encodeInt(v)
166 }
167 }
168
169
170 func encUint8(i *encInstr, state *encoderState, p unsafe.Pointer) {
171 v := uint64(*(*uint8)(p))
172 if v != 0 || state.sendZero {
173 state.update(i)
174 state.encodeUint(v)
175 }
176 }
177
178
179 func encInt16(i *encInstr, state *encoderState, p unsafe.Pointer) {
180 v := int64(*(*int16)(p))
181 if v != 0 || state.sendZero {
182 state.update(i)
183 state.encodeInt(v)
184 }
185 }
186
187
188 func encUint16(i *encInstr, state *encoderState, p unsafe.Pointer) {
189 v := uint64(*(*uint16)(p))
190 if v != 0 || state.sendZero {
191 state.update(i)
192 state.encodeUint(v)
193 }
194 }
195
196
197 func encInt32(i *encInstr, state *encoderState, p unsafe.Pointer) {
198 v := int64(*(*int32)(p))
199 if v != 0 || state.sendZero {
200 state.update(i)
201 state.encodeInt(v)
202 }
203 }
204
205
206 func encUint32(i *encInstr, state *encoderState, p unsafe.Pointer) {
207 v := uint64(*(*uint32)(p))
208 if v != 0 || state.sendZero {
209 state.update(i)
210 state.encodeUint(v)
211 }
212 }
213
214
215 func encInt64(i *encInstr, state *encoderState, p unsafe.Pointer) {
216 v := *(*int64)(p)
217 if v != 0 || state.sendZero {
218 state.update(i)
219 state.encodeInt(v)
220 }
221 }
222
223
224 func encUint64(i *encInstr, state *encoderState, p unsafe.Pointer) {
225 v := *(*uint64)(p)
226 if v != 0 || state.sendZero {
227 state.update(i)
228 state.encodeUint(v)
229 }
230 }
231
232
233 func encUintptr(i *encInstr, state *encoderState, p unsafe.Pointer) {
234 v := uint64(*(*uintptr)(p))
235 if v != 0 || state.sendZero {
236 state.update(i)
237 state.encodeUint(v)
238 }
239 }
240
241
242
243
244
245
246
247 func floatBits(f float64) uint64 {
248 u := math.Float64bits(f)
249 var v uint64
250 for i := 0; i < 8; i++ {
251 v <<= 8
252 v |= u & 0xFF
253 u >>= 8
254 }
255 return v
256 }
257
258
259 func encFloat32(i *encInstr, state *encoderState, p unsafe.Pointer) {
260 f := *(*float32)(p)
261 if f != 0 || state.sendZero {
262 v := floatBits(float64(f))
263 state.update(i)
264 state.encodeUint(v)
265 }
266 }
267
268
269 func encFloat64(i *encInstr, state *encoderState, p unsafe.Pointer) {
270 f := *(*float64)(p)
271 if f != 0 || state.sendZero {
272 state.update(i)
273 v := floatBits(f)
274 state.encodeUint(v)
275 }
276 }
277
278
279
280 func encComplex64(i *encInstr, state *encoderState, p unsafe.Pointer) {
281 c := *(*complex64)(p)
282 if c != 0+0i || state.sendZero {
283 rpart := floatBits(float64(real(c)))
284 ipart := floatBits(float64(imag(c)))
285 state.update(i)
286 state.encodeUint(rpart)
287 state.encodeUint(ipart)
288 }
289 }
290
291
292 func encComplex128(i *encInstr, state *encoderState, p unsafe.Pointer) {
293 c := *(*complex128)(p)
294 if c != 0+0i || state.sendZero {
295 rpart := floatBits(real(c))
296 ipart := floatBits(imag(c))
297 state.update(i)
298 state.encodeUint(rpart)
299 state.encodeUint(ipart)
300 }
301 }
302
303
304
305 func encUint8Array(i *encInstr, state *encoderState, p unsafe.Pointer) {
306 b := *(*[]byte)(p)
307 if len(b) > 0 || state.sendZero {
308 state.update(i)
309 state.encodeUint(uint64(len(b)))
310 state.b.Write(b)
311 }
312 }
313
314
315
316 func encString(i *encInstr, state *encoderState, p unsafe.Pointer) {
317 s := *(*string)(p)
318 if len(s) > 0 || state.sendZero {
319 state.update(i)
320 state.encodeUint(uint64(len(s)))
321 state.b.WriteString(s)
322 }
323 }
324
325
326
327 func encStructTerminator(i *encInstr, state *encoderState, p unsafe.Pointer) {
328 state.encodeUint(0)
329 }
330
331
332
333
334
335 type encEngine struct {
336 instr []encInstr
337 }
338
339 const singletonField = 0
340
341
342 func (enc *Encoder) encodeSingle(b *bytes.Buffer, engine *encEngine, basep uintptr) {
343 state := enc.newEncoderState(b)
344 state.fieldnum = singletonField
345
346
347 state.sendZero = true
348 instr := &engine.instr[singletonField]
349 p := unsafe.Pointer(basep)
350 if instr.indir > 0 {
351 if p = encIndirect(p, instr.indir); p == nil {
352 return
353 }
354 }
355 instr.op(instr, state, p)
356 enc.freeEncoderState(state)
357 }
358
359
360 func (enc *Encoder) encodeStruct(b *bytes.Buffer, engine *encEngine, basep uintptr) {
361 state := enc.newEncoderState(b)
362 state.fieldnum = -1
363 for i := 0; i < len(engine.instr); i++ {
364 instr := &engine.instr[i]
365 p := unsafe.Pointer(basep + instr.offset)
366 if instr.indir > 0 {
367 if p = encIndirect(p, instr.indir); p == nil {
368 continue
369 }
370 }
371 instr.op(instr, state, p)
372 }
373 enc.freeEncoderState(state)
374 }
375
376
377 func (enc *Encoder) encodeArray(b *bytes.Buffer, p uintptr, op encOp, elemWid uintptr, elemIndir int, length int) {
378 state := enc.newEncoderState(b)
379 state.fieldnum = -1
380 state.sendZero = true
381 state.encodeUint(uint64(length))
382 for i := 0; i < length; i++ {
383 elemp := p
384 up := unsafe.Pointer(elemp)
385 if elemIndir > 0 {
386 if up = encIndirect(up, elemIndir); up == nil {
387 errorf("encodeArray: nil element")
388 }
389 elemp = uintptr(up)
390 }
391 op(nil, state, unsafe.Pointer(elemp))
392 p += uintptr(elemWid)
393 }
394 enc.freeEncoderState(state)
395 }
396
397
398 func encodeReflectValue(state *encoderState, v reflect.Value, op encOp, indir int) {
399 for i := 0; i < indir && v.IsValid(); i++ {
400 v = reflect.Indirect(v)
401 }
402 if !v.IsValid() {
403 errorf("encodeReflectValue: nil element")
404 }
405 op(nil, state, unsafe.Pointer(unsafeAddr(v)))
406 }
407
408
409
410
411 func (enc *Encoder) encodeMap(b *bytes.Buffer, mv reflect.Value, keyOp, elemOp encOp, keyIndir, elemIndir int) {
412 state := enc.newEncoderState(b)
413 state.fieldnum = -1
414 state.sendZero = true
415 keys := mv.MapKeys()
416 state.encodeUint(uint64(len(keys)))
417 for _, key := range keys {
418 encodeReflectValue(state, key, keyOp, keyIndir)
419 encodeReflectValue(state, mv.MapIndex(key), elemOp, elemIndir)
420 }
421 enc.freeEncoderState(state)
422 }
423
424
425
426
427
428
429 func (enc *Encoder) encodeInterface(b *bytes.Buffer, iv reflect.Value) {
430 state := enc.newEncoderState(b)
431 state.fieldnum = -1
432 state.sendZero = true
433 if iv.IsNil() {
434 state.encodeUint(0)
435 return
436 }
437
438 ut := userType(iv.Elem().Type())
439 name, ok := concreteTypeToName[ut.base]
440 if !ok {
441 errorf("type not registered for interface: %s", ut.base)
442 }
443
444 state.encodeUint(uint64(len(name)))
445 _, err := state.b.WriteString(name)
446 if err != nil {
447 error(err)
448 }
449
450 enc.sendTypeDescriptor(enc.writer(), state, ut)
451
452 enc.sendTypeId(state, ut)
453
454
455 enc.pushWriter(b)
456 data := new(bytes.Buffer)
457 enc.encode(data, iv.Elem(), ut)
458 if enc.err != nil {
459 error(enc.err)
460 }
461 enc.popWriter()
462 enc.writeMessage(b, data)
463 if enc.err != nil {
464 error(err)
465 }
466 enc.freeEncoderState(state)
467 }
468
469
470 func isZero(val reflect.Value) bool {
471 switch val.Kind() {
472 case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
473 return val.Len() == 0
474 case reflect.Bool:
475 return !val.Bool()
476 case reflect.Complex64, reflect.Complex128:
477 return val.Complex() == 0
478 case reflect.Chan, reflect.Func, reflect.Ptr:
479 return val.IsNil()
480 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
481 return val.Int() == 0
482 case reflect.Float32, reflect.Float64:
483 return val.Float() == 0
484 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
485 return val.Uint() == 0
486 }
487 panic("unknown type in isZero " + val.Type().String())
488 }
489
490
491
492 func (enc *Encoder) encodeGobEncoder(b *bytes.Buffer, v reflect.Value) {
493
494
495 data, err := v.Interface().(GobEncoder).GobEncode()
496 if err != nil {
497 error(err)
498 }
499 state := enc.newEncoderState(b)
500 state.fieldnum = -1
501 state.encodeUint(uint64(len(data)))
502 state.b.Write(data)
503 enc.freeEncoderState(state)
504 }
505
506 var encOpTable = [...]encOp{
507 reflect.Bool: encBool,
508 reflect.Int: encInt,
509 reflect.Int8: encInt8,
510 reflect.Int16: encInt16,
511 reflect.Int32: encInt32,
512 reflect.Int64: encInt64,
513 reflect.Uint: encUint,
514 reflect.Uint8: encUint8,
515 reflect.Uint16: encUint16,
516 reflect.Uint32: encUint32,
517 reflect.Uint64: encUint64,
518 reflect.Uintptr: encUintptr,
519 reflect.Float32: encFloat32,
520 reflect.Float64: encFloat64,
521 reflect.Complex64: encComplex64,
522 reflect.Complex128: encComplex128,
523 reflect.String: encString,
524 }
525
526
527
528 func (enc *Encoder) encOpFor(rt reflect.Type, inProgress map[reflect.Type]*encOp) (*encOp, int) {
529 ut := userType(rt)
530
531 if ut.isGobEncoder {
532 return enc.gobEncodeOpFor(ut)
533 }
534
535
536 if opPtr := inProgress[rt]; opPtr != nil {
537 return opPtr, ut.indir
538 }
539 typ := ut.base
540 indir := ut.indir
541 k := typ.Kind()
542 var op encOp
543 if int(k) < len(encOpTable) {
544 op = encOpTable[k]
545 }
546 if op == nil {
547 inProgress[rt] = &op
548
549 switch t := typ; t.Kind() {
550 case reflect.Slice:
551 if t.Elem().Kind() == reflect.Uint8 {
552 op = encUint8Array
553 break
554 }
555
556 elemOp, indir := enc.encOpFor(t.Elem(), inProgress)
557 op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
558 slice := (*reflect.SliceHeader)(p)
559 if !state.sendZero && slice.Len == 0 {
560 return
561 }
562 state.update(i)
563 state.enc.encodeArray(state.b, slice.Data, *elemOp, t.Elem().Size(), indir, int(slice.Len))
564 }
565 case reflect.Array:
566
567 elemOp, indir := enc.encOpFor(t.Elem(), inProgress)
568 op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
569 state.update(i)
570 state.enc.encodeArray(state.b, uintptr(p), *elemOp, t.Elem().Size(), indir, t.Len())
571 }
572 case reflect.Map:
573 keyOp, keyIndir := enc.encOpFor(t.Key(), inProgress)
574 elemOp, elemIndir := enc.encOpFor(t.Elem(), inProgress)
575 op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
576
577
578
579 v := reflect.ValueOf(unsafe.Unreflect(t, unsafe.Pointer(p)))
580 mv := reflect.Indirect(v)
581
582
583 if !state.sendZero && mv.IsNil() {
584 return
585 }
586 state.update(i)
587 state.enc.encodeMap(state.b, mv, *keyOp, *elemOp, keyIndir, elemIndir)
588 }
589 case reflect.Struct:
590
591 enc.getEncEngine(userType(typ))
592 info := mustGetTypeInfo(typ)
593 op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
594 state.update(i)
595
596 state.enc.encodeStruct(state.b, info.encoder, uintptr(p))
597 }
598 case reflect.Interface:
599 op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
600
601
602 v := reflect.ValueOf(unsafe.Unreflect(t, unsafe.Pointer(p)))
603 iv := reflect.Indirect(v)
604 if !state.sendZero && (!iv.IsValid() || iv.IsNil()) {
605 return
606 }
607 state.update(i)
608 state.enc.encodeInterface(state.b, iv)
609 }
610 }
611 }
612 if op == nil {
613 errorf("can't happen: encode type %s", rt.String())
614 }
615 return &op, indir
616 }
617
618
619
620 func (enc *Encoder) gobEncodeOpFor(ut *userTypeInfo) (*encOp, int) {
621 rt := ut.user
622 if ut.encIndir == -1 {
623 rt = reflect.PtrTo(rt)
624 } else if ut.encIndir > 0 {
625 for i := int8(0); i < ut.encIndir; i++ {
626 rt = rt.Elem()
627 }
628 }
629 var op encOp
630 op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
631 var v reflect.Value
632 if ut.encIndir == -1 {
633
634 v = reflect.ValueOf(unsafe.Unreflect(rt, unsafe.Pointer(&p)))
635 } else {
636 v = reflect.ValueOf(unsafe.Unreflect(rt, p))
637 }
638 if !state.sendZero && isZero(v) {
639 return
640 }
641 state.update(i)
642 state.enc.encodeGobEncoder(state.b, v)
643 }
644 return &op, int(ut.encIndir)
645 }
646
647
648 func (enc *Encoder) compileEnc(ut *userTypeInfo) *encEngine {
649 srt := ut.base
650 engine := new(encEngine)
651 seen := make(map[reflect.Type]*encOp)
652 rt := ut.base
653 if ut.isGobEncoder {
654 rt = ut.user
655 }
656 if !ut.isGobEncoder &&
657 srt.Kind() == reflect.Struct {
658 for fieldNum, wireFieldNum := 0, 0; fieldNum < srt.NumField(); fieldNum++ {
659 f := srt.Field(fieldNum)
660 if !isExported(f.Name) {
661 continue
662 }
663 op, indir := enc.encOpFor(f.Type, seen)
664 engine.instr = append(engine.instr, encInstr{*op, wireFieldNum, indir, uintptr(f.Offset)})
665 wireFieldNum++
666 }
667 if srt.NumField() > 0 && len(engine.instr) == 0 {
668 errorf("type %s has no exported fields", rt)
669 }
670 engine.instr = append(engine.instr, encInstr{encStructTerminator, 0, 0, 0})
671 } else {
672 engine.instr = make([]encInstr, 1)
673 op, indir := enc.encOpFor(rt, seen)
674 engine.instr[0] = encInstr{*op, singletonField, indir, 0}
675 }
676 return engine
677 }
678
679
680
681 func (enc *Encoder) getEncEngine(ut *userTypeInfo) *encEngine {
682 info, err1 := getTypeInfo(ut)
683 if err1 != nil {
684 error(err1)
685 }
686 if info.encoder == nil {
687
688 info.encoder = new(encEngine)
689 info.encoder = enc.compileEnc(ut)
690 }
691 return info.encoder
692 }
693
694
695
696 func (enc *Encoder) lockAndGetEncEngine(ut *userTypeInfo) *encEngine {
697 typeLock.Lock()
698 defer typeLock.Unlock()
699 return enc.getEncEngine(ut)
700 }
701
702 func (enc *Encoder) encode(b *bytes.Buffer, value reflect.Value, ut *userTypeInfo) {
703 defer catchError(&enc.err)
704 engine := enc.lockAndGetEncEngine(ut)
705 indir := ut.indir
706 if ut.isGobEncoder {
707 indir = int(ut.encIndir)
708 }
709 for i := 0; i < indir; i++ {
710 value = reflect.Indirect(value)
711 }
712 if !ut.isGobEncoder && value.Type().Kind() == reflect.Struct {
713 enc.encodeStruct(b, engine, unsafeAddr(value))
714 } else {
715 enc.encodeSingle(b, engine, unsafeAddr(value))
716 }
717 }