1
2
3
4
5
6
7 package codec
8
9 import (
10
11 "math"
12 "reflect"
13 "sync/atomic"
14 "time"
15 )
16
17
18
19
20 const safeMode = true
21
22 const transientSizeMax = 0
23 const transientValueHasStringSlice = true
24
25 func byteAt(b []byte, index uint) byte {
26 return b[index]
27 }
28
29 func setByteAt(b []byte, index uint, val byte) {
30 b[index] = val
31 }
32
33 func byteSliceOf(b []byte, start, end uint) []byte {
34 return b[start:end]
35 }
36
37
38
39
40
41 func stringView(v []byte) string {
42 return string(v)
43 }
44
45 func bytesView(v string) []byte {
46 return []byte(v)
47 }
48
49 func byteSliceSameData(v1 []byte, v2 []byte) bool {
50 return cap(v1) != 0 && cap(v2) != 0 && &(v1[:1][0]) == &(v2[:1][0])
51 }
52
53 func okBytes2(b []byte) (v [2]byte) {
54 copy(v[:], b)
55 return
56 }
57
58 func okBytes3(b []byte) (v [3]byte) {
59 copy(v[:], b)
60 return
61 }
62
63 func okBytes4(b []byte) (v [4]byte) {
64 copy(v[:], b)
65 return
66 }
67
68 func okBytes8(b []byte) (v [8]byte) {
69 copy(v[:], b)
70 return
71 }
72
73 func isNil(v interface{}) (rv reflect.Value, isnil bool) {
74 rv = reflect.ValueOf(v)
75 if isnilBitset.isset(byte(rv.Kind())) {
76 isnil = rv.IsNil()
77 }
78 return
79 }
80
81 func eq4i(i0, i1 interface{}) bool {
82 return i0 == i1
83 }
84
85 func rv4iptr(i interface{}) reflect.Value { return reflect.ValueOf(i) }
86 func rv4istr(i interface{}) reflect.Value { return reflect.ValueOf(i) }
87
88
89
90
91 func rv2i(rv reflect.Value) interface{} {
92 return rv.Interface()
93 }
94
95 func rvAddr(rv reflect.Value, ptrType reflect.Type) reflect.Value {
96 return rv.Addr()
97 }
98
99 func rvIsNil(rv reflect.Value) bool {
100 return rv.IsNil()
101 }
102
103 func rvSetSliceLen(rv reflect.Value, length int) {
104 rv.SetLen(length)
105 }
106
107 func rvZeroAddrK(t reflect.Type, k reflect.Kind) reflect.Value {
108 return reflect.New(t).Elem()
109 }
110
111 func rvZeroK(t reflect.Type, k reflect.Kind) reflect.Value {
112 return reflect.Zero(t)
113 }
114
115 func rvConvert(v reflect.Value, t reflect.Type) (rv reflect.Value) {
116
117
118 if v.CanAddr() {
119 return v.Addr().Convert(reflect.PtrTo(t)).Elem()
120 }
121 return v.Convert(t)
122 }
123
124 func rt2id(rt reflect.Type) uintptr {
125 return reflect.ValueOf(rt).Pointer()
126 }
127
128 func i2rtid(i interface{}) uintptr {
129 return reflect.ValueOf(reflect.TypeOf(i)).Pointer()
130 }
131
132
133
134 func isEmptyValue(v reflect.Value, tinfos *TypeInfos, recursive bool) bool {
135 switch v.Kind() {
136 case reflect.Invalid:
137 return true
138 case reflect.String:
139 return v.Len() == 0
140 case reflect.Array:
141
142
143
144
145 for i, vlen := 0, v.Len(); i < vlen; i++ {
146 if !isEmptyValue(v.Index(i), tinfos, false) {
147 return false
148 }
149 }
150 return true
151 case reflect.Map, reflect.Slice, reflect.Chan:
152 return v.IsNil() || v.Len() == 0
153 case reflect.Bool:
154 return !v.Bool()
155 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
156 return v.Int() == 0
157 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
158 return v.Uint() == 0
159 case reflect.Complex64, reflect.Complex128:
160 c := v.Complex()
161 return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
162 case reflect.Float32, reflect.Float64:
163 return v.Float() == 0
164 case reflect.Func, reflect.UnsafePointer:
165 return v.IsNil()
166 case reflect.Interface, reflect.Ptr:
167 isnil := v.IsNil()
168 if recursive && !isnil {
169 return isEmptyValue(v.Elem(), tinfos, recursive)
170 }
171 return isnil
172 case reflect.Struct:
173 return isEmptyStruct(v, tinfos, recursive)
174 }
175 return false
176 }
177
178
179
180
181
182
183 func isEmptyStruct(v reflect.Value, tinfos *TypeInfos, recursive bool) bool {
184
185
186
187
188 vt := v.Type()
189 rtid := rt2id(vt)
190 if tinfos == nil {
191 tinfos = defTypeInfos
192 }
193 ti := tinfos.get(rtid, vt)
194 if ti.rtid == timeTypId {
195 return rv2i(v).(time.Time).IsZero()
196 }
197 if ti.flagIsZeroer {
198 return rv2i(v).(isZeroer).IsZero()
199 }
200 if ti.flagIsZeroerPtr && v.CanAddr() {
201 return rv2i(v.Addr()).(isZeroer).IsZero()
202 }
203 if ti.flagIsCodecEmptyer {
204 return rv2i(v).(isCodecEmptyer).IsCodecEmpty()
205 }
206 if ti.flagIsCodecEmptyerPtr && v.CanAddr() {
207 return rv2i(v.Addr()).(isCodecEmptyer).IsCodecEmpty()
208 }
209 if ti.flagComparable {
210 return rv2i(v) == rv2i(rvZeroK(vt, reflect.Struct))
211 }
212 if !recursive {
213 return false
214 }
215
216
217 for _, si := range ti.sfi.source() {
218 sfv := si.path.field(v)
219 if sfv.IsValid() && !isEmptyValue(sfv, tinfos, recursive) {
220 return false
221 }
222 }
223 return true
224 }
225
226
227
228 type perTypeElem struct {
229 t reflect.Type
230 rtid uintptr
231 zero reflect.Value
232 addr [2]reflect.Value
233 }
234
235 func (x *perTypeElem) get(index uint8) (v reflect.Value) {
236 v = x.addr[index%2]
237 if v.IsValid() {
238 v.Set(x.zero)
239 } else {
240 v = reflect.New(x.t).Elem()
241 x.addr[index%2] = v
242 }
243 return
244 }
245
246 type perType struct {
247 v []perTypeElem
248 }
249
250 type decPerType struct {
251 perType
252 }
253
254 type encPerType struct {
255 perType
256 }
257
258 func (x *perType) elem(t reflect.Type) *perTypeElem {
259 rtid := rt2id(t)
260 var h, i uint
261 var j = uint(len(x.v))
262 LOOP:
263 if i < j {
264 h = (i + j) >> 1
265 if x.v[h].rtid < rtid {
266 i = h + 1
267 } else {
268 j = h
269 }
270 goto LOOP
271 }
272 if i < uint(len(x.v)) {
273 if x.v[i].rtid != rtid {
274 x.v = append(x.v, perTypeElem{})
275 copy(x.v[i+1:], x.v[i:])
276 x.v[i] = perTypeElem{t: t, rtid: rtid, zero: reflect.Zero(t)}
277 }
278 } else {
279 x.v = append(x.v, perTypeElem{t: t, rtid: rtid, zero: reflect.Zero(t)})
280 }
281 return &x.v[i]
282 }
283
284 func (x *perType) TransientAddrK(t reflect.Type, k reflect.Kind) (rv reflect.Value) {
285 return x.elem(t).get(0)
286 }
287
288 func (x *perType) TransientAddr2K(t reflect.Type, k reflect.Kind) (rv reflect.Value) {
289 return x.elem(t).get(1)
290 }
291
292 func (x *perType) AddressableRO(v reflect.Value) (rv reflect.Value) {
293 rv = x.elem(v.Type()).get(0)
294 rvSetDirect(rv, v)
295 return
296 }
297
298
299 type structFieldInfos struct {
300 c []*structFieldInfo
301 s []*structFieldInfo
302 }
303
304 func (x *structFieldInfos) load(source, sorted []*structFieldInfo) {
305 x.c = source
306 x.s = sorted
307 }
308
309 func (x *structFieldInfos) sorted() (v []*structFieldInfo) { return x.s }
310 func (x *structFieldInfos) source() (v []*structFieldInfo) { return x.c }
311
312 type atomicClsErr struct {
313 v atomic.Value
314 }
315
316 func (x *atomicClsErr) load() (e clsErr) {
317 if i := x.v.Load(); i != nil {
318 e = i.(clsErr)
319 }
320 return
321 }
322
323 func (x *atomicClsErr) store(p clsErr) {
324 x.v.Store(p)
325 }
326
327
328 type atomicTypeInfoSlice struct {
329 v atomic.Value
330 }
331
332 func (x *atomicTypeInfoSlice) load() (e []rtid2ti) {
333 if i := x.v.Load(); i != nil {
334 e = i.([]rtid2ti)
335 }
336 return
337 }
338
339 func (x *atomicTypeInfoSlice) store(p []rtid2ti) {
340 x.v.Store(p)
341 }
342
343
344 type atomicRtidFnSlice struct {
345 v atomic.Value
346 }
347
348 func (x *atomicRtidFnSlice) load() (e []codecRtidFn) {
349 if i := x.v.Load(); i != nil {
350 e = i.([]codecRtidFn)
351 }
352 return
353 }
354
355 func (x *atomicRtidFnSlice) store(p []codecRtidFn) {
356 x.v.Store(p)
357 }
358
359
360 func (n *fauxUnion) ru() reflect.Value {
361 return reflect.ValueOf(&n.u).Elem()
362 }
363 func (n *fauxUnion) ri() reflect.Value {
364 return reflect.ValueOf(&n.i).Elem()
365 }
366 func (n *fauxUnion) rf() reflect.Value {
367 return reflect.ValueOf(&n.f).Elem()
368 }
369 func (n *fauxUnion) rl() reflect.Value {
370 return reflect.ValueOf(&n.l).Elem()
371 }
372 func (n *fauxUnion) rs() reflect.Value {
373 return reflect.ValueOf(&n.s).Elem()
374 }
375 func (n *fauxUnion) rt() reflect.Value {
376 return reflect.ValueOf(&n.t).Elem()
377 }
378 func (n *fauxUnion) rb() reflect.Value {
379 return reflect.ValueOf(&n.b).Elem()
380 }
381
382
383 func rvSetBytes(rv reflect.Value, v []byte) {
384 rv.SetBytes(v)
385 }
386
387 func rvSetString(rv reflect.Value, v string) {
388 rv.SetString(v)
389 }
390
391 func rvSetBool(rv reflect.Value, v bool) {
392 rv.SetBool(v)
393 }
394
395 func rvSetTime(rv reflect.Value, v time.Time) {
396 rv.Set(reflect.ValueOf(v))
397 }
398
399 func rvSetFloat32(rv reflect.Value, v float32) {
400 rv.SetFloat(float64(v))
401 }
402
403 func rvSetFloat64(rv reflect.Value, v float64) {
404 rv.SetFloat(v)
405 }
406
407 func rvSetComplex64(rv reflect.Value, v complex64) {
408 rv.SetComplex(complex128(v))
409 }
410
411 func rvSetComplex128(rv reflect.Value, v complex128) {
412 rv.SetComplex(v)
413 }
414
415 func rvSetInt(rv reflect.Value, v int) {
416 rv.SetInt(int64(v))
417 }
418
419 func rvSetInt8(rv reflect.Value, v int8) {
420 rv.SetInt(int64(v))
421 }
422
423 func rvSetInt16(rv reflect.Value, v int16) {
424 rv.SetInt(int64(v))
425 }
426
427 func rvSetInt32(rv reflect.Value, v int32) {
428 rv.SetInt(int64(v))
429 }
430
431 func rvSetInt64(rv reflect.Value, v int64) {
432 rv.SetInt(v)
433 }
434
435 func rvSetUint(rv reflect.Value, v uint) {
436 rv.SetUint(uint64(v))
437 }
438
439 func rvSetUintptr(rv reflect.Value, v uintptr) {
440 rv.SetUint(uint64(v))
441 }
442
443 func rvSetUint8(rv reflect.Value, v uint8) {
444 rv.SetUint(uint64(v))
445 }
446
447 func rvSetUint16(rv reflect.Value, v uint16) {
448 rv.SetUint(uint64(v))
449 }
450
451 func rvSetUint32(rv reflect.Value, v uint32) {
452 rv.SetUint(uint64(v))
453 }
454
455 func rvSetUint64(rv reflect.Value, v uint64) {
456 rv.SetUint(v)
457 }
458
459
460
461 func rvSetDirect(rv reflect.Value, v reflect.Value) {
462 rv.Set(v)
463 }
464
465 func rvSetDirectZero(rv reflect.Value) {
466 rv.Set(reflect.Zero(rv.Type()))
467 }
468
469
470
471
472
473 func rvSetIntf(rv reflect.Value, v reflect.Value) {
474 rv.Set(v)
475 }
476
477 func rvSetZero(rv reflect.Value) {
478 rv.Set(reflect.Zero(rv.Type()))
479 }
480
481 func rvSlice(rv reflect.Value, length int) reflect.Value {
482 return rv.Slice(0, length)
483 }
484
485 func rvMakeSlice(rv reflect.Value, ti *typeInfo, xlen, xcap int) (v reflect.Value, set bool) {
486 v = reflect.MakeSlice(ti.rt, xlen, xcap)
487 if rv.Len() > 0 {
488 reflect.Copy(v, rv)
489 }
490 return
491 }
492
493 func rvGrowSlice(rv reflect.Value, ti *typeInfo, cap, incr int) (v reflect.Value, newcap int, set bool) {
494 newcap = int(growCap(uint(cap), uint(ti.elemsize), uint(incr)))
495 v = reflect.MakeSlice(ti.rt, newcap, newcap)
496 if rv.Len() > 0 {
497 reflect.Copy(v, rv)
498 }
499 return
500 }
501
502
503
504 func rvSliceIndex(rv reflect.Value, i int, ti *typeInfo) reflect.Value {
505 return rv.Index(i)
506 }
507
508 func rvArrayIndex(rv reflect.Value, i int, ti *typeInfo) reflect.Value {
509 return rv.Index(i)
510 }
511
512 func rvSliceZeroCap(t reflect.Type) (v reflect.Value) {
513 return reflect.MakeSlice(t, 0, 0)
514 }
515
516 func rvLenSlice(rv reflect.Value) int {
517 return rv.Len()
518 }
519
520 func rvCapSlice(rv reflect.Value) int {
521 return rv.Cap()
522 }
523
524 func rvGetArrayBytes(rv reflect.Value, scratch []byte) (bs []byte) {
525 l := rv.Len()
526 if scratch == nil || rv.CanAddr() {
527 return rv.Slice(0, l).Bytes()
528 }
529
530 if l <= cap(scratch) {
531 bs = scratch[:l]
532 } else {
533 bs = make([]byte, l)
534 }
535 reflect.Copy(reflect.ValueOf(bs), rv)
536 return
537 }
538
539 func rvGetArray4Slice(rv reflect.Value) (v reflect.Value) {
540 v = rvZeroAddrK(reflectArrayOf(rvLenSlice(rv), rv.Type().Elem()), reflect.Array)
541 reflect.Copy(v, rv)
542 return
543 }
544
545 func rvGetSlice4Array(rv reflect.Value, v interface{}) {
546
547
548
549
550
551
552 rve := reflect.ValueOf(v).Elem()
553 l := rv.Len()
554 if rv.CanAddr() {
555 rve.Set(rv.Slice(0, l))
556 } else {
557 rvs := reflect.MakeSlice(rve.Type(), l, l)
558 reflect.Copy(rvs, rv)
559 rve.Set(rvs)
560 }
561
562 }
563
564 func rvCopySlice(dest, src reflect.Value, _ reflect.Type) {
565 reflect.Copy(dest, src)
566 }
567
568
569
570 func rvGetBool(rv reflect.Value) bool {
571 return rv.Bool()
572 }
573
574 func rvGetBytes(rv reflect.Value) []byte {
575 return rv.Bytes()
576 }
577
578 func rvGetTime(rv reflect.Value) time.Time {
579 return rv2i(rv).(time.Time)
580 }
581
582 func rvGetString(rv reflect.Value) string {
583 return rv.String()
584 }
585
586 func rvGetFloat64(rv reflect.Value) float64 {
587 return rv.Float()
588 }
589
590 func rvGetFloat32(rv reflect.Value) float32 {
591 return float32(rv.Float())
592 }
593
594 func rvGetComplex64(rv reflect.Value) complex64 {
595 return complex64(rv.Complex())
596 }
597
598 func rvGetComplex128(rv reflect.Value) complex128 {
599 return rv.Complex()
600 }
601
602 func rvGetInt(rv reflect.Value) int {
603 return int(rv.Int())
604 }
605
606 func rvGetInt8(rv reflect.Value) int8 {
607 return int8(rv.Int())
608 }
609
610 func rvGetInt16(rv reflect.Value) int16 {
611 return int16(rv.Int())
612 }
613
614 func rvGetInt32(rv reflect.Value) int32 {
615 return int32(rv.Int())
616 }
617
618 func rvGetInt64(rv reflect.Value) int64 {
619 return rv.Int()
620 }
621
622 func rvGetUint(rv reflect.Value) uint {
623 return uint(rv.Uint())
624 }
625
626 func rvGetUint8(rv reflect.Value) uint8 {
627 return uint8(rv.Uint())
628 }
629
630 func rvGetUint16(rv reflect.Value) uint16 {
631 return uint16(rv.Uint())
632 }
633
634 func rvGetUint32(rv reflect.Value) uint32 {
635 return uint32(rv.Uint())
636 }
637
638 func rvGetUint64(rv reflect.Value) uint64 {
639 return rv.Uint()
640 }
641
642 func rvGetUintptr(rv reflect.Value) uintptr {
643 return uintptr(rv.Uint())
644 }
645
646 func rvLenMap(rv reflect.Value) int {
647 return rv.Len()
648 }
649
650
651
652
653
654
655
656
657
658
659
660
661
662 func mapStoresElemIndirect(elemsize uintptr) bool { return false }
663
664 func mapSet(m, k, v reflect.Value, keyFastKind mapKeyFastKind, _, _ bool) {
665 m.SetMapIndex(k, v)
666 }
667
668 func mapGet(m, k, v reflect.Value, keyFastKind mapKeyFastKind, _, _ bool) (vv reflect.Value) {
669 return m.MapIndex(k)
670 }
671
672
673
674
675
676 func mapAddrLoopvarRV(t reflect.Type, k reflect.Kind) (r reflect.Value) {
677 return
678 }
679
680
681
682 func (e *Encoder) jsondriver() *jsonEncDriver {
683 return e.e.(*jsonEncDriver)
684 }
685
686
687
688 func (d *Decoder) jsondriver() *jsonDecDriver {
689 return d.d.(*jsonDecDriver)
690 }
691
692 func (d *Decoder) stringZC(v []byte) (s string) {
693 return d.string(v)
694 }
695
696 func (d *Decoder) mapKeyString(callFnRvk *bool, kstrbs, kstr2bs *[]byte) string {
697 return d.string(*kstr2bs)
698 }
699
700
701
702 func (n *structFieldInfoPathNode) rvField(v reflect.Value) reflect.Value {
703 return v.Field(int(n.index))
704 }
705
706
707
View as plain text