feature_reflect_array.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "io"
  5. "reflect"
  6. "unsafe"
  7. )
  8. func decoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  9. decoder, err := decoderOfType(cfg, typ.Elem())
  10. if err != nil {
  11. return nil, err
  12. }
  13. return &arrayDecoder{typ, typ.Elem(), decoder}, nil
  14. }
  15. func encoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  16. encoder, err := encoderOfType(cfg, typ.Elem())
  17. if err != nil {
  18. return nil, err
  19. }
  20. if typ.Elem().Kind() == reflect.Map {
  21. encoder = &OptionalEncoder{encoder}
  22. }
  23. return &arrayEncoder{typ, typ.Elem(), encoder}, nil
  24. }
  25. type arrayEncoder struct {
  26. arrayType reflect.Type
  27. elemType reflect.Type
  28. elemEncoder ValEncoder
  29. }
  30. func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  31. stream.WriteArrayStart()
  32. elemPtr := unsafe.Pointer(ptr)
  33. encoder.elemEncoder.Encode(elemPtr, stream)
  34. for i := 1; i < encoder.arrayType.Len(); i++ {
  35. stream.WriteMore()
  36. elemPtr = unsafe.Pointer(uintptr(elemPtr) + encoder.elemType.Size())
  37. encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream)
  38. }
  39. stream.WriteArrayEnd()
  40. if stream.Error != nil && stream.Error != io.EOF {
  41. stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error())
  42. }
  43. }
  44. func (encoder *arrayEncoder) EncodeInterface(val interface{}, stream *Stream) {
  45. // special optimization for interface{}
  46. e := (*emptyInterface)(unsafe.Pointer(&val))
  47. if e.word == nil {
  48. stream.WriteArrayStart()
  49. stream.WriteNil()
  50. stream.WriteArrayEnd()
  51. return
  52. }
  53. elemType := encoder.arrayType.Elem()
  54. if encoder.arrayType.Len() == 1 && (elemType.Kind() == reflect.Ptr || elemType.Kind() == reflect.Map) {
  55. ptr := uintptr(e.word)
  56. e.word = unsafe.Pointer(&ptr)
  57. }
  58. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  59. encoder.Encode(unsafe.Pointer(&e.word), stream)
  60. } else {
  61. encoder.Encode(e.word, stream)
  62. }
  63. }
  64. func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  65. return false
  66. }
  67. type arrayDecoder struct {
  68. arrayType reflect.Type
  69. elemType reflect.Type
  70. elemDecoder ValDecoder
  71. }
  72. func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  73. decoder.doDecode(ptr, iter)
  74. if iter.Error != nil && iter.Error != io.EOF {
  75. iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error())
  76. }
  77. }
  78. func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {
  79. offset := uintptr(0)
  80. iter.ReadArrayCB(func(iter *Iterator) bool {
  81. if offset < decoder.arrayType.Size() {
  82. decoder.elemDecoder.Decode(unsafe.Pointer(uintptr(ptr)+offset), iter)
  83. offset += decoder.elemType.Size()
  84. } else {
  85. iter.Skip()
  86. }
  87. return true
  88. })
  89. }