@@ -306,6 +306,8 @@ func (d *decoder) createEmptyValue(r Reader, t reflect.Type) (reflect.Value, err
306
306
func (d * decoder ) getReflectValue (v * Value , containerType reflect.Type , outer reflect.Type ) (reflect.Value , error ) {
307
307
var val reflect.Value
308
308
309
+ isPtr := (containerType .Kind () == reflect .Ptr )
310
+
309
311
for containerType .Kind () == reflect .Ptr {
310
312
containerType = containerType .Elem ()
311
313
}
@@ -375,6 +377,7 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
375
377
val = reflect .ValueOf (f )
376
378
case tJSONNumber :
377
379
val = reflect .ValueOf (strconv .FormatFloat (f , 'f' , - 1 , 64 )).Convert (tJSONNumber )
380
+
378
381
default :
379
382
return val , nil
380
383
}
@@ -384,6 +387,13 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
384
387
switch containerType {
385
388
case tString , tEmpty :
386
389
val = reflect .ValueOf (str )
390
+ case tJSONNumber :
391
+ _ , err := strconv .ParseFloat (str , 64 )
392
+ if err != nil {
393
+ return val , err
394
+ }
395
+ val = reflect .ValueOf (str ).Convert (tJSONNumber )
396
+
387
397
case tURL :
388
398
u , err := url .Parse (str )
389
399
if err != nil {
@@ -394,14 +404,24 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
394
404
return val , nil
395
405
}
396
406
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
+
397
416
if containerType == tEmpty {
398
417
d := newDecoder (bytes .NewBuffer (v .ReaderArray ()))
399
418
newVal , err := d .decodeBSONArrayToSlice (tEmptySlice )
400
419
if err != nil {
401
420
return val , err
402
421
}
403
422
404
- val = newVal
423
+ val = postProcess (isPtr , newVal )
424
+ isPtr = false
405
425
406
426
break
407
427
}
@@ -413,7 +433,8 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
413
433
return val , err
414
434
}
415
435
416
- val = newVal
436
+ val = postProcess (isPtr , newVal )
437
+ isPtr = false
417
438
418
439
break
419
440
}
@@ -425,7 +446,8 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
425
446
return val , err
426
447
}
427
448
428
- val = newVal
449
+ val = postProcess (isPtr , newVal )
450
+ isPtr = false
429
451
430
452
break
431
453
}
@@ -453,6 +475,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
453
475
454
476
if reflect .PtrTo (typeToCreate ) == empty .Type () {
455
477
empty = empty .Elem ()
478
+ if isPtr {
479
+ valPtr := reflect .New (empty .Type ())
480
+ valPtr .Elem ().Set (empty )
481
+ empty = valPtr
482
+ isPtr = false
483
+ }
456
484
}
457
485
458
486
val = empty
@@ -495,6 +523,7 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
495
523
} else {
496
524
val = reflect .ValueOf (v .DateTime ())
497
525
}
526
+
498
527
case 0xA :
499
528
if containerType != tEmpty {
500
529
return val , nil
@@ -576,7 +605,6 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
576
605
}
577
606
578
607
val = reflect .ValueOf (uint (i ))
579
-
580
608
case tEmpty , tInt32 , tInt64 , tInt , tFloat32 , tFloat64 :
581
609
val = reflect .ValueOf (i ).Convert (containerType )
582
610
case tJSONNumber :
@@ -669,6 +697,11 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
669
697
return val , fmt .Errorf ("invalid BSON type: %s" , v .Type ())
670
698
}
671
699
700
+ if isPtr && val .IsValid () && ! val .CanAddr () {
701
+ valPtr := reflect .New (val .Type ())
702
+ valPtr .Elem ().Set (val )
703
+ val = valPtr
704
+ }
672
705
return val , nil
673
706
}
674
707
@@ -739,7 +772,11 @@ func (d *decoder) decodeBSONArrayToSlice(sliceType reflect.Type) (reflect.Value,
739
772
}
740
773
741
774
if sliceType .Elem ().Kind () == reflect .Ptr {
742
- elem = elem .Addr ()
775
+ if elem .CanAddr () {
776
+ elem = elem .Addr ()
777
+ } else {
778
+ elem = elem .Elem ().Addr ()
779
+ }
743
780
}
744
781
out .Index (i ).Set (elem )
745
782
}
@@ -875,7 +912,11 @@ func (d *decoder) decodeIntoStruct(structVal reflect.Value) error {
875
912
876
913
if v != zeroVal {
877
914
if field .Type ().Kind () == reflect .Ptr {
878
- v = v .Addr ()
915
+ if v .CanAddr () {
916
+ v = v .Addr ()
917
+ } else {
918
+ v = v .Elem ().Addr ()
919
+ }
879
920
}
880
921
881
922
field .Set (v )
0 commit comments