Skip to content

Commit ef6b024

Browse files
Update newValueReader to use bVR
1 parent 5a12f54 commit ef6b024

File tree

8 files changed

+29
-24
lines changed

8 files changed

+29
-24
lines changed

bson/copier.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,10 @@ func copyValueFromBytes(dst ValueWriter, t Type, src []byte) error {
180180
}
181181

182182
vr := newBufferedDocumentReader(src)
183-
vr.pushElement(t)
183+
vr.advanceFrame()
184+
185+
vr.stack[vr.frame].mode = mElement
186+
vr.stack[vr.frame].vType = t
184187

185188
return copyValue(dst, vr)
186189
}

bson/mgoregistry_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ func (t *prefixPtr) SetBSON(raw RawValue) error {
485485
if err != nil {
486486
return err
487487
}
488-
vr := newValueReader(raw.Type, bytes.NewReader(raw.Value))
488+
vr := newBufferedValueReader(raw.Type, raw.Value)
489489
err = decoder.DecodeValue(DecodeContext{Registry: NewMgoRegistry()}, vr, rval)
490490
if err != nil {
491491
return err
@@ -512,7 +512,7 @@ func (t *prefixVal) SetBSON(raw RawValue) error {
512512
if err != nil {
513513
return err
514514
}
515-
vr := newValueReader(raw.Type, bytes.NewReader(raw.Value))
515+
vr := newBufferedValueReader(raw.Type, raw.Value)
516516
err = decoder.DecodeValue(DecodeContext{Registry: NewMgoRegistry()}, vr, rval)
517517
if err != nil {
518518
return err
@@ -936,7 +936,7 @@ func (o *setterType) SetBSON(raw RawValue) error {
936936
if raw.Type == 0x00 {
937937
raw.Type = TypeEmbeddedDocument
938938
}
939-
vr := newValueReader(raw.Type, bytes.NewReader(raw.Value))
939+
vr := newBufferedValueReader(raw.Type, raw.Value)
940940
err = decoder.DecodeValue(DecodeContext{Registry: NewMgoRegistry()}, vr, rval)
941941
if err != nil {
942942
return err
@@ -1289,7 +1289,7 @@ func (s *getterSetterD) SetBSON(raw RawValue) error {
12891289
if raw.Type == 0x00 {
12901290
raw.Type = TypeEmbeddedDocument
12911291
}
1292-
vr := newValueReader(raw.Type, bytes.NewReader(raw.Value))
1292+
vr := newBufferedValueReader(raw.Type, raw.Value)
12931293
err = decoder.DecodeValue(DecodeContext{Registry: NewMgoRegistry()}, vr, rval)
12941294
if err != nil {
12951295
return err
@@ -1315,7 +1315,7 @@ func (i *getterSetterInt) SetBSON(raw RawValue) error {
13151315
if raw.Type == 0x00 {
13161316
raw.Type = TypeEmbeddedDocument
13171317
}
1318-
vr := newValueReader(raw.Type, bytes.NewReader(raw.Value))
1318+
vr := newBufferedValueReader(raw.Type, raw.Value)
13191319
err = decoder.DecodeValue(DecodeContext{Registry: NewMgoRegistry()}, vr, rval)
13201320
if err != nil {
13211321
return err
@@ -1337,7 +1337,7 @@ func (s *ifaceSlice) SetBSON(raw RawValue) error {
13371337
if err != nil {
13381338
return err
13391339
}
1340-
vr := newValueReader(raw.Type, bytes.NewReader(raw.Value))
1340+
vr := newBufferedValueReader(raw.Type, raw.Value)
13411341
err = decoder.DecodeValue(DecodeContext{Registry: NewMgoRegistry()}, vr, rval)
13421342
if err != nil {
13431343
return err

bson/raw_value.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func (rv RawValue) UnmarshalWithRegistry(r *Registry, val interface{}) error {
7171
return ErrNilRegistry
7272
}
7373

74-
vr := newValueReader(rv.Type, bytes.NewReader(rv.Value))
74+
vr := newBufferedValueReader(rv.Type, rv.Value)
7575
rval := reflect.ValueOf(val)
7676
if rval.Kind() != reflect.Ptr {
7777
return fmt.Errorf("argument to Unmarshal* must be a pointer to a type, but got %v", rval)
@@ -91,7 +91,7 @@ func (rv RawValue) UnmarshalWithContext(dc *DecodeContext, val interface{}) erro
9191
return ErrNilContext
9292
}
9393

94-
vr := newValueReader(rv.Type, bytes.NewReader(rv.Value))
94+
vr := newBufferedValueReader(rv.Type, rv.Value)
9595
rval := reflect.ValueOf(val)
9696
if rval.Kind() != reflect.Ptr {
9797
return fmt.Errorf("argument to Unmarshal* must be a pointer to a type, but got %v", rval)

bson/unmarshal.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ type ValueUnmarshaler interface {
4242
// When unmarshaling BSON, if the BSON value is null and the Go value is a
4343
// pointer, the pointer is set to nil without calling UnmarshalBSONValue.
4444
func Unmarshal(data []byte, val interface{}) error {
45-
vr := getBufferedDocumentReader(bytes.NewReader(data))
46-
defer putDocumentReader(vr)
45+
vr := getBufferedDocumentReader(data)
46+
defer putBufferedDocumentReader(vr)
4747

4848
if l, err := vr.peekLength(); err != nil {
4949
return err
@@ -57,7 +57,7 @@ func Unmarshal(data []byte, val interface{}) error {
5757
// stores the result in the value pointed to by val. If val is nil or not a pointer,
5858
// UnmarshalValue returns an error.
5959
func UnmarshalValue(t Type, data []byte, val interface{}) error {
60-
vr := newValueReader(t, bytes.NewReader(data))
60+
vr := newBufferedValueReader(t, data)
6161
return unmarshalFromReader(DecodeContext{Registry: defaultRegistry}, vr, val)
6262
}
6363

bson/unmarshal_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func TestUnmarshalWithRegistry(t *testing.T) {
7171

7272
// Assert that unmarshaling the input data results in the expected value.
7373
gotValue := reflect.New(reflect.TypeOf(tc.val))
74-
dec := NewDecoder(newValueReader(tc.bsontype, bytes.NewReader(tc.bytes)))
74+
dec := NewDecoder(newBufferedValueReader(tc.bsontype, tc.bytes))
7575
dec.SetRegistry(reg)
7676
err := dec.Decode(gotValue.Interface())
7777
noerr(t, err)

bson/unmarshal_value_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package bson
88

99
import (
10-
"bytes"
1110
"reflect"
1211
"strings"
1312
"testing"
@@ -80,7 +79,7 @@ func BenchmarkSliceCodecUnmarshal(b *testing.B) {
8079
dec := NewDecoder(nil)
8180
dec.SetRegistry(reg)
8281
for pb.Next() {
83-
dec.Reset(newValueReader(bm.bsontype, bytes.NewReader(bm.bytes)))
82+
dec.Reset(newBufferedValueReader(bm.bsontype, bm.bytes))
8483
err := dec.Decode(&[]byte{})
8584
if err != nil {
8685
b.Fatal(err)

bson/unmarshaling_cases_test.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package bson
88

99
import (
10-
"bytes"
1110
"reflect"
1211
)
1312

@@ -269,7 +268,7 @@ func (mi *myInt64) UnmarshalBSONValue(t byte, b []byte) error {
269268
}
270269

271270
if Type(t) == TypeInt64 {
272-
i, err := newValueReader(TypeInt64, bytes.NewReader(b)).ReadInt64()
271+
i, err := newBufferedValueReader(TypeInt64, b).ReadInt64()
273272
if err != nil {
274273
return err
275274
}
@@ -284,7 +283,7 @@ func (mi *myInt64) UnmarshalBSON(b []byte) error {
284283
if len(b) == 0 {
285284
return nil
286285
}
287-
i, err := newValueReader(TypeInt64, bytes.NewReader(b)).ReadInt64()
286+
i, err := newBufferedValueReader(TypeInt64, b).ReadInt64()
288287
if err != nil {
289288
return err
290289
}
@@ -310,7 +309,7 @@ func (mb *myBytes) UnmarshalBSON(b []byte) error {
310309
if len(b) == 0 {
311310
return nil
312311
}
313-
b, _, err := newValueReader(TypeBinary, bytes.NewReader(b)).ReadBinary()
312+
b, _, err := newBufferedValueReader(TypeBinary, b).ReadBinary()
314313
if err != nil {
315314
return err
316315
}
@@ -324,7 +323,7 @@ func (ms *myString) UnmarshalBSON(b []byte) error {
324323
if len(b) == 0 {
325324
return nil
326325
}
327-
s, err := newValueReader(TypeString, bytes.NewReader(b)).ReadString()
326+
s, err := newBufferedValueReader(TypeString, b).ReadString()
328327
if err != nil {
329328
return err
330329
}

bson/value_reader.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,14 @@ func NewDocumentReader(r io.Reader) ValueReader {
117117
}
118118
}
119119

120-
// newValueReader returns a ValueReader that starts in the Value mode instead of in top
121-
// level document mode. This enables the creation of a ValueReader for a single BSON value.
122-
func newValueReader(t Type, r io.Reader) ValueReader {
123-
panic("TODO")
120+
// newBufferedValueReader returns a ValueReader that starts in the Value mode
121+
// instead of in top level document mode. This enables the creation of a
122+
// ValueReader for a single BSON value.
123+
func newBufferedValueReader(t Type, b []byte) ValueReader {
124+
bVR := newBufferedDocumentReader(b)
125+
bVR.stack[0].vType = t
126+
127+
return bVR
124128
}
125129

126130
func newBufferedDocumentReader(b []byte) *valueReader {

0 commit comments

Comments
 (0)