jsoniter_reflect.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "errors"
  5. "fmt"
  6. "unsafe"
  7. "sync/atomic"
  8. "strings"
  9. "io"
  10. )
  11. type Decoder interface {
  12. decode(ptr unsafe.Pointer, iter *Iterator)
  13. }
  14. type stringDecoder struct {
  15. }
  16. func (decoder *stringDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  17. *((*string)(ptr)) = iter.ReadString()
  18. }
  19. type intDecoder struct {
  20. }
  21. func (decoder *intDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  22. *((*int)(ptr)) = iter.ReadInt()
  23. }
  24. type int8Decoder struct {
  25. }
  26. func (decoder *int8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  27. *((*int8)(ptr)) = iter.ReadInt8()
  28. }
  29. type int16Decoder struct {
  30. }
  31. func (decoder *int16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  32. *((*int16)(ptr)) = iter.ReadInt16()
  33. }
  34. type int32Decoder struct {
  35. }
  36. func (decoder *int32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  37. *((*int32)(ptr)) = iter.ReadInt32()
  38. }
  39. type int64Decoder struct {
  40. }
  41. func (decoder *int64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  42. *((*int64)(ptr)) = iter.ReadInt64()
  43. }
  44. type uintDecoder struct {
  45. }
  46. func (decoder *uintDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  47. *((*uint)(ptr)) = iter.ReadUint()
  48. }
  49. type uint8Decoder struct {
  50. }
  51. func (decoder *uint8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  52. *((*uint8)(ptr)) = iter.ReadUint8()
  53. }
  54. type uint16Decoder struct {
  55. }
  56. func (decoder *uint16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  57. *((*uint16)(ptr)) = iter.ReadUint16()
  58. }
  59. type uint32Decoder struct {
  60. }
  61. func (decoder *uint32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  62. *((*uint32)(ptr)) = iter.ReadUint32()
  63. }
  64. type uint64Decoder struct {
  65. }
  66. func (decoder *uint64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  67. *((*uint64)(ptr)) = iter.ReadUint64()
  68. }
  69. type float32Decoder struct {
  70. }
  71. func (decoder *float32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  72. *((*float32)(ptr)) = iter.ReadFloat32()
  73. }
  74. type float64Decoder struct {
  75. }
  76. func (decoder *float64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  77. *((*float64)(ptr)) = iter.ReadFloat64()
  78. }
  79. type boolDecoder struct {
  80. }
  81. func (decoder *boolDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  82. *((*bool)(ptr)) = iter.ReadBool()
  83. }
  84. type stringNumberDecoder struct {
  85. elemDecoder Decoder
  86. }
  87. func (decoder *stringNumberDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  88. c := iter.readByte()
  89. if c != '"' {
  90. iter.ReportError("stringNumberDecoder", `expect "`)
  91. return
  92. }
  93. decoder.elemDecoder.decode(ptr, iter)
  94. if iter.Error != nil {
  95. return
  96. }
  97. c = iter.readByte()
  98. if c != '"' {
  99. iter.ReportError("stringNumberDecoder", `expect "`)
  100. return
  101. }
  102. }
  103. type optionalDecoder struct {
  104. valueType reflect.Type
  105. valueDecoder Decoder
  106. }
  107. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  108. if iter.ReadNull() {
  109. *((*unsafe.Pointer)(ptr)) = nil
  110. } else {
  111. value := reflect.New(decoder.valueType)
  112. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  113. *((*uintptr)(ptr)) = value.Pointer()
  114. }
  115. }
  116. type structDecoder struct {
  117. type_ reflect.Type
  118. fields map[string]*decodeFieldArgs
  119. }
  120. func (decoder *structDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  121. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  122. args := decoder.fields[field]
  123. if args == nil {
  124. iter.Skip()
  125. } else {
  126. decodeField(ptr, iter, field, args.fieldOffset, args.fieldDecoder)
  127. }
  128. }
  129. if iter.Error != nil && iter.Error != io.EOF {
  130. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  131. }
  132. }
  133. type skipDecoder struct {
  134. type_ reflect.Type
  135. }
  136. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  137. iter.Skip()
  138. if iter.Error != nil && iter.Error != io.EOF {
  139. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  140. }
  141. }
  142. type oneFieldStructDecoder struct {
  143. type_ reflect.Type
  144. fieldName string
  145. fieldDecoder Decoder
  146. fieldOffset uintptr
  147. }
  148. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  149. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  150. if field == decoder.fieldName {
  151. decodeField(ptr, iter, field, decoder.fieldOffset, decoder.fieldDecoder)
  152. } else {
  153. iter.Skip()
  154. }
  155. }
  156. if iter.Error != nil && iter.Error != io.EOF {
  157. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  158. }
  159. }
  160. type twoFieldsStructDecoder struct {
  161. type_ reflect.Type
  162. fieldName1 string
  163. fieldDecoder1 Decoder
  164. fieldOffset1 uintptr
  165. fieldName2 string
  166. fieldDecoder2 Decoder
  167. fieldOffset2 uintptr
  168. }
  169. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  170. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  171. switch field {
  172. case decoder.fieldName1:
  173. decodeField(ptr, iter, field, decoder.fieldOffset1, decoder.fieldDecoder1)
  174. case decoder.fieldName2:
  175. decodeField(ptr, iter, field, decoder.fieldOffset2, decoder.fieldDecoder2)
  176. default:
  177. iter.Skip()
  178. }
  179. }
  180. if iter.Error != nil && iter.Error != io.EOF {
  181. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  182. }
  183. }
  184. type threeFieldsStructDecoder struct {
  185. type_ reflect.Type
  186. fieldName1 string
  187. fieldDecoder1 Decoder
  188. fieldOffset1 uintptr
  189. fieldName2 string
  190. fieldDecoder2 Decoder
  191. fieldOffset2 uintptr
  192. fieldName3 string
  193. fieldDecoder3 Decoder
  194. fieldOffset3 uintptr
  195. }
  196. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  197. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  198. switch field {
  199. case decoder.fieldName1:
  200. decodeField(ptr, iter, field, decoder.fieldOffset1, decoder.fieldDecoder1)
  201. case decoder.fieldName2:
  202. decodeField(ptr, iter, field, decoder.fieldOffset2, decoder.fieldDecoder2)
  203. case decoder.fieldName3:
  204. decodeField(ptr, iter, field, decoder.fieldOffset3, decoder.fieldDecoder3)
  205. default:
  206. iter.Skip()
  207. }
  208. }
  209. if iter.Error != nil && iter.Error != io.EOF {
  210. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  211. }
  212. }
  213. type fourFieldsStructDecoder struct {
  214. type_ reflect.Type
  215. fieldName1 string
  216. fieldDecoder1 Decoder
  217. fieldOffset1 uintptr
  218. fieldName2 string
  219. fieldDecoder2 Decoder
  220. fieldOffset2 uintptr
  221. fieldName3 string
  222. fieldDecoder3 Decoder
  223. fieldOffset3 uintptr
  224. fieldName4 string
  225. fieldDecoder4 Decoder
  226. fieldOffset4 uintptr
  227. }
  228. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  229. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  230. switch field {
  231. case decoder.fieldName1:
  232. decodeField(ptr, iter, field, decoder.fieldOffset1, decoder.fieldDecoder1)
  233. case decoder.fieldName2:
  234. decodeField(ptr, iter, field, decoder.fieldOffset2, decoder.fieldDecoder2)
  235. case decoder.fieldName3:
  236. decodeField(ptr, iter, field, decoder.fieldOffset3, decoder.fieldDecoder3)
  237. case decoder.fieldName4:
  238. decodeField(ptr, iter, field, decoder.fieldOffset4, decoder.fieldDecoder4)
  239. default:
  240. iter.Skip()
  241. }
  242. }
  243. if iter.Error != nil && iter.Error != io.EOF {
  244. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  245. }
  246. }
  247. type decodeFieldArgs struct {
  248. fieldOffset uintptr
  249. fieldName string
  250. fieldDecoder Decoder
  251. }
  252. func decodeField(ptr unsafe.Pointer, iter *Iterator, fieldName string, fieldOffset uintptr, fieldDecoder Decoder) {
  253. fieldPtr := uintptr(ptr) + fieldOffset
  254. fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  255. if iter.Error != nil && iter.Error != io.EOF {
  256. iter.Error = fmt.Errorf("%s: %s", fieldName, iter.Error.Error())
  257. }
  258. }
  259. type sliceDecoder struct {
  260. sliceType reflect.Type
  261. elemType reflect.Type
  262. elemDecoder Decoder
  263. }
  264. // sliceHeader is a safe version of SliceHeader used within this package.
  265. type sliceHeader struct {
  266. Data unsafe.Pointer
  267. Len int
  268. Cap int
  269. }
  270. func (decoder *sliceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  271. decoder.doDecode(ptr, iter)
  272. if iter.Error != nil && iter.Error != io.EOF {
  273. iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error())
  274. }
  275. }
  276. func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {
  277. slice := (*sliceHeader)(ptr)
  278. reuseSlice(slice, decoder.sliceType, 4)
  279. if !iter.ReadArray() {
  280. return
  281. }
  282. offset := uintptr(0)
  283. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  284. if !iter.ReadArray() {
  285. slice.Len = 1
  286. return
  287. }
  288. offset += decoder.elemType.Size()
  289. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  290. if !iter.ReadArray() {
  291. slice.Len = 2
  292. return
  293. }
  294. offset += decoder.elemType.Size()
  295. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  296. if !iter.ReadArray() {
  297. slice.Len = 3
  298. return
  299. }
  300. offset += decoder.elemType.Size()
  301. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  302. slice.Len = 4
  303. for iter.ReadArray() {
  304. growOne(slice, decoder.sliceType, decoder.elemType)
  305. offset += decoder.elemType.Size()
  306. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  307. }
  308. }
  309. // grow grows the slice s so that it can hold extra more values, allocating
  310. // more capacity if needed. It also returns the old and new slice lengths.
  311. func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) {
  312. newLen := slice.Len + 1
  313. if newLen <= slice.Cap {
  314. slice.Len = newLen
  315. return
  316. }
  317. newCap := slice.Cap
  318. if newCap == 0 {
  319. newCap = 1
  320. } else {
  321. for newCap < newLen {
  322. if slice.Len < 1024 {
  323. newCap += newCap
  324. } else {
  325. newCap += newCap / 4
  326. }
  327. }
  328. }
  329. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, newLen, newCap).Pointer())
  330. originalBytesCount := uintptr(slice.Len) * elementType.Size()
  331. srcPtr := (*[1 << 30]byte)(slice.Data)
  332. dstPtr := (*[1 << 30]byte)(dst)
  333. for i := uintptr(0); i < originalBytesCount; i++ {
  334. dstPtr[i] = srcPtr[i]
  335. }
  336. slice.Len = newLen
  337. slice.Cap = newCap
  338. slice.Data = dst
  339. }
  340. func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) {
  341. if expectedCap <= slice.Cap {
  342. return
  343. }
  344. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, 0, expectedCap).Pointer())
  345. slice.Cap = expectedCap
  346. slice.Data = dst
  347. }
  348. var DECODERS unsafe.Pointer
  349. func addDecoderToCache(cacheKey string, decoder Decoder) {
  350. retry := true
  351. for retry {
  352. ptr := atomic.LoadPointer(&DECODERS)
  353. cache := *(*map[string]Decoder)(ptr)
  354. copy := map[string]Decoder{}
  355. for k, v := range cache {
  356. copy[k] = v
  357. }
  358. copy[cacheKey] = decoder
  359. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  360. }
  361. }
  362. func getDecoderFromCache(cacheKey string) Decoder {
  363. ptr := atomic.LoadPointer(&DECODERS)
  364. cache := *(*map[string]Decoder)(ptr)
  365. return cache[cacheKey]
  366. }
  367. var typeDecoders map[string]Decoder
  368. var fieldDecoders map[string]Decoder
  369. func init() {
  370. typeDecoders = map[string]Decoder{}
  371. fieldDecoders = map[string]Decoder{}
  372. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  373. }
  374. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  375. type funcDecoder struct {
  376. func_ DecoderFunc
  377. }
  378. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  379. decoder.func_(ptr, iter)
  380. }
  381. func RegisterTypeDecoder(type_ string, func_ DecoderFunc) {
  382. typeDecoders[type_] = &funcDecoder{func_}
  383. }
  384. func RegisterFieldDecoder(type_ string, field string, func_ DecoderFunc) {
  385. fieldDecoders[fmt.Sprintf("%s/%s", type_, field)] = &funcDecoder{func_}
  386. }
  387. func ClearDecoders() {
  388. typeDecoders = map[string]Decoder{}
  389. fieldDecoders = map[string]Decoder{}
  390. }
  391. // emptyInterface is the header for an interface{} value.
  392. type emptyInterface struct {
  393. typ *struct{}
  394. word unsafe.Pointer
  395. }
  396. func (iter *Iterator) Read(obj interface{}) {
  397. type_ := reflect.TypeOf(obj)
  398. cacheKey := type_.String()
  399. cachedDecoder := getDecoderFromCache(cacheKey)
  400. if cachedDecoder == nil {
  401. decoder, err := decoderOfType(type_)
  402. if err != nil {
  403. iter.Error = err
  404. return
  405. }
  406. cachedDecoder = decoder
  407. addDecoderToCache(cacheKey, decoder)
  408. }
  409. e := (*emptyInterface)(unsafe.Pointer(&obj))
  410. cachedDecoder.decode(e.word, iter)
  411. }
  412. type prefix string
  413. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  414. if err != nil {
  415. return nil, fmt.Errorf("%s: %s", p, err.Error())
  416. }
  417. return decoder, err
  418. }
  419. func decoderOfType(type_ reflect.Type) (Decoder, error) {
  420. switch type_.Kind() {
  421. case reflect.Ptr:
  422. return prefix("ptr").addTo(decoderOfPtr(type_.Elem()))
  423. default:
  424. return nil, errors.New("expect ptr")
  425. }
  426. }
  427. func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
  428. typeDecoder := typeDecoders[type_.String()]
  429. if typeDecoder != nil {
  430. return typeDecoder, nil
  431. }
  432. switch type_.Kind() {
  433. case reflect.String:
  434. return &stringDecoder{}, nil
  435. case reflect.Int:
  436. return &intDecoder{}, nil
  437. case reflect.Int8:
  438. return &int8Decoder{}, nil
  439. case reflect.Int16:
  440. return &int16Decoder{}, nil
  441. case reflect.Int32:
  442. return &int32Decoder{}, nil
  443. case reflect.Int64:
  444. return &int64Decoder{}, nil
  445. case reflect.Uint:
  446. return &uintDecoder{}, nil
  447. case reflect.Uint8:
  448. return &uint8Decoder{}, nil
  449. case reflect.Uint16:
  450. return &uint16Decoder{}, nil
  451. case reflect.Uint32:
  452. return &uint32Decoder{}, nil
  453. case reflect.Uint64:
  454. return &uint64Decoder{}, nil
  455. case reflect.Float32:
  456. return &float32Decoder{}, nil
  457. case reflect.Float64:
  458. return &float64Decoder{}, nil
  459. case reflect.Bool:
  460. return &boolDecoder{}, nil
  461. case reflect.Struct:
  462. return decoderOfStruct(type_)
  463. case reflect.Slice:
  464. return prefix("[slice]").addTo(decoderOfSlice(type_))
  465. case reflect.Ptr:
  466. return prefix("[optional]").addTo(decoderOfOptional(type_.Elem()))
  467. default:
  468. return nil, fmt.Errorf("unsupported type: %v", type_)
  469. }
  470. }
  471. func decoderOfOptional(type_ reflect.Type) (Decoder, error) {
  472. decoder, err := decoderOfPtr(type_)
  473. if err != nil {
  474. return nil, err
  475. }
  476. return &optionalDecoder{type_, decoder}, nil
  477. }
  478. func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
  479. fields := map[string]*decodeFieldArgs{}
  480. for i := 0; i < type_.NumField(); i++ {
  481. field := type_.Field(i)
  482. fieldDecoderKey := fmt.Sprintf("%s/%s", type_.String(), field.Name)
  483. decoder := fieldDecoders[fieldDecoderKey]
  484. tagParts := strings.Split(field.Tag.Get("json"), ",")
  485. jsonFieldName := tagParts[0]
  486. if jsonFieldName == "" {
  487. jsonFieldName = field.Name
  488. }
  489. if decoder == nil {
  490. var err error
  491. decoder, err = decoderOfPtr(field.Type)
  492. if err != nil {
  493. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  494. }
  495. }
  496. if len(tagParts) > 1 && tagParts[1] == "string" {
  497. decoder = &stringNumberDecoder{decoder}
  498. }
  499. if jsonFieldName != "-" {
  500. fields[jsonFieldName] = &decodeFieldArgs{field.Offset, field.Name, decoder}
  501. }
  502. }
  503. switch len(fields) {
  504. case 0:
  505. return &skipDecoder{type_}, nil
  506. case 1:
  507. for fieldName, args := range fields {
  508. return &oneFieldStructDecoder{type_, fieldName, args.fieldDecoder, args.fieldOffset}, nil
  509. }
  510. case 2:
  511. var fieldName1 string
  512. var fieldName2 string
  513. var fieldDecoder1 Decoder
  514. var fieldDecoder2 Decoder
  515. var fieldOffset1 uintptr
  516. var fieldOffset2 uintptr
  517. for fieldName, args := range fields {
  518. if fieldName1 == "" {
  519. fieldName1 = fieldName
  520. fieldDecoder1 = args.fieldDecoder
  521. fieldOffset1 = args.fieldOffset
  522. } else {
  523. fieldName2 = fieldName
  524. fieldDecoder2 = args.fieldDecoder
  525. fieldOffset2 = args.fieldOffset
  526. }
  527. }
  528. return &twoFieldsStructDecoder{type_, fieldName1, fieldDecoder1, fieldOffset1,
  529. fieldName2, fieldDecoder2, fieldOffset2}, nil
  530. case 3:
  531. var fieldName1 string
  532. var fieldName2 string
  533. var fieldName3 string
  534. var fieldDecoder1 Decoder
  535. var fieldDecoder2 Decoder
  536. var fieldDecoder3 Decoder
  537. var fieldOffset1 uintptr
  538. var fieldOffset2 uintptr
  539. var fieldOffset3 uintptr
  540. for fieldName, args := range fields {
  541. if fieldName1 == "" {
  542. fieldName1 = fieldName
  543. fieldDecoder1 = args.fieldDecoder
  544. fieldOffset1 = args.fieldOffset
  545. } else if fieldName2 == "" {
  546. fieldName2 = fieldName
  547. fieldDecoder2 = args.fieldDecoder
  548. fieldOffset2 = args.fieldOffset
  549. } else {
  550. fieldName3 = fieldName
  551. fieldDecoder3 = args.fieldDecoder
  552. fieldOffset3 = args.fieldOffset
  553. }
  554. }
  555. return &threeFieldsStructDecoder{type_,
  556. fieldName1, fieldDecoder1, fieldOffset1,
  557. fieldName2, fieldDecoder2, fieldOffset2,
  558. fieldName3, fieldDecoder3, fieldOffset3}, nil
  559. case 4:
  560. var fieldName1 string
  561. var fieldName2 string
  562. var fieldName3 string
  563. var fieldName4 string
  564. var fieldDecoder1 Decoder
  565. var fieldDecoder2 Decoder
  566. var fieldDecoder3 Decoder
  567. var fieldDecoder4 Decoder
  568. var fieldOffset1 uintptr
  569. var fieldOffset2 uintptr
  570. var fieldOffset3 uintptr
  571. var fieldOffset4 uintptr
  572. for fieldName, args := range fields {
  573. if fieldName1 == "" {
  574. fieldName1 = fieldName
  575. fieldDecoder1 = args.fieldDecoder
  576. fieldOffset1 = args.fieldOffset
  577. } else if fieldName2 == "" {
  578. fieldName2 = fieldName
  579. fieldDecoder2 = args.fieldDecoder
  580. fieldOffset2 = args.fieldOffset
  581. } else if fieldName3 == "" {
  582. fieldName3 = fieldName
  583. fieldDecoder3 = args.fieldDecoder
  584. fieldOffset3 = args.fieldOffset
  585. } else {
  586. fieldName4 = fieldName
  587. fieldDecoder4 = args.fieldDecoder
  588. fieldOffset4 = args.fieldOffset
  589. }
  590. }
  591. return &fourFieldsStructDecoder{type_,
  592. fieldName1, fieldDecoder1, fieldOffset1,
  593. fieldName2, fieldDecoder2, fieldOffset2,
  594. fieldName3, fieldDecoder3, fieldOffset3,
  595. fieldName4, fieldDecoder4, fieldOffset4}, nil
  596. }
  597. return &structDecoder{type_, fields}, nil
  598. }
  599. func decoderOfSlice(type_ reflect.Type) (Decoder, error) {
  600. decoder, err := decoderOfPtr(type_.Elem())
  601. if err != nil {
  602. return nil, err
  603. }
  604. return &sliceDecoder{type_, type_.Elem(), decoder}, nil
  605. }