podman
1097 строк · 29.3 Кб
1package jsoniter
2
3import (
4"fmt"
5"io"
6"strings"
7"unsafe"
8
9"github.com/modern-go/reflect2"
10)
11
12func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder {
13bindings := map[string]*Binding{}
14structDescriptor := describeStruct(ctx, typ)
15for _, binding := range structDescriptor.Fields {
16for _, fromName := range binding.FromNames {
17old := bindings[fromName]
18if old == nil {
19bindings[fromName] = binding
20continue
21}
22ignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding)
23if ignoreOld {
24delete(bindings, fromName)
25}
26if !ignoreNew {
27bindings[fromName] = binding
28}
29}
30}
31fields := map[string]*structFieldDecoder{}
32for k, binding := range bindings {
33fields[k] = binding.Decoder.(*structFieldDecoder)
34}
35
36if !ctx.caseSensitive() {
37for k, binding := range bindings {
38if _, found := fields[strings.ToLower(k)]; !found {
39fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder)
40}
41}
42}
43
44return createStructDecoder(ctx, typ, fields)
45}
46
47func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder {
48if ctx.disallowUnknownFields {
49return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true}
50}
51knownHash := map[int64]struct{}{
520: {},
53}
54
55switch len(fields) {
56case 0:
57return &skipObjectDecoder{typ}
58case 1:
59for fieldName, fieldDecoder := range fields {
60fieldHash := calcHash(fieldName, ctx.caseSensitive())
61_, known := knownHash[fieldHash]
62if known {
63return &generalStructDecoder{typ, fields, false}
64}
65knownHash[fieldHash] = struct{}{}
66return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}
67}
68case 2:
69var fieldHash1 int64
70var fieldHash2 int64
71var fieldDecoder1 *structFieldDecoder
72var fieldDecoder2 *structFieldDecoder
73for fieldName, fieldDecoder := range fields {
74fieldHash := calcHash(fieldName, ctx.caseSensitive())
75_, known := knownHash[fieldHash]
76if known {
77return &generalStructDecoder{typ, fields, false}
78}
79knownHash[fieldHash] = struct{}{}
80if fieldHash1 == 0 {
81fieldHash1 = fieldHash
82fieldDecoder1 = fieldDecoder
83} else {
84fieldHash2 = fieldHash
85fieldDecoder2 = fieldDecoder
86}
87}
88return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}
89case 3:
90var fieldName1 int64
91var fieldName2 int64
92var fieldName3 int64
93var fieldDecoder1 *structFieldDecoder
94var fieldDecoder2 *structFieldDecoder
95var fieldDecoder3 *structFieldDecoder
96for fieldName, fieldDecoder := range fields {
97fieldHash := calcHash(fieldName, ctx.caseSensitive())
98_, known := knownHash[fieldHash]
99if known {
100return &generalStructDecoder{typ, fields, false}
101}
102knownHash[fieldHash] = struct{}{}
103if fieldName1 == 0 {
104fieldName1 = fieldHash
105fieldDecoder1 = fieldDecoder
106} else if fieldName2 == 0 {
107fieldName2 = fieldHash
108fieldDecoder2 = fieldDecoder
109} else {
110fieldName3 = fieldHash
111fieldDecoder3 = fieldDecoder
112}
113}
114return &threeFieldsStructDecoder{typ,
115fieldName1, fieldDecoder1,
116fieldName2, fieldDecoder2,
117fieldName3, fieldDecoder3}
118case 4:
119var fieldName1 int64
120var fieldName2 int64
121var fieldName3 int64
122var fieldName4 int64
123var fieldDecoder1 *structFieldDecoder
124var fieldDecoder2 *structFieldDecoder
125var fieldDecoder3 *structFieldDecoder
126var fieldDecoder4 *structFieldDecoder
127for fieldName, fieldDecoder := range fields {
128fieldHash := calcHash(fieldName, ctx.caseSensitive())
129_, known := knownHash[fieldHash]
130if known {
131return &generalStructDecoder{typ, fields, false}
132}
133knownHash[fieldHash] = struct{}{}
134if fieldName1 == 0 {
135fieldName1 = fieldHash
136fieldDecoder1 = fieldDecoder
137} else if fieldName2 == 0 {
138fieldName2 = fieldHash
139fieldDecoder2 = fieldDecoder
140} else if fieldName3 == 0 {
141fieldName3 = fieldHash
142fieldDecoder3 = fieldDecoder
143} else {
144fieldName4 = fieldHash
145fieldDecoder4 = fieldDecoder
146}
147}
148return &fourFieldsStructDecoder{typ,
149fieldName1, fieldDecoder1,
150fieldName2, fieldDecoder2,
151fieldName3, fieldDecoder3,
152fieldName4, fieldDecoder4}
153case 5:
154var fieldName1 int64
155var fieldName2 int64
156var fieldName3 int64
157var fieldName4 int64
158var fieldName5 int64
159var fieldDecoder1 *structFieldDecoder
160var fieldDecoder2 *structFieldDecoder
161var fieldDecoder3 *structFieldDecoder
162var fieldDecoder4 *structFieldDecoder
163var fieldDecoder5 *structFieldDecoder
164for fieldName, fieldDecoder := range fields {
165fieldHash := calcHash(fieldName, ctx.caseSensitive())
166_, known := knownHash[fieldHash]
167if known {
168return &generalStructDecoder{typ, fields, false}
169}
170knownHash[fieldHash] = struct{}{}
171if fieldName1 == 0 {
172fieldName1 = fieldHash
173fieldDecoder1 = fieldDecoder
174} else if fieldName2 == 0 {
175fieldName2 = fieldHash
176fieldDecoder2 = fieldDecoder
177} else if fieldName3 == 0 {
178fieldName3 = fieldHash
179fieldDecoder3 = fieldDecoder
180} else if fieldName4 == 0 {
181fieldName4 = fieldHash
182fieldDecoder4 = fieldDecoder
183} else {
184fieldName5 = fieldHash
185fieldDecoder5 = fieldDecoder
186}
187}
188return &fiveFieldsStructDecoder{typ,
189fieldName1, fieldDecoder1,
190fieldName2, fieldDecoder2,
191fieldName3, fieldDecoder3,
192fieldName4, fieldDecoder4,
193fieldName5, fieldDecoder5}
194case 6:
195var fieldName1 int64
196var fieldName2 int64
197var fieldName3 int64
198var fieldName4 int64
199var fieldName5 int64
200var fieldName6 int64
201var fieldDecoder1 *structFieldDecoder
202var fieldDecoder2 *structFieldDecoder
203var fieldDecoder3 *structFieldDecoder
204var fieldDecoder4 *structFieldDecoder
205var fieldDecoder5 *structFieldDecoder
206var fieldDecoder6 *structFieldDecoder
207for fieldName, fieldDecoder := range fields {
208fieldHash := calcHash(fieldName, ctx.caseSensitive())
209_, known := knownHash[fieldHash]
210if known {
211return &generalStructDecoder{typ, fields, false}
212}
213knownHash[fieldHash] = struct{}{}
214if fieldName1 == 0 {
215fieldName1 = fieldHash
216fieldDecoder1 = fieldDecoder
217} else if fieldName2 == 0 {
218fieldName2 = fieldHash
219fieldDecoder2 = fieldDecoder
220} else if fieldName3 == 0 {
221fieldName3 = fieldHash
222fieldDecoder3 = fieldDecoder
223} else if fieldName4 == 0 {
224fieldName4 = fieldHash
225fieldDecoder4 = fieldDecoder
226} else if fieldName5 == 0 {
227fieldName5 = fieldHash
228fieldDecoder5 = fieldDecoder
229} else {
230fieldName6 = fieldHash
231fieldDecoder6 = fieldDecoder
232}
233}
234return &sixFieldsStructDecoder{typ,
235fieldName1, fieldDecoder1,
236fieldName2, fieldDecoder2,
237fieldName3, fieldDecoder3,
238fieldName4, fieldDecoder4,
239fieldName5, fieldDecoder5,
240fieldName6, fieldDecoder6}
241case 7:
242var fieldName1 int64
243var fieldName2 int64
244var fieldName3 int64
245var fieldName4 int64
246var fieldName5 int64
247var fieldName6 int64
248var fieldName7 int64
249var fieldDecoder1 *structFieldDecoder
250var fieldDecoder2 *structFieldDecoder
251var fieldDecoder3 *structFieldDecoder
252var fieldDecoder4 *structFieldDecoder
253var fieldDecoder5 *structFieldDecoder
254var fieldDecoder6 *structFieldDecoder
255var fieldDecoder7 *structFieldDecoder
256for fieldName, fieldDecoder := range fields {
257fieldHash := calcHash(fieldName, ctx.caseSensitive())
258_, known := knownHash[fieldHash]
259if known {
260return &generalStructDecoder{typ, fields, false}
261}
262knownHash[fieldHash] = struct{}{}
263if fieldName1 == 0 {
264fieldName1 = fieldHash
265fieldDecoder1 = fieldDecoder
266} else if fieldName2 == 0 {
267fieldName2 = fieldHash
268fieldDecoder2 = fieldDecoder
269} else if fieldName3 == 0 {
270fieldName3 = fieldHash
271fieldDecoder3 = fieldDecoder
272} else if fieldName4 == 0 {
273fieldName4 = fieldHash
274fieldDecoder4 = fieldDecoder
275} else if fieldName5 == 0 {
276fieldName5 = fieldHash
277fieldDecoder5 = fieldDecoder
278} else if fieldName6 == 0 {
279fieldName6 = fieldHash
280fieldDecoder6 = fieldDecoder
281} else {
282fieldName7 = fieldHash
283fieldDecoder7 = fieldDecoder
284}
285}
286return &sevenFieldsStructDecoder{typ,
287fieldName1, fieldDecoder1,
288fieldName2, fieldDecoder2,
289fieldName3, fieldDecoder3,
290fieldName4, fieldDecoder4,
291fieldName5, fieldDecoder5,
292fieldName6, fieldDecoder6,
293fieldName7, fieldDecoder7}
294case 8:
295var fieldName1 int64
296var fieldName2 int64
297var fieldName3 int64
298var fieldName4 int64
299var fieldName5 int64
300var fieldName6 int64
301var fieldName7 int64
302var fieldName8 int64
303var fieldDecoder1 *structFieldDecoder
304var fieldDecoder2 *structFieldDecoder
305var fieldDecoder3 *structFieldDecoder
306var fieldDecoder4 *structFieldDecoder
307var fieldDecoder5 *structFieldDecoder
308var fieldDecoder6 *structFieldDecoder
309var fieldDecoder7 *structFieldDecoder
310var fieldDecoder8 *structFieldDecoder
311for fieldName, fieldDecoder := range fields {
312fieldHash := calcHash(fieldName, ctx.caseSensitive())
313_, known := knownHash[fieldHash]
314if known {
315return &generalStructDecoder{typ, fields, false}
316}
317knownHash[fieldHash] = struct{}{}
318if fieldName1 == 0 {
319fieldName1 = fieldHash
320fieldDecoder1 = fieldDecoder
321} else if fieldName2 == 0 {
322fieldName2 = fieldHash
323fieldDecoder2 = fieldDecoder
324} else if fieldName3 == 0 {
325fieldName3 = fieldHash
326fieldDecoder3 = fieldDecoder
327} else if fieldName4 == 0 {
328fieldName4 = fieldHash
329fieldDecoder4 = fieldDecoder
330} else if fieldName5 == 0 {
331fieldName5 = fieldHash
332fieldDecoder5 = fieldDecoder
333} else if fieldName6 == 0 {
334fieldName6 = fieldHash
335fieldDecoder6 = fieldDecoder
336} else if fieldName7 == 0 {
337fieldName7 = fieldHash
338fieldDecoder7 = fieldDecoder
339} else {
340fieldName8 = fieldHash
341fieldDecoder8 = fieldDecoder
342}
343}
344return &eightFieldsStructDecoder{typ,
345fieldName1, fieldDecoder1,
346fieldName2, fieldDecoder2,
347fieldName3, fieldDecoder3,
348fieldName4, fieldDecoder4,
349fieldName5, fieldDecoder5,
350fieldName6, fieldDecoder6,
351fieldName7, fieldDecoder7,
352fieldName8, fieldDecoder8}
353case 9:
354var fieldName1 int64
355var fieldName2 int64
356var fieldName3 int64
357var fieldName4 int64
358var fieldName5 int64
359var fieldName6 int64
360var fieldName7 int64
361var fieldName8 int64
362var fieldName9 int64
363var fieldDecoder1 *structFieldDecoder
364var fieldDecoder2 *structFieldDecoder
365var fieldDecoder3 *structFieldDecoder
366var fieldDecoder4 *structFieldDecoder
367var fieldDecoder5 *structFieldDecoder
368var fieldDecoder6 *structFieldDecoder
369var fieldDecoder7 *structFieldDecoder
370var fieldDecoder8 *structFieldDecoder
371var fieldDecoder9 *structFieldDecoder
372for fieldName, fieldDecoder := range fields {
373fieldHash := calcHash(fieldName, ctx.caseSensitive())
374_, known := knownHash[fieldHash]
375if known {
376return &generalStructDecoder{typ, fields, false}
377}
378knownHash[fieldHash] = struct{}{}
379if fieldName1 == 0 {
380fieldName1 = fieldHash
381fieldDecoder1 = fieldDecoder
382} else if fieldName2 == 0 {
383fieldName2 = fieldHash
384fieldDecoder2 = fieldDecoder
385} else if fieldName3 == 0 {
386fieldName3 = fieldHash
387fieldDecoder3 = fieldDecoder
388} else if fieldName4 == 0 {
389fieldName4 = fieldHash
390fieldDecoder4 = fieldDecoder
391} else if fieldName5 == 0 {
392fieldName5 = fieldHash
393fieldDecoder5 = fieldDecoder
394} else if fieldName6 == 0 {
395fieldName6 = fieldHash
396fieldDecoder6 = fieldDecoder
397} else if fieldName7 == 0 {
398fieldName7 = fieldHash
399fieldDecoder7 = fieldDecoder
400} else if fieldName8 == 0 {
401fieldName8 = fieldHash
402fieldDecoder8 = fieldDecoder
403} else {
404fieldName9 = fieldHash
405fieldDecoder9 = fieldDecoder
406}
407}
408return &nineFieldsStructDecoder{typ,
409fieldName1, fieldDecoder1,
410fieldName2, fieldDecoder2,
411fieldName3, fieldDecoder3,
412fieldName4, fieldDecoder4,
413fieldName5, fieldDecoder5,
414fieldName6, fieldDecoder6,
415fieldName7, fieldDecoder7,
416fieldName8, fieldDecoder8,
417fieldName9, fieldDecoder9}
418case 10:
419var fieldName1 int64
420var fieldName2 int64
421var fieldName3 int64
422var fieldName4 int64
423var fieldName5 int64
424var fieldName6 int64
425var fieldName7 int64
426var fieldName8 int64
427var fieldName9 int64
428var fieldName10 int64
429var fieldDecoder1 *structFieldDecoder
430var fieldDecoder2 *structFieldDecoder
431var fieldDecoder3 *structFieldDecoder
432var fieldDecoder4 *structFieldDecoder
433var fieldDecoder5 *structFieldDecoder
434var fieldDecoder6 *structFieldDecoder
435var fieldDecoder7 *structFieldDecoder
436var fieldDecoder8 *structFieldDecoder
437var fieldDecoder9 *structFieldDecoder
438var fieldDecoder10 *structFieldDecoder
439for fieldName, fieldDecoder := range fields {
440fieldHash := calcHash(fieldName, ctx.caseSensitive())
441_, known := knownHash[fieldHash]
442if known {
443return &generalStructDecoder{typ, fields, false}
444}
445knownHash[fieldHash] = struct{}{}
446if fieldName1 == 0 {
447fieldName1 = fieldHash
448fieldDecoder1 = fieldDecoder
449} else if fieldName2 == 0 {
450fieldName2 = fieldHash
451fieldDecoder2 = fieldDecoder
452} else if fieldName3 == 0 {
453fieldName3 = fieldHash
454fieldDecoder3 = fieldDecoder
455} else if fieldName4 == 0 {
456fieldName4 = fieldHash
457fieldDecoder4 = fieldDecoder
458} else if fieldName5 == 0 {
459fieldName5 = fieldHash
460fieldDecoder5 = fieldDecoder
461} else if fieldName6 == 0 {
462fieldName6 = fieldHash
463fieldDecoder6 = fieldDecoder
464} else if fieldName7 == 0 {
465fieldName7 = fieldHash
466fieldDecoder7 = fieldDecoder
467} else if fieldName8 == 0 {
468fieldName8 = fieldHash
469fieldDecoder8 = fieldDecoder
470} else if fieldName9 == 0 {
471fieldName9 = fieldHash
472fieldDecoder9 = fieldDecoder
473} else {
474fieldName10 = fieldHash
475fieldDecoder10 = fieldDecoder
476}
477}
478return &tenFieldsStructDecoder{typ,
479fieldName1, fieldDecoder1,
480fieldName2, fieldDecoder2,
481fieldName3, fieldDecoder3,
482fieldName4, fieldDecoder4,
483fieldName5, fieldDecoder5,
484fieldName6, fieldDecoder6,
485fieldName7, fieldDecoder7,
486fieldName8, fieldDecoder8,
487fieldName9, fieldDecoder9,
488fieldName10, fieldDecoder10}
489}
490return &generalStructDecoder{typ, fields, false}
491}
492
493type generalStructDecoder struct {
494typ reflect2.Type
495fields map[string]*structFieldDecoder
496disallowUnknownFields bool
497}
498
499func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
500if !iter.readObjectStart() {
501return
502}
503if !iter.incrementDepth() {
504return
505}
506var c byte
507for c = ','; c == ','; c = iter.nextToken() {
508decoder.decodeOneField(ptr, iter)
509}
510if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
511iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
512}
513if c != '}' {
514iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c}))
515}
516iter.decrementDepth()
517}
518
519func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) {
520var field string
521var fieldDecoder *structFieldDecoder
522if iter.cfg.objectFieldMustBeSimpleString {
523fieldBytes := iter.ReadStringAsSlice()
524field = *(*string)(unsafe.Pointer(&fieldBytes))
525fieldDecoder = decoder.fields[field]
526if fieldDecoder == nil && !iter.cfg.caseSensitive {
527fieldDecoder = decoder.fields[strings.ToLower(field)]
528}
529} else {
530field = iter.ReadString()
531fieldDecoder = decoder.fields[field]
532if fieldDecoder == nil && !iter.cfg.caseSensitive {
533fieldDecoder = decoder.fields[strings.ToLower(field)]
534}
535}
536if fieldDecoder == nil {
537if decoder.disallowUnknownFields {
538msg := "found unknown field: " + field
539iter.ReportError("ReadObject", msg)
540}
541c := iter.nextToken()
542if c != ':' {
543iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
544}
545iter.Skip()
546return
547}
548c := iter.nextToken()
549if c != ':' {
550iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
551}
552fieldDecoder.Decode(ptr, iter)
553}
554
555type skipObjectDecoder struct {
556typ reflect2.Type
557}
558
559func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
560valueType := iter.WhatIsNext()
561if valueType != ObjectValue && valueType != NilValue {
562iter.ReportError("skipObjectDecoder", "expect object or null")
563return
564}
565iter.Skip()
566}
567
568type oneFieldStructDecoder struct {
569typ reflect2.Type
570fieldHash int64
571fieldDecoder *structFieldDecoder
572}
573
574func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
575if !iter.readObjectStart() {
576return
577}
578if !iter.incrementDepth() {
579return
580}
581for {
582if iter.readFieldHash() == decoder.fieldHash {
583decoder.fieldDecoder.Decode(ptr, iter)
584} else {
585iter.Skip()
586}
587if iter.isObjectEnd() {
588break
589}
590}
591if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
592iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
593}
594iter.decrementDepth()
595}
596
597type twoFieldsStructDecoder struct {
598typ reflect2.Type
599fieldHash1 int64
600fieldDecoder1 *structFieldDecoder
601fieldHash2 int64
602fieldDecoder2 *structFieldDecoder
603}
604
605func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
606if !iter.readObjectStart() {
607return
608}
609if !iter.incrementDepth() {
610return
611}
612for {
613switch iter.readFieldHash() {
614case decoder.fieldHash1:
615decoder.fieldDecoder1.Decode(ptr, iter)
616case decoder.fieldHash2:
617decoder.fieldDecoder2.Decode(ptr, iter)
618default:
619iter.Skip()
620}
621if iter.isObjectEnd() {
622break
623}
624}
625if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
626iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
627}
628iter.decrementDepth()
629}
630
631type threeFieldsStructDecoder struct {
632typ reflect2.Type
633fieldHash1 int64
634fieldDecoder1 *structFieldDecoder
635fieldHash2 int64
636fieldDecoder2 *structFieldDecoder
637fieldHash3 int64
638fieldDecoder3 *structFieldDecoder
639}
640
641func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
642if !iter.readObjectStart() {
643return
644}
645if !iter.incrementDepth() {
646return
647}
648for {
649switch iter.readFieldHash() {
650case decoder.fieldHash1:
651decoder.fieldDecoder1.Decode(ptr, iter)
652case decoder.fieldHash2:
653decoder.fieldDecoder2.Decode(ptr, iter)
654case decoder.fieldHash3:
655decoder.fieldDecoder3.Decode(ptr, iter)
656default:
657iter.Skip()
658}
659if iter.isObjectEnd() {
660break
661}
662}
663if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
664iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
665}
666iter.decrementDepth()
667}
668
669type fourFieldsStructDecoder struct {
670typ reflect2.Type
671fieldHash1 int64
672fieldDecoder1 *structFieldDecoder
673fieldHash2 int64
674fieldDecoder2 *structFieldDecoder
675fieldHash3 int64
676fieldDecoder3 *structFieldDecoder
677fieldHash4 int64
678fieldDecoder4 *structFieldDecoder
679}
680
681func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
682if !iter.readObjectStart() {
683return
684}
685if !iter.incrementDepth() {
686return
687}
688for {
689switch iter.readFieldHash() {
690case decoder.fieldHash1:
691decoder.fieldDecoder1.Decode(ptr, iter)
692case decoder.fieldHash2:
693decoder.fieldDecoder2.Decode(ptr, iter)
694case decoder.fieldHash3:
695decoder.fieldDecoder3.Decode(ptr, iter)
696case decoder.fieldHash4:
697decoder.fieldDecoder4.Decode(ptr, iter)
698default:
699iter.Skip()
700}
701if iter.isObjectEnd() {
702break
703}
704}
705if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
706iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
707}
708iter.decrementDepth()
709}
710
711type fiveFieldsStructDecoder struct {
712typ reflect2.Type
713fieldHash1 int64
714fieldDecoder1 *structFieldDecoder
715fieldHash2 int64
716fieldDecoder2 *structFieldDecoder
717fieldHash3 int64
718fieldDecoder3 *structFieldDecoder
719fieldHash4 int64
720fieldDecoder4 *structFieldDecoder
721fieldHash5 int64
722fieldDecoder5 *structFieldDecoder
723}
724
725func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
726if !iter.readObjectStart() {
727return
728}
729if !iter.incrementDepth() {
730return
731}
732for {
733switch iter.readFieldHash() {
734case decoder.fieldHash1:
735decoder.fieldDecoder1.Decode(ptr, iter)
736case decoder.fieldHash2:
737decoder.fieldDecoder2.Decode(ptr, iter)
738case decoder.fieldHash3:
739decoder.fieldDecoder3.Decode(ptr, iter)
740case decoder.fieldHash4:
741decoder.fieldDecoder4.Decode(ptr, iter)
742case decoder.fieldHash5:
743decoder.fieldDecoder5.Decode(ptr, iter)
744default:
745iter.Skip()
746}
747if iter.isObjectEnd() {
748break
749}
750}
751if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
752iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
753}
754iter.decrementDepth()
755}
756
757type sixFieldsStructDecoder struct {
758typ reflect2.Type
759fieldHash1 int64
760fieldDecoder1 *structFieldDecoder
761fieldHash2 int64
762fieldDecoder2 *structFieldDecoder
763fieldHash3 int64
764fieldDecoder3 *structFieldDecoder
765fieldHash4 int64
766fieldDecoder4 *structFieldDecoder
767fieldHash5 int64
768fieldDecoder5 *structFieldDecoder
769fieldHash6 int64
770fieldDecoder6 *structFieldDecoder
771}
772
773func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
774if !iter.readObjectStart() {
775return
776}
777if !iter.incrementDepth() {
778return
779}
780for {
781switch iter.readFieldHash() {
782case decoder.fieldHash1:
783decoder.fieldDecoder1.Decode(ptr, iter)
784case decoder.fieldHash2:
785decoder.fieldDecoder2.Decode(ptr, iter)
786case decoder.fieldHash3:
787decoder.fieldDecoder3.Decode(ptr, iter)
788case decoder.fieldHash4:
789decoder.fieldDecoder4.Decode(ptr, iter)
790case decoder.fieldHash5:
791decoder.fieldDecoder5.Decode(ptr, iter)
792case decoder.fieldHash6:
793decoder.fieldDecoder6.Decode(ptr, iter)
794default:
795iter.Skip()
796}
797if iter.isObjectEnd() {
798break
799}
800}
801if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
802iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
803}
804iter.decrementDepth()
805}
806
807type sevenFieldsStructDecoder struct {
808typ reflect2.Type
809fieldHash1 int64
810fieldDecoder1 *structFieldDecoder
811fieldHash2 int64
812fieldDecoder2 *structFieldDecoder
813fieldHash3 int64
814fieldDecoder3 *structFieldDecoder
815fieldHash4 int64
816fieldDecoder4 *structFieldDecoder
817fieldHash5 int64
818fieldDecoder5 *structFieldDecoder
819fieldHash6 int64
820fieldDecoder6 *structFieldDecoder
821fieldHash7 int64
822fieldDecoder7 *structFieldDecoder
823}
824
825func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
826if !iter.readObjectStart() {
827return
828}
829if !iter.incrementDepth() {
830return
831}
832for {
833switch iter.readFieldHash() {
834case decoder.fieldHash1:
835decoder.fieldDecoder1.Decode(ptr, iter)
836case decoder.fieldHash2:
837decoder.fieldDecoder2.Decode(ptr, iter)
838case decoder.fieldHash3:
839decoder.fieldDecoder3.Decode(ptr, iter)
840case decoder.fieldHash4:
841decoder.fieldDecoder4.Decode(ptr, iter)
842case decoder.fieldHash5:
843decoder.fieldDecoder5.Decode(ptr, iter)
844case decoder.fieldHash6:
845decoder.fieldDecoder6.Decode(ptr, iter)
846case decoder.fieldHash7:
847decoder.fieldDecoder7.Decode(ptr, iter)
848default:
849iter.Skip()
850}
851if iter.isObjectEnd() {
852break
853}
854}
855if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
856iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
857}
858iter.decrementDepth()
859}
860
861type eightFieldsStructDecoder struct {
862typ reflect2.Type
863fieldHash1 int64
864fieldDecoder1 *structFieldDecoder
865fieldHash2 int64
866fieldDecoder2 *structFieldDecoder
867fieldHash3 int64
868fieldDecoder3 *structFieldDecoder
869fieldHash4 int64
870fieldDecoder4 *structFieldDecoder
871fieldHash5 int64
872fieldDecoder5 *structFieldDecoder
873fieldHash6 int64
874fieldDecoder6 *structFieldDecoder
875fieldHash7 int64
876fieldDecoder7 *structFieldDecoder
877fieldHash8 int64
878fieldDecoder8 *structFieldDecoder
879}
880
881func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
882if !iter.readObjectStart() {
883return
884}
885if !iter.incrementDepth() {
886return
887}
888for {
889switch iter.readFieldHash() {
890case decoder.fieldHash1:
891decoder.fieldDecoder1.Decode(ptr, iter)
892case decoder.fieldHash2:
893decoder.fieldDecoder2.Decode(ptr, iter)
894case decoder.fieldHash3:
895decoder.fieldDecoder3.Decode(ptr, iter)
896case decoder.fieldHash4:
897decoder.fieldDecoder4.Decode(ptr, iter)
898case decoder.fieldHash5:
899decoder.fieldDecoder5.Decode(ptr, iter)
900case decoder.fieldHash6:
901decoder.fieldDecoder6.Decode(ptr, iter)
902case decoder.fieldHash7:
903decoder.fieldDecoder7.Decode(ptr, iter)
904case decoder.fieldHash8:
905decoder.fieldDecoder8.Decode(ptr, iter)
906default:
907iter.Skip()
908}
909if iter.isObjectEnd() {
910break
911}
912}
913if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
914iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
915}
916iter.decrementDepth()
917}
918
919type nineFieldsStructDecoder struct {
920typ reflect2.Type
921fieldHash1 int64
922fieldDecoder1 *structFieldDecoder
923fieldHash2 int64
924fieldDecoder2 *structFieldDecoder
925fieldHash3 int64
926fieldDecoder3 *structFieldDecoder
927fieldHash4 int64
928fieldDecoder4 *structFieldDecoder
929fieldHash5 int64
930fieldDecoder5 *structFieldDecoder
931fieldHash6 int64
932fieldDecoder6 *structFieldDecoder
933fieldHash7 int64
934fieldDecoder7 *structFieldDecoder
935fieldHash8 int64
936fieldDecoder8 *structFieldDecoder
937fieldHash9 int64
938fieldDecoder9 *structFieldDecoder
939}
940
941func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
942if !iter.readObjectStart() {
943return
944}
945if !iter.incrementDepth() {
946return
947}
948for {
949switch iter.readFieldHash() {
950case decoder.fieldHash1:
951decoder.fieldDecoder1.Decode(ptr, iter)
952case decoder.fieldHash2:
953decoder.fieldDecoder2.Decode(ptr, iter)
954case decoder.fieldHash3:
955decoder.fieldDecoder3.Decode(ptr, iter)
956case decoder.fieldHash4:
957decoder.fieldDecoder4.Decode(ptr, iter)
958case decoder.fieldHash5:
959decoder.fieldDecoder5.Decode(ptr, iter)
960case decoder.fieldHash6:
961decoder.fieldDecoder6.Decode(ptr, iter)
962case decoder.fieldHash7:
963decoder.fieldDecoder7.Decode(ptr, iter)
964case decoder.fieldHash8:
965decoder.fieldDecoder8.Decode(ptr, iter)
966case decoder.fieldHash9:
967decoder.fieldDecoder9.Decode(ptr, iter)
968default:
969iter.Skip()
970}
971if iter.isObjectEnd() {
972break
973}
974}
975if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
976iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
977}
978iter.decrementDepth()
979}
980
981type tenFieldsStructDecoder struct {
982typ reflect2.Type
983fieldHash1 int64
984fieldDecoder1 *structFieldDecoder
985fieldHash2 int64
986fieldDecoder2 *structFieldDecoder
987fieldHash3 int64
988fieldDecoder3 *structFieldDecoder
989fieldHash4 int64
990fieldDecoder4 *structFieldDecoder
991fieldHash5 int64
992fieldDecoder5 *structFieldDecoder
993fieldHash6 int64
994fieldDecoder6 *structFieldDecoder
995fieldHash7 int64
996fieldDecoder7 *structFieldDecoder
997fieldHash8 int64
998fieldDecoder8 *structFieldDecoder
999fieldHash9 int64
1000fieldDecoder9 *structFieldDecoder
1001fieldHash10 int64
1002fieldDecoder10 *structFieldDecoder
1003}
1004
1005func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1006if !iter.readObjectStart() {
1007return
1008}
1009if !iter.incrementDepth() {
1010return
1011}
1012for {
1013switch iter.readFieldHash() {
1014case decoder.fieldHash1:
1015decoder.fieldDecoder1.Decode(ptr, iter)
1016case decoder.fieldHash2:
1017decoder.fieldDecoder2.Decode(ptr, iter)
1018case decoder.fieldHash3:
1019decoder.fieldDecoder3.Decode(ptr, iter)
1020case decoder.fieldHash4:
1021decoder.fieldDecoder4.Decode(ptr, iter)
1022case decoder.fieldHash5:
1023decoder.fieldDecoder5.Decode(ptr, iter)
1024case decoder.fieldHash6:
1025decoder.fieldDecoder6.Decode(ptr, iter)
1026case decoder.fieldHash7:
1027decoder.fieldDecoder7.Decode(ptr, iter)
1028case decoder.fieldHash8:
1029decoder.fieldDecoder8.Decode(ptr, iter)
1030case decoder.fieldHash9:
1031decoder.fieldDecoder9.Decode(ptr, iter)
1032case decoder.fieldHash10:
1033decoder.fieldDecoder10.Decode(ptr, iter)
1034default:
1035iter.Skip()
1036}
1037if iter.isObjectEnd() {
1038break
1039}
1040}
1041if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
1042iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
1043}
1044iter.decrementDepth()
1045}
1046
1047type structFieldDecoder struct {
1048field reflect2.StructField
1049fieldDecoder ValDecoder
1050}
1051
1052func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1053fieldPtr := decoder.field.UnsafeGet(ptr)
1054decoder.fieldDecoder.Decode(fieldPtr, iter)
1055if iter.Error != nil && iter.Error != io.EOF {
1056iter.Error = fmt.Errorf("%s: %s", decoder.field.Name(), iter.Error.Error())
1057}
1058}
1059
1060type stringModeStringDecoder struct {
1061elemDecoder ValDecoder
1062cfg *frozenConfig
1063}
1064
1065func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1066decoder.elemDecoder.Decode(ptr, iter)
1067str := *((*string)(ptr))
1068tempIter := decoder.cfg.BorrowIterator([]byte(str))
1069defer decoder.cfg.ReturnIterator(tempIter)
1070*((*string)(ptr)) = tempIter.ReadString()
1071}
1072
1073type stringModeNumberDecoder struct {
1074elemDecoder ValDecoder
1075}
1076
1077func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1078if iter.WhatIsNext() == NilValue {
1079decoder.elemDecoder.Decode(ptr, iter)
1080return
1081}
1082
1083c := iter.nextToken()
1084if c != '"' {
1085iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
1086return
1087}
1088decoder.elemDecoder.Decode(ptr, iter)
1089if iter.Error != nil {
1090return
1091}
1092c = iter.readByte()
1093if c != '"' {
1094iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
1095return
1096}
1097}
1098