| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049 |
- package jsoniter
- import (
- "fmt"
- "io"
- "reflect"
- "unsafe"
- )
- func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
- fields := map[string]*structFieldEncoder{}
- structDescriptor, err := describeStruct(cfg, typ)
- if err != nil {
- return nil, err
- }
- for _, binding := range structDescriptor.Fields {
- for _, toName := range binding.ToNames {
- fields[toName] = binding.Encoder.(*structFieldEncoder)
- }
- }
- if len(fields) == 0 {
- return &emptyStructEncoder{}, nil
- }
- return &structEncoder{fields}, nil
- }
- func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
- fields := map[string]*structFieldDecoder{}
- structDescriptor, err := describeStruct(cfg, typ)
- if err != nil {
- return nil, err
- }
- for _, binding := range structDescriptor.Fields {
- for _, fromName := range binding.FromNames {
- fields[fromName] = binding.Decoder.(*structFieldDecoder)
- }
- }
- return createStructDecoder(typ, fields)
- }
- func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (ValDecoder, error) {
- knownHash := map[int32]struct{}{
- 0: {},
- }
- switch len(fields) {
- case 0:
- return &skipDecoder{typ}, nil
- case 1:
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil
- }
- case 2:
- var fieldHash1 int32
- var fieldHash2 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldHash1 == 0 {
- fieldHash1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else {
- fieldHash2 = fieldHash
- fieldDecoder2 = fieldDecoder
- }
- }
- return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil
- case 3:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- }
- }
- return &threeFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
- case 4:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- }
- }
- return &fourFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4}, nil
- case 5:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- }
- }
- return &fiveFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil
- case 6:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- }
- }
- return &sixFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil
- case 7:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- }
- }
- return &sevenFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7}, nil
- case 8:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldName8 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- var fieldDecoder8 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else if fieldName7 == 0 {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- } else {
- fieldName8 = fieldHash
- fieldDecoder8 = fieldDecoder
- }
- }
- return &eightFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil
- case 9:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldName8 int32
- var fieldName9 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- var fieldDecoder8 *structFieldDecoder
- var fieldDecoder9 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else if fieldName7 == 0 {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- } else if fieldName8 == 0 {
- fieldName8 = fieldHash
- fieldDecoder8 = fieldDecoder
- } else {
- fieldName9 = fieldHash
- fieldDecoder9 = fieldDecoder
- }
- }
- return &nineFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil
- case 10:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldName8 int32
- var fieldName9 int32
- var fieldName10 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- var fieldDecoder8 *structFieldDecoder
- var fieldDecoder9 *structFieldDecoder
- var fieldDecoder10 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else if fieldName7 == 0 {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- } else if fieldName8 == 0 {
- fieldName8 = fieldHash
- fieldDecoder8 = fieldDecoder
- } else if fieldName9 == 0 {
- fieldName9 = fieldHash
- fieldDecoder9 = fieldDecoder
- } else {
- fieldName10 = fieldHash
- fieldDecoder10 = fieldDecoder
- }
- }
- return &tenFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9,
- fieldName10, fieldDecoder10}, nil
- }
- return &generalStructDecoder{typ, fields}, nil
- }
- type generalStructDecoder struct {
- typ reflect.Type
- fields map[string]*structFieldDecoder
- }
- func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- fieldBytes := iter.readObjectFieldAsBytes()
- field := *(*string)(unsafe.Pointer(&fieldBytes))
- fieldDecoder := decoder.fields[field]
- if fieldDecoder == nil {
- iter.Skip()
- } else {
- fieldDecoder.Decode(ptr, iter)
- }
- for iter.nextToken() == ',' {
- fieldBytes = iter.readObjectFieldAsBytes()
- field = *(*string)(unsafe.Pointer(&fieldBytes))
- fieldDecoder = decoder.fields[field]
- if fieldDecoder == nil {
- iter.Skip()
- } else {
- fieldDecoder.Decode(ptr, iter)
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type skipDecoder struct {
- typ reflect.Type
- }
- func (decoder *skipDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- iter.Skip()
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type oneFieldStructDecoder struct {
- typ reflect.Type
- fieldHash int32
- fieldDecoder *structFieldDecoder
- }
- func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- if iter.readFieldHash() == decoder.fieldHash {
- decoder.fieldDecoder.Decode(ptr, iter)
- } else {
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type twoFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- }
- func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type threeFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- }
- func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type fourFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- }
- func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type fiveFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- }
- func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type sixFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- }
- func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.Decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type sevenFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- }
- func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.Decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.Decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type eightFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- fieldHash8 int32
- fieldDecoder8 *structFieldDecoder
- }
- func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.Decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.Decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.Decode(ptr, iter)
- case decoder.fieldHash8:
- decoder.fieldDecoder8.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type nineFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- fieldHash8 int32
- fieldDecoder8 *structFieldDecoder
- fieldHash9 int32
- fieldDecoder9 *structFieldDecoder
- }
- func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.Decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.Decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.Decode(ptr, iter)
- case decoder.fieldHash8:
- decoder.fieldDecoder8.Decode(ptr, iter)
- case decoder.fieldHash9:
- decoder.fieldDecoder9.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type tenFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- fieldHash8 int32
- fieldDecoder8 *structFieldDecoder
- fieldHash9 int32
- fieldDecoder9 *structFieldDecoder
- fieldHash10 int32
- fieldDecoder10 *structFieldDecoder
- }
- func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.Decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.Decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.Decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.Decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.Decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.Decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.Decode(ptr, iter)
- case decoder.fieldHash8:
- decoder.fieldDecoder8.Decode(ptr, iter)
- case decoder.fieldHash9:
- decoder.fieldDecoder9.Decode(ptr, iter)
- case decoder.fieldHash10:
- decoder.fieldDecoder10.Decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type structFieldDecoder struct {
- field *reflect.StructField
- fieldDecoder ValDecoder
- }
- func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
- fieldPtr := uintptr(ptr) + decoder.field.Offset
- decoder.fieldDecoder.Decode(unsafe.Pointer(fieldPtr), iter)
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
- }
- }
- type structFieldEncoder struct {
- field *reflect.StructField
- fieldEncoder ValEncoder
- omitempty bool
- }
- func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
- fieldPtr := uintptr(ptr) + encoder.field.Offset
- encoder.fieldEncoder.Encode(unsafe.Pointer(fieldPtr), stream)
- if stream.Error != nil && stream.Error != io.EOF {
- stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
- }
- }
- func (encoder *structFieldEncoder) EncodeInterface(val interface{}, stream *Stream) {
- writeToStream(val, stream, encoder)
- }
- func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool {
- fieldPtr := uintptr(ptr) + encoder.field.Offset
- return encoder.fieldEncoder.IsEmpty(unsafe.Pointer(fieldPtr))
- }
- type structEncoder struct {
- fields map[string]*structFieldEncoder
- }
- func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
- stream.WriteObjectStart()
- isNotFirst := false
- for fieldName, field := range encoder.fields {
- if field.omitempty && field.IsEmpty(ptr) {
- continue
- }
- if isNotFirst {
- stream.WriteMore()
- }
- stream.WriteObjectField(fieldName)
- field.Encode(ptr, stream)
- isNotFirst = true
- }
- stream.WriteObjectEnd()
- }
- func (encoder *structEncoder) EncodeInterface(val interface{}, stream *Stream) {
- var encoderToUse ValEncoder
- encoderToUse = encoder
- if len(encoder.fields) == 1 {
- var firstField *structFieldEncoder
- var firstFieldName string
- for fieldName, field := range encoder.fields {
- firstFieldName = fieldName
- firstField = field
- }
- firstEncoder := firstField.fieldEncoder
- firstEncoderName := reflect.TypeOf(firstEncoder).String()
- // interface{} has inline optimization for this case
- if firstEncoderName == "*jsoniter.optionalEncoder" {
- encoderToUse = &structEncoder{
- fields: map[string]*structFieldEncoder{
- firstFieldName: {
- field: firstField.field,
- fieldEncoder: firstEncoder.(*optionalEncoder).valueEncoder,
- omitempty: firstField.omitempty,
- }},
- }
- }
- }
- writeToStream(val, stream, encoderToUse)
- }
- func (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {
- for _, field := range encoder.fields {
- if !field.IsEmpty(ptr) {
- return false
- }
- }
- return true
- }
- type emptyStructEncoder struct {
- }
- func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
- stream.WriteEmptyObject()
- }
- func (encoder *emptyStructEncoder) EncodeInterface(val interface{}, stream *Stream) {
- writeToStream(val, stream, encoder)
- }
- func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {
- return true
- }
|