(b []byte, p unsafe.Pointer, n int, size uintptr, t reflect.Type, decode decodeFunc)
| 504 | } |
| 505 | |
| 506 | func (d decoder) decodeArray(b []byte, p unsafe.Pointer, n int, size uintptr, t reflect.Type, decode decodeFunc) ([]byte, error) { |
| 507 | if hasNullPrefix(b) { |
| 508 | return b[4:], nil |
| 509 | } |
| 510 | |
| 511 | if len(b) < 2 || b[0] != '[' { |
| 512 | return d.inputError(b, t) |
| 513 | } |
| 514 | b = b[1:] |
| 515 | |
| 516 | var err error |
| 517 | for i := range n { |
| 518 | b = skipSpaces(b) |
| 519 | |
| 520 | if i != 0 { |
| 521 | if len(b) == 0 { |
| 522 | return b, syntaxError(b, "unexpected EOF after array element") |
| 523 | } |
| 524 | switch b[0] { |
| 525 | case ',': |
| 526 | b = skipSpaces(b[1:]) |
| 527 | case ']': |
| 528 | return b[1:], nil |
| 529 | default: |
| 530 | return b, syntaxError(b, "expected ',' after array element but found '%c'", b[0]) |
| 531 | } |
| 532 | } |
| 533 | |
| 534 | b, err = decode(d, b, unsafe.Pointer(uintptr(p)+(uintptr(i)*size))) |
| 535 | if err != nil { |
| 536 | if e, ok := err.(*UnmarshalTypeError); ok { |
| 537 | e.Struct = t.String() + e.Struct |
| 538 | e.Field = d.prependField(strconv.Itoa(i), e.Field) |
| 539 | } |
| 540 | return b, err |
| 541 | } |
| 542 | } |
| 543 | |
| 544 | // The encoding/json package ignores extra elements found when decoding into |
| 545 | // array types (which have a fixed size). |
| 546 | for { |
| 547 | b = skipSpaces(b) |
| 548 | |
| 549 | if len(b) == 0 { |
| 550 | return b, syntaxError(b, "missing closing ']' in array value") |
| 551 | } |
| 552 | |
| 553 | switch b[0] { |
| 554 | case ',': |
| 555 | b = skipSpaces(b[1:]) |
| 556 | case ']': |
| 557 | return b[1:], nil |
| 558 | } |
| 559 | |
| 560 | _, b, _, err = d.parseValue(b) |
| 561 | if err != nil { |
| 562 | return b, err |
| 563 | } |
no test coverage detected