7 "github.com/vmihailenco/msgpack/codes"
10 const sliceElemsAllocLimit = 1e4
12 var sliceStringPtrType = reflect.TypeOf((*[]string)(nil))
14 // DecodeArrayLen decodes array length. Length is -1 when array is nil.
15 func (d *Decoder) DecodeArrayLen() (int, error) {
16 c, err := d.readCode()
23 func (d *Decoder) arrayLen(c codes.Code) (int, error) {
26 } else if c >= codes.FixedArrayLow && c <= codes.FixedArrayHigh {
27 return int(c & codes.FixedArrayMask), nil
37 return 0, fmt.Errorf("msgpack: invalid code=%x decoding array length", c)
40 func decodeStringSliceValue(d *Decoder, v reflect.Value) error {
41 ptr := v.Addr().Convert(sliceStringPtrType).Interface().(*[]string)
42 return d.decodeStringSlicePtr(ptr)
45 func (d *Decoder) decodeStringSlicePtr(ptr *[]string) error {
46 n, err := d.DecodeArrayLen()
54 ss := setStringsCap(*ptr, n)
55 for i := 0; i < n; i++ {
56 s, err := d.DecodeString()
67 func setStringsCap(s []string, n int) []string {
68 if n > sliceElemsAllocLimit {
69 n = sliceElemsAllocLimit
73 return make([]string, 0, n)
81 s = append(s, make([]string, n-len(s))...)
85 func decodeSliceValue(d *Decoder, v reflect.Value) error {
86 n, err := d.DecodeArrayLen()
92 v.Set(reflect.Zero(v.Type()))
95 if n == 0 && v.IsNil() {
96 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
102 } else if v.Len() < v.Cap() {
103 v.Set(v.Slice(0, v.Cap()))
106 for i := 0; i < n; i++ {
108 v.Set(growSliceValue(v, n))
111 if err := d.DecodeValue(sv); err != nil {
119 func growSliceValue(v reflect.Value, n int) reflect.Value {
121 if diff > sliceElemsAllocLimit {
122 diff = sliceElemsAllocLimit
124 v = reflect.AppendSlice(v, reflect.MakeSlice(v.Type(), diff, diff))
128 func decodeArrayValue(d *Decoder, v reflect.Value) error {
129 n, err := d.DecodeArrayLen()
139 return fmt.Errorf("%s len is %d, but msgpack has %d elements", v.Type(), v.Len(), n)
141 for i := 0; i < n; i++ {
143 if err := d.DecodeValue(sv); err != nil {
151 func (d *Decoder) DecodeSlice() ([]interface{}, error) {
152 c, err := d.readCode()
156 return d.decodeSlice(c)
159 func (d *Decoder) decodeSlice(c codes.Code) ([]interface{}, error) {
160 n, err := d.arrayLen(c)
168 s := make([]interface{}, 0, min(n, sliceElemsAllocLimit))
169 for i := 0; i < n; i++ {
170 v, err := d.decodeInterfaceCond()
180 func (d *Decoder) skipSlice(c codes.Code) error {
181 n, err := d.arrayLen(c)
186 for i := 0; i < n; i++ {
187 if err := d.Skip(); err != nil {