Skip to content

Commit 75e2ec3

Browse files
committed
Merge branch 'pr/56'
GODRIVER-427 Change-Id: I00803813275c717a7ecc4ff65bcfe398a55daa74
2 parents 30e20cc + 2670ef6 commit 75e2ec3

File tree

2 files changed

+1632
-180
lines changed

2 files changed

+1632
-180
lines changed

bson/decode.go

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ func (r *peekLengthReader) Read(b []byte) (int, error) {
123123
return int(bytesToRead), nil
124124
}
125125

126+
func convertToPtr(val reflect.Value) reflect.Value {
127+
valPtr := reflect.New(val.Type())
128+
valPtr.Elem().Set(val)
129+
return valPtr
130+
}
131+
126132
// NewDecoder constructs a new default Decoder implementation from the given io.Reader.
127133
//
128134
// In this implementation, the value can be any one of the following types:
@@ -305,6 +311,8 @@ func (d *decoder) createEmptyValue(r Reader, t reflect.Type) (reflect.Value, err
305311
func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer reflect.Type) (reflect.Value, error) {
306312
var val reflect.Value
307313

314+
isPtr := (containerType.Kind() == reflect.Ptr)
315+
308316
for containerType.Kind() == reflect.Ptr {
309317
containerType = containerType.Elem()
310318
}
@@ -381,6 +389,13 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
381389
switch containerType {
382390
case tString, tEmpty:
383391
val = reflect.ValueOf(str)
392+
case tJSONNumber:
393+
_, err := strconv.ParseFloat(str, 64)
394+
if err != nil {
395+
return val, err
396+
}
397+
val = reflect.ValueOf(str).Convert(tJSONNumber)
398+
384399
case tURL:
385400
u, err := url.Parse(str)
386401
if err != nil {
@@ -398,7 +413,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
398413
return val, err
399414
}
400415

401-
val = newVal
416+
if isPtr {
417+
val = convertToPtr(newVal)
418+
isPtr = false
419+
} else {
420+
val = newVal
421+
}
402422

403423
break
404424
}
@@ -410,7 +430,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
410430
return val, err
411431
}
412432

413-
val = newVal
433+
if isPtr {
434+
val = convertToPtr(newVal)
435+
isPtr = false
436+
} else {
437+
val = newVal
438+
}
414439

415440
break
416441
}
@@ -422,7 +447,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
422447
return val, err
423448
}
424449

425-
val = newVal
450+
if isPtr {
451+
val = convertToPtr(newVal)
452+
isPtr = false
453+
} else {
454+
val = newVal
455+
}
426456

427457
break
428458
}
@@ -450,6 +480,10 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
450480

451481
if reflect.PtrTo(typeToCreate) == empty.Type() {
452482
empty = empty.Elem()
483+
if isPtr {
484+
empty = convertToPtr(empty)
485+
isPtr = false
486+
}
453487
}
454488

455489
val = empty
@@ -492,6 +526,7 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
492526
} else {
493527
val = reflect.ValueOf(v.DateTime())
494528
}
529+
495530
case 0xA:
496531
if containerType != tEmpty {
497532
return val, nil
@@ -573,7 +608,6 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
573608
}
574609

575610
val = reflect.ValueOf(uint(i))
576-
577611
case tEmpty, tInt32, tInt64, tInt, tFloat32, tFloat64:
578612
val = reflect.ValueOf(i).Convert(containerType)
579613
case tJSONNumber:
@@ -666,6 +700,9 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
666700
return val, fmt.Errorf("invalid BSON type: %s", v.Type())
667701
}
668702

703+
if isPtr && val.IsValid() && !val.CanAddr() {
704+
val = convertToPtr(val)
705+
}
669706
return val, nil
670707
}
671708

@@ -736,7 +773,11 @@ func (d *decoder) decodeBSONArrayToSlice(sliceType reflect.Type) (reflect.Value,
736773
}
737774

738775
if sliceType.Elem().Kind() == reflect.Ptr {
739-
elem = elem.Addr()
776+
if elem.CanAddr() {
777+
elem = elem.Addr()
778+
} else {
779+
elem = elem.Elem().Addr()
780+
}
740781
}
741782
out.Index(i).Set(elem)
742783
}
@@ -872,7 +913,11 @@ func (d *decoder) decodeIntoStruct(structVal reflect.Value) error {
872913

873914
if v != zeroVal {
874915
if field.Type().Kind() == reflect.Ptr {
875-
v = v.Addr()
916+
if v.CanAddr() {
917+
v = v.Addr()
918+
} else {
919+
v = v.Elem().Addr()
920+
}
876921
}
877922

878923
field.Set(v)

0 commit comments

Comments
 (0)