Skip to content

Commit c65de30

Browse files
committed
WIP: unstage me
1 parent 7ee2919 commit c65de30

File tree

4 files changed

+65
-10
lines changed

4 files changed

+65
-10
lines changed

bson/bsoncodec/codec_cache.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,10 @@ func (c *kindEncoderCache) Store(rt reflect.Kind, enc ValueEncoder) {
102102

103103
func (c *kindEncoderCache) Load(rt reflect.Kind) (ValueEncoder, bool) {
104104
if rt < reflect.Kind(len(c.entries)) {
105-
if ent, ok := c.entries[rt].Load().(*kindEncoderCacheEntry); ok {
106-
return ent.enc, ent.enc != nil
105+
// if ent, ok := c.entries[rt].Load().(*kindEncoderCacheEntry); ok {
106+
if v := c.entries[rt].Load(); v != nil {
107+
return v.(*kindEncoderCacheEntry).enc, true
108+
// return ent.enc, ent.enc != nil
107109
}
108110
}
109111
return nil, false

bson/bsoncodec/codec_cache_test.go

+54
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"reflect"
1111
"strconv"
1212
"strings"
13+
"sync"
1314
"testing"
1415
)
1516

@@ -90,6 +91,21 @@ func TestKindCacheArray(t *testing.T) {
9091
if v, ok := c.Load(reflect.UnsafePointer + 1); ok || v != nil {
9192
t.Errorf("Load(reflect.UnsafePointer + 1) = %v, %t; want: %v, %t", v, ok, nil, false)
9293
}
94+
encoders := new([reflect.UnsafePointer + 1]ValueEncoder)
95+
for i := range encoders {
96+
encoders[i] = new(fakeCodec)
97+
c.Store(reflect.Kind(i), encoders[i])
98+
}
99+
for i := range encoders {
100+
rt := reflect.Kind(i)
101+
got, ok := c.Load(rt)
102+
if !ok {
103+
t.Error("missing encoder for:", rt)
104+
}
105+
if !reflect.DeepEqual(got, encoders[rt]) {
106+
t.Errorf("Load(%q) = %#v; want: %#v", rt, got, encoders[rt])
107+
}
108+
}
93109

94110
// Make sure that reflect.UnsafePointer is the last/largest reflect.Type.
95111
//
@@ -172,3 +188,41 @@ func BenchmarkEncoderCacheStore(b *testing.B) {
172188
}
173189
})
174190
}
191+
192+
func BenchmarkKindEncoderCacheLoad(b *testing.B) {
193+
m := new(sync.Map)
194+
x := make(map[reflect.Kind]ValueEncoder)
195+
c := new(kindEncoderCache)
196+
for k := reflect.Kind(0); k <= reflect.UnsafePointer; k++ {
197+
c.Store(k, fakeCodec{})
198+
m.Store(k, fakeCodec{})
199+
x[k] = fakeCodec{}
200+
}
201+
b.Run("Array", func(b *testing.B) {
202+
for i := 0; i < b.N; i++ {
203+
kind := reflect.Kind(i) % (reflect.UnsafePointer + 1)
204+
_, ok := c.Load(kind)
205+
if !ok {
206+
b.Fatal("missing:", kind)
207+
}
208+
}
209+
})
210+
b.Run("SyncMap", func(b *testing.B) {
211+
for i := 0; i < b.N; i++ {
212+
kind := reflect.Kind(i) % (reflect.UnsafePointer + 1)
213+
_, ok := m.Load(kind)
214+
if !ok {
215+
b.Fatal("missing:", kind)
216+
}
217+
}
218+
})
219+
b.Run("Map", func(b *testing.B) {
220+
for i := 0; i < b.N; i++ {
221+
kind := reflect.Kind(i) % (reflect.UnsafePointer + 1)
222+
_, ok := x[kind]
223+
if !ok {
224+
b.Fatal("wat")
225+
}
226+
}
227+
})
228+
}

bson/bsoncodec/registry.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,10 @@ func (r *Registry) RegisterTypeMapEntry(bt bsontype.Type, rt reflect.Type) {
388388
// If no encoder is found, an error of type ErrNoEncoder is returned. LookupEncoder is safe for
389389
// concurrent use by multiple goroutines after all codecs and encoders are registered.
390390
func (r *Registry) LookupEncoder(valueType reflect.Type) (ValueEncoder, error) {
391+
if valueType == nil {
392+
return nil, ErrNoEncoder{Type: valueType}
393+
}
394+
391395
enc, found := r.lookupTypeEncoder(valueType)
392396
if found {
393397
if enc == nil {
@@ -396,14 +400,9 @@ func (r *Registry) LookupEncoder(valueType reflect.Type) (ValueEncoder, error) {
396400
return enc, nil
397401
}
398402

399-
enc, found = r.lookupInterfaceEncoder(valueType, true)
400-
if found {
403+
if enc, found := r.lookupInterfaceEncoder(valueType, true); found {
401404
return r.typeEncoders.LoadOrStore(valueType, enc), nil
402405
}
403-
if valueType == nil {
404-
r.storeTypeEncoder(valueType, nil)
405-
return nil, ErrNoEncoder{Type: valueType}
406-
}
407406

408407
if v, ok := r.kindEncoders.Load(valueType.Kind()); ok {
409408
return r.storeTypeEncoder(valueType, v), nil

bson/bsoncodec/registry_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -922,10 +922,10 @@ type fakeCodec struct {
922922
num int
923923
}
924924

925-
func (*fakeCodec) EncodeValue(EncodeContext, bsonrw.ValueWriter, reflect.Value) error {
925+
func (fakeCodec) EncodeValue(EncodeContext, bsonrw.ValueWriter, reflect.Value) error {
926926
return nil
927927
}
928-
func (*fakeCodec) DecodeValue(DecodeContext, bsonrw.ValueReader, reflect.Value) error {
928+
func (fakeCodec) DecodeValue(DecodeContext, bsonrw.ValueReader, reflect.Value) error {
929929
return nil
930930
}
931931

0 commit comments

Comments
 (0)