gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

reflect_struct_decoder.go (29987B)


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