(t reflect.Type, fields []structField)
| 286 | } |
| 287 | |
| 288 | func structDecodeFuncOf(t reflect.Type, fields []structField) decodeFunc { |
| 289 | maxFieldNumber := fieldNumber(0) |
| 290 | |
| 291 | for _, f := range fields { |
| 292 | if n := f.fieldNumber(); n > maxFieldNumber { |
| 293 | maxFieldNumber = n |
| 294 | } |
| 295 | } |
| 296 | |
| 297 | fieldIndex := make([]*structField, maxFieldNumber+1) |
| 298 | |
| 299 | for i := range fields { |
| 300 | f := &fields[i] |
| 301 | fieldIndex[f.fieldNumber()] = f |
| 302 | } |
| 303 | |
| 304 | return func(b []byte, p unsafe.Pointer, flags flags) (int, error) { |
| 305 | flags = flags.without(toplevel) |
| 306 | offset := 0 |
| 307 | |
| 308 | for offset < len(b) { |
| 309 | fieldNumber, wireType, n, err := decodeTag(b[offset:]) |
| 310 | offset += n |
| 311 | if err != nil { |
| 312 | return offset, err |
| 313 | } |
| 314 | |
| 315 | i := int(fieldNumber) |
| 316 | f := (*structField)(nil) |
| 317 | |
| 318 | if i >= 0 && i < len(fieldIndex) { |
| 319 | f = fieldIndex[i] |
| 320 | } |
| 321 | |
| 322 | if f == nil { |
| 323 | skip := 0 |
| 324 | size := uint64(0) |
| 325 | switch wireType { |
| 326 | case varint: |
| 327 | _, skip, err = decodeVarint(b[offset:]) |
| 328 | case varlen: |
| 329 | size, skip, err = decodeVarint(b[offset:]) |
| 330 | if err == nil { |
| 331 | if size > uint64(len(b)-skip) { |
| 332 | err = io.ErrUnexpectedEOF |
| 333 | } else { |
| 334 | skip += int(size) |
| 335 | } |
| 336 | } |
| 337 | case fixed32: |
| 338 | _, skip, err = decodeLE32(b[offset:]) |
| 339 | case fixed64: |
| 340 | _, skip, err = decodeLE64(b[offset:]) |
| 341 | default: |
| 342 | err = ErrWireTypeUnknown |
| 343 | } |
| 344 | if (offset + skip) <= len(b) { |
| 345 | offset += skip |
no test coverage detected
searching dependent graphs…