(b []byte, p unsafe.Pointer, t, kt, vt reflect.Type, kz, vz reflect.Value, decodeKey, decodeValue decodeFunc)
| 645 | } |
| 646 | |
| 647 | func (d decoder) decodeMap(b []byte, p unsafe.Pointer, t, kt, vt reflect.Type, kz, vz reflect.Value, decodeKey, decodeValue decodeFunc) ([]byte, error) { |
| 648 | if hasNullPrefix(b) { |
| 649 | *(*unsafe.Pointer)(p) = nil |
| 650 | return b[4:], nil |
| 651 | } |
| 652 | |
| 653 | if len(b) < 2 || b[0] != '{' { |
| 654 | return d.inputError(b, t) |
| 655 | } |
| 656 | i := 0 |
| 657 | m := reflect.NewAt(t, p).Elem() |
| 658 | |
| 659 | k := reflect.New(kt).Elem() |
| 660 | v := reflect.New(vt).Elem() |
| 661 | |
| 662 | kptr := (*iface)(unsafe.Pointer(&k)).ptr |
| 663 | vptr := (*iface)(unsafe.Pointer(&v)).ptr |
| 664 | input := b |
| 665 | |
| 666 | if m.IsNil() { |
| 667 | m = reflect.MakeMap(t) |
| 668 | } |
| 669 | |
| 670 | var err error |
| 671 | b = b[1:] |
| 672 | for { |
| 673 | k.Set(kz) |
| 674 | v.Set(vz) |
| 675 | b = skipSpaces(b) |
| 676 | |
| 677 | if len(b) != 0 && b[0] == '}' { |
| 678 | *(*unsafe.Pointer)(p) = unsafe.Pointer(m.Pointer()) |
| 679 | return b[1:], nil |
| 680 | } |
| 681 | |
| 682 | if i != 0 { |
| 683 | if len(b) == 0 { |
| 684 | return b, syntaxError(b, "unexpected end of JSON input after object field value") |
| 685 | } |
| 686 | if b[0] != ',' { |
| 687 | return b, syntaxError(b, "expected ',' after object field value but found '%c'", b[0]) |
| 688 | } |
| 689 | b = skipSpaces(b[1:]) |
| 690 | } |
| 691 | |
| 692 | if hasNullPrefix(b) { |
| 693 | return b, syntaxError(b, "cannot decode object key string from 'null' value") |
| 694 | } |
| 695 | |
| 696 | if b, err = decodeKey(d, b, kptr); err != nil { |
| 697 | return objectKeyError(b, err) |
| 698 | } |
| 699 | b = skipSpaces(b) |
| 700 | |
| 701 | if len(b) == 0 { |
| 702 | return b, syntaxError(b, "unexpected end of JSON input after object field key") |
| 703 | } |
| 704 | if b[0] != ':' { |
no test coverage detected