413 | 413 |
|
414 | 414 |
func (f *decFnInfo) kSlice(rv reflect.Value) {
|
415 | 415 |
// A slice can be set from a map or array in stream.
|
416 | |
|
|
416 |
currEncodedType := f.dd.currentEncodedType()
|
|
417 |
|
|
418 |
switch currEncodedType {
|
|
419 |
case valueTypeBytes, valueTypeString:
|
|
420 |
if f.ti.rtid == uint8SliceTypId || f.ti.rt.Elem().Kind() == reflect.Uint8 {
|
|
421 |
if bs2, changed2 := f.dd.decodeBytes(rv.Bytes()); changed2 {
|
|
422 |
rv.SetBytes(bs2)
|
|
423 |
}
|
|
424 |
return
|
|
425 |
}
|
|
426 |
}
|
|
427 |
|
417 | 428 |
if shortCircuitReflectToFastPath && rv.CanAddr() {
|
418 | 429 |
switch f.ti.rtid {
|
419 | 430 |
case intfSliceTypId:
|
420 | |
f.d.decSliceIntf(rv.Addr().Interface().(*[]interface{}), f.array)
|
|
431 |
f.d.decSliceIntf(rv.Addr().Interface().(*[]interface{}), currEncodedType, f.array)
|
421 | 432 |
return
|
422 | 433 |
case uint64SliceTypId:
|
423 | |
f.d.decSliceUint64(rv.Addr().Interface().(*[]uint64), f.array)
|
|
434 |
f.d.decSliceUint64(rv.Addr().Interface().(*[]uint64), currEncodedType, f.array)
|
424 | 435 |
return
|
425 | 436 |
case int64SliceTypId:
|
426 | |
f.d.decSliceInt64(rv.Addr().Interface().(*[]int64), f.array)
|
|
437 |
f.d.decSliceInt64(rv.Addr().Interface().(*[]int64), currEncodedType, f.array)
|
427 | 438 |
return
|
428 | 439 |
case strSliceTypId:
|
429 | |
f.d.decSliceStr(rv.Addr().Interface().(*[]string), f.array)
|
|
440 |
f.d.decSliceStr(rv.Addr().Interface().(*[]string), currEncodedType, f.array)
|
430 | 441 |
return
|
431 | 442 |
}
|
432 | 443 |
}
|
433 | 444 |
|
434 | |
if f.ti.rtid == uint8SliceTypId || f.ti.rt.Elem().Kind() == reflect.Uint8 {
|
435 | |
if bs2, changed2 := f.dd.decodeBytes(rv.Bytes()); changed2 {
|
436 | |
rv.SetBytes(bs2)
|
437 | |
}
|
438 | |
return
|
439 | |
}
|
440 | |
|
441 | |
containerLen, containerLenS := decContLens(f.dd)
|
|
445 |
containerLen, containerLenS := decContLens(f.dd, currEncodedType)
|
442 | 446 |
|
443 | 447 |
// an array can never return a nil slice. so no need to check f.array here.
|
444 | 448 |
|
445 | 449 |
if rv.IsNil() {
|
446 | 450 |
rv.Set(reflect.MakeSlice(f.ti.rt, containerLenS, containerLenS))
|
447 | 451 |
}
|
|
452 |
|
448 | 453 |
if containerLen == 0 {
|
449 | 454 |
return
|
450 | 455 |
}
|
451 | |
|
|
456 |
|
452 | 457 |
if rvcap, rvlen := rv.Len(), rv.Cap(); containerLenS > rvcap {
|
453 | 458 |
if f.array { // !rv.CanSet()
|
454 | 459 |
decErr(msgDecCannotExpandArr, rvcap, containerLenS)
|
|
663 | 668 |
*v, _ = d.d.decodeBytes(v2)
|
664 | 669 |
|
665 | 670 |
case *[]interface{}:
|
666 | |
d.decSliceIntf(v, false)
|
|
671 |
d.decSliceIntf(v, valueTypeInvalid, false)
|
667 | 672 |
case *[]uint64:
|
668 | |
d.decSliceUint64(v, false)
|
|
673 |
d.decSliceUint64(v, valueTypeInvalid, false)
|
669 | 674 |
case *[]int64:
|
670 | |
d.decSliceInt64(v, false)
|
|
675 |
d.decSliceInt64(v, valueTypeInvalid, false)
|
671 | 676 |
case *[]string:
|
672 | |
d.decSliceStr(v, false)
|
|
677 |
d.decSliceStr(v, valueTypeInvalid, false)
|
673 | 678 |
case *map[string]interface{}:
|
674 | 679 |
d.decMapStrIntf(v)
|
675 | 680 |
case *map[interface{}]interface{}:
|
|
852 | 857 |
|
853 | 858 |
// short circuit functions for common maps and slices
|
854 | 859 |
|
855 | |
func (d *Decoder) decSliceIntf(v *[]interface{}, doNotReset bool) {
|
856 | |
_, containerLenS := decContLens(d.d)
|
|
860 |
func (d *Decoder) decSliceIntf(v *[]interface{}, currEncodedType valueType, doNotReset bool) {
|
|
861 |
_, containerLenS := decContLens(d.d, currEncodedType)
|
857 | 862 |
s := *v
|
858 | 863 |
if s == nil {
|
859 | 864 |
s = make([]interface{}, containerLenS, containerLenS)
|
|
872 | 877 |
*v = s
|
873 | 878 |
}
|
874 | 879 |
|
875 | |
func (d *Decoder) decSliceInt64(v *[]int64, doNotReset bool) {
|
876 | |
_, containerLenS := decContLens(d.d)
|
|
880 |
func (d *Decoder) decSliceInt64(v *[]int64, currEncodedType valueType, doNotReset bool) {
|
|
881 |
_, containerLenS := decContLens(d.d, currEncodedType)
|
877 | 882 |
s := *v
|
878 | 883 |
if s == nil {
|
879 | 884 |
s = make([]int64, containerLenS, containerLenS)
|
|
894 | 899 |
*v = s
|
895 | 900 |
}
|
896 | 901 |
|
897 | |
func (d *Decoder) decSliceUint64(v *[]uint64, doNotReset bool) {
|
898 | |
_, containerLenS := decContLens(d.d)
|
|
902 |
func (d *Decoder) decSliceUint64(v *[]uint64, currEncodedType valueType, doNotReset bool) {
|
|
903 |
_, containerLenS := decContLens(d.d, currEncodedType)
|
899 | 904 |
s := *v
|
900 | 905 |
if s == nil {
|
901 | 906 |
s = make([]uint64, containerLenS, containerLenS)
|
|
916 | 921 |
*v = s
|
917 | 922 |
}
|
918 | 923 |
|
919 | |
func (d *Decoder) decSliceStr(v *[]string, doNotReset bool) {
|
920 | |
_, containerLenS := decContLens(d.d)
|
|
924 |
func (d *Decoder) decSliceStr(v *[]string, currEncodedType valueType, doNotReset bool) {
|
|
925 |
_, containerLenS := decContLens(d.d, currEncodedType)
|
921 | 926 |
s := *v
|
922 | 927 |
if s == nil {
|
923 | 928 |
s = make([]string, containerLenS, containerLenS)
|
|
1008 | 1013 |
|
1009 | 1014 |
// ----------------------------------------
|
1010 | 1015 |
|
1011 | |
func decContLens(dd decDriver) (containerLen, containerLenS int) {
|
1012 | |
switch currEncodedType := dd.currentEncodedType(); currEncodedType {
|
|
1016 |
func decContLens(dd decDriver, currEncodedType valueType) (containerLen, containerLenS int) {
|
|
1017 |
if currEncodedType == valueTypeInvalid {
|
|
1018 |
currEncodedType = dd.currentEncodedType()
|
|
1019 |
}
|
|
1020 |
switch currEncodedType {
|
1013 | 1021 |
case valueTypeArray:
|
1014 | 1022 |
containerLen = dd.readArrayLen()
|
1015 | 1023 |
containerLenS = containerLen
|
|
1026 | 1034 |
func decErr(format string, params ...interface{}) {
|
1027 | 1035 |
doPanic(msgTagDec, format, params...)
|
1028 | 1036 |
}
|
|
1037 |
|
|
1038 |
|
|
1039 |
|