@@ -332,21 +332,20 @@ func (d *decodeState) skip() {
332
332
333
333
// scanNext processes the byte at d.data[d.off].
334
334
func (d * decodeState ) scanNext () {
335
- s , data , i := & d .scan , d .data , d .off
336
- if i < len (data ) {
337
- d .opcode = s .step (s , data [i ])
338
- d .off = i + 1
335
+ if d .off < len (d .data ) {
336
+ d .opcode = d .scan .step (& d .scan , d .data [d .off ])
337
+ d .off ++
339
338
} else {
340
- d .opcode = s .eof ()
341
- d .off = len (data ) + 1 // mark processed EOF with len+1
339
+ d .opcode = d . scan .eof ()
340
+ d .off = len (d . data ) + 1 // mark processed EOF with len+1
342
341
}
343
342
}
344
343
345
344
// scanWhile processes bytes in d.data[d.off:] until it
346
345
// receives a scan code not equal to op.
347
346
func (d * decodeState ) scanWhile (op int ) {
348
347
s , data , i := & d .scan , d .data , d .off
349
- for i < len (d . data ) {
348
+ for i < len (data ) {
350
349
newOp := s .step (s , data [i ])
351
350
i ++
352
351
if newOp != op {
@@ -356,7 +355,7 @@ func (d *decodeState) scanWhile(op int) {
356
355
}
357
356
}
358
357
359
- d .off = len (d . data ) + 1 // mark processed EOF with len+1
358
+ d .off = len (data ) + 1 // mark processed EOF with len+1
360
359
d .opcode = d .scan .eof ()
361
360
}
362
361
@@ -413,11 +412,7 @@ func (d *decodeState) valueQuoted() (interface{}, error) {
413
412
default :
414
413
return nil , errPhase
415
414
416
- case scanBeginArray :
417
- d .skip ()
418
- d .scanNext ()
419
-
420
- case scanBeginObject :
415
+ case scanBeginArray , scanBeginObject :
421
416
d .skip ()
422
417
d .scanNext ()
423
418
@@ -629,6 +624,7 @@ func (d *decodeState) object(v reflect.Value) error {
629
624
return nil
630
625
}
631
626
v = pv
627
+ t := v .Type ()
632
628
633
629
// Decoding into nil interface? Switch to non-reflect code.
634
630
if v .Kind () == reflect .Interface && v .NumMethod () == 0 {
@@ -640,6 +636,8 @@ func (d *decodeState) object(v reflect.Value) error {
640
636
return nil
641
637
}
642
638
639
+ var fields []field
640
+
643
641
// Check type of target:
644
642
// struct or
645
643
// map[T1]T2 where T1 is string, an integer type,
@@ -648,14 +646,13 @@ func (d *decodeState) object(v reflect.Value) error {
648
646
case reflect .Map :
649
647
// Map key must either have string kind, have an integer kind,
650
648
// or be an encoding.TextUnmarshaler.
651
- t := v .Type ()
652
649
switch t .Key ().Kind () {
653
650
case reflect .String ,
654
651
reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 ,
655
652
reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 , reflect .Uintptr :
656
653
default :
657
654
if ! reflect .PtrTo (t .Key ()).Implements (textUnmarshalerType ) {
658
- d .saveError (& UnmarshalTypeError {Value : "object" , Type : v . Type () , Offset : int64 (d .off )})
655
+ d .saveError (& UnmarshalTypeError {Value : "object" , Type : t , Offset : int64 (d .off )})
659
656
d .skip ()
660
657
return nil
661
658
}
@@ -664,9 +661,10 @@ func (d *decodeState) object(v reflect.Value) error {
664
661
v .Set (reflect .MakeMap (t ))
665
662
}
666
663
case reflect .Struct :
664
+ fields = cachedTypeFields (t )
667
665
// ok
668
666
default :
669
- d .saveError (& UnmarshalTypeError {Value : "object" , Type : v . Type () , Offset : int64 (d .off )})
667
+ d .saveError (& UnmarshalTypeError {Value : "object" , Type : t , Offset : int64 (d .off )})
670
668
d .skip ()
671
669
return nil
672
670
}
@@ -698,7 +696,7 @@ func (d *decodeState) object(v reflect.Value) error {
698
696
destring := false // whether the value is wrapped in a string to be decoded first
699
697
700
698
if v .Kind () == reflect .Map {
701
- elemType := v . Type () .Elem ()
699
+ elemType := t .Elem ()
702
700
if ! mapElem .IsValid () {
703
701
mapElem = reflect .New (elemType ).Elem ()
704
702
} else {
@@ -707,7 +705,6 @@ func (d *decodeState) object(v reflect.Value) error {
707
705
subv = mapElem
708
706
} else {
709
707
var f * field
710
- fields := cachedTypeFields (v .Type ())
711
708
for i := range fields {
712
709
ff := & fields [i ]
713
710
if bytes .Equal (ff .nameBytes , key ) {
@@ -744,7 +741,7 @@ func (d *decodeState) object(v reflect.Value) error {
744
741
subv = subv .Field (i )
745
742
}
746
743
d .errorContext .Field = f .name
747
- d .errorContext .Struct = v . Type ()
744
+ d .errorContext .Struct = t
748
745
} else if d .disallowUnknownFields {
749
746
d .saveError (fmt .Errorf ("json: unknown field %q" , key ))
750
747
}
@@ -785,13 +782,13 @@ func (d *decodeState) object(v reflect.Value) error {
785
782
// Write value back to map;
786
783
// if using struct, subv points into struct already.
787
784
if v .Kind () == reflect .Map {
788
- kt := v . Type () .Key ()
785
+ kt := t .Key ()
789
786
var kv reflect.Value
790
787
switch {
791
788
case kt .Kind () == reflect .String :
792
789
kv = reflect .ValueOf (key ).Convert (kt )
793
790
case reflect .PtrTo (kt ).Implements (textUnmarshalerType ):
794
- kv = reflect .New (v . Type (). Key () )
791
+ kv = reflect .New (kt )
795
792
if err := d .literalStore (item , kv , true ); err != nil {
796
793
return err
797
794
}
0 commit comments