@@ -123,6 +123,12 @@ func (r *peekLengthReader) Read(b []byte) (int, error) {
123
123
return int (bytesToRead ), nil
124
124
}
125
125
126
+ func convertToPtr (val reflect.Value ) reflect.Value {
127
+ valPtr := reflect .New (val .Type ())
128
+ valPtr .Elem ().Set (val )
129
+ return valPtr
130
+ }
131
+
126
132
// NewDecoder constructs a new default Decoder implementation from the given io.Reader.
127
133
//
128
134
// In this implementation, the value can be any one of the following types:
@@ -377,7 +383,6 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
377
383
val = reflect .ValueOf (f )
378
384
case tJSONNumber :
379
385
val = reflect .ValueOf (strconv .FormatFloat (f , 'f' , - 1 , 64 )).Convert (tJSONNumber )
380
-
381
386
default :
382
387
return val , nil
383
388
}
@@ -404,24 +409,19 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
404
409
return val , nil
405
410
}
406
411
case 0x4 :
407
- postProcess := func (isPtr bool , valueToProcess reflect.Value ) reflect.Value {
408
- if ! isPtr {
409
- return valueToProcess
410
- }
411
- valPtr := reflect .New (valueToProcess .Type ())
412
- valPtr .Elem ().Set (valueToProcess )
413
- return valPtr
414
- }
415
-
416
412
if containerType == tEmpty {
417
413
d := newDecoder (bytes .NewBuffer (v .ReaderArray ()))
418
414
newVal , err := d .decodeBSONArrayToSlice (tEmptySlice )
419
415
if err != nil {
420
416
return val , err
421
417
}
422
418
423
- val = postProcess (isPtr , newVal )
424
- isPtr = false
419
+ if isPtr {
420
+ val = convertToPtr (newVal )
421
+ isPtr = false
422
+ } else {
423
+ val = newVal
424
+ }
425
425
426
426
break
427
427
}
@@ -433,8 +433,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
433
433
return val , err
434
434
}
435
435
436
- val = postProcess (isPtr , newVal )
437
- isPtr = false
436
+ if isPtr {
437
+ val = convertToPtr (newVal )
438
+ isPtr = false
439
+ } else {
440
+ val = newVal
441
+ }
438
442
439
443
break
440
444
}
@@ -446,8 +450,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
446
450
return val , err
447
451
}
448
452
449
- val = postProcess (isPtr , newVal )
450
- isPtr = false
453
+ if isPtr {
454
+ val = convertToPtr (newVal )
455
+ isPtr = false
456
+ } else {
457
+ val = newVal
458
+ }
451
459
452
460
break
453
461
}
@@ -698,9 +706,7 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
698
706
}
699
707
700
708
if isPtr && val .IsValid () && ! val .CanAddr () {
701
- valPtr := reflect .New (val .Type ())
702
- valPtr .Elem ().Set (val )
703
- val = valPtr
709
+ val = convertToPtr (val )
704
710
}
705
711
return val , nil
706
712
}
0 commit comments