Skip to content

Commit 50f206a

Browse files
committed
1 parent 1901982 commit 50f206a

File tree

5 files changed

+56
-19
lines changed

5 files changed

+56
-19
lines changed

bson/bson.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ type fieldInfo struct {
634634
Inline []int
635635
}
636636

637-
var structMap = make(map[reflect.Type]*structInfo)
637+
var structMap = make(map[typeID]*structInfo)
638638
var structMapMutex sync.RWMutex
639639

640640
type externalPanic string
@@ -645,7 +645,8 @@ func (e externalPanic) String() string {
645645

646646
func getStructInfo(st reflect.Type) (*structInfo, error) {
647647
structMapMutex.RLock()
648-
sinfo, found := structMap[st]
648+
key := rt2id(st)
649+
sinfo, found := structMap[key]
649650
structMapMutex.RUnlock()
650651
if found {
651652
return sinfo, nil
@@ -744,7 +745,7 @@ func getStructInfo(st reflect.Type) (*structInfo, error) {
744745
reflect.New(st).Elem(),
745746
}
746747
structMapMutex.Lock()
747-
structMap[st] = sinfo
748+
structMap[key] = sinfo
748749
structMapMutex.Unlock()
749750
return sinfo, nil
750751
}

bson/decode.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,31 +73,32 @@ const (
7373
setterAddr
7474
)
7575

76-
var setterStyles map[reflect.Type]int
76+
var setterStyles map[typeID]int
7777
var setterIface reflect.Type
7878
var setterMutex sync.RWMutex
7979

8080
func init() {
8181
var iface Setter
8282
setterIface = reflect.TypeOf(&iface).Elem()
83-
setterStyles = make(map[reflect.Type]int)
83+
setterStyles = make(map[typeID]int)
8484
}
8585

8686
func setterStyle(outt reflect.Type) int {
87+
key := rt2id(outt)
8788
setterMutex.RLock()
88-
style := setterStyles[outt]
89+
style := setterStyles[key]
8990
setterMutex.RUnlock()
9091
if style == setterUnknown {
9192
setterMutex.Lock()
9293
defer setterMutex.Unlock()
9394
if outt.Implements(setterIface) {
94-
setterStyles[outt] = setterType
95+
setterStyles[key] = setterType
9596
} else if reflect.PtrTo(outt).Implements(setterIface) {
96-
setterStyles[outt] = setterAddr
97+
setterStyles[key] = setterAddr
9798
} else {
98-
setterStyles[outt] = setterNone
99+
setterStyles[key] = setterNone
99100
}
100-
style = setterStyles[outt]
101+
style = setterStyles[key]
101102
}
102103
return style
103104
}

bson/encode.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ const (
7171

7272
var itoaCache []string
7373

74-
var getterStyles map[reflect.Type]int
74+
var getterStyles map[typeID]int
7575
var getterIface reflect.Type
7676
var getterMutex sync.RWMutex
7777

@@ -82,7 +82,7 @@ func init() {
8282
}
8383
var iface Getter
8484
getterIface = reflect.TypeOf(&iface).Elem()
85-
getterStyles = make(map[reflect.Type]int)
85+
getterStyles = make(map[typeID]int)
8686
}
8787

8888
func itoa(i int) string {
@@ -93,8 +93,9 @@ func itoa(i int) string {
9393
}
9494

9595
func getterStyle(outt reflect.Type) int {
96+
key := rt2id(outt)
9697
getterMutex.RLock()
97-
style := getterStyles[outt]
98+
style := getterStyles[key]
9899
getterMutex.RUnlock()
99100
if style == getterUnknown {
100101
getterMutex.Lock()
@@ -105,16 +106,16 @@ func getterStyle(outt reflect.Type) int {
105106
vt = vt.Elem()
106107
}
107108
if vt.Implements(getterIface) {
108-
getterStyles[outt] = getterTypeVal
109+
getterStyles[key] = getterTypeVal
109110
} else {
110-
getterStyles[outt] = getterTypePtr
111+
getterStyles[key] = getterTypePtr
111112
}
112113
} else if reflect.PtrTo(outt).Implements(getterIface) {
113-
getterStyles[outt] = getterAddr
114+
getterStyles[key] = getterAddr
114115
} else {
115-
getterStyles[outt] = getterNone
116+
getterStyles[key] = getterNone
116117
}
117-
style = getterStyles[outt]
118+
style = getterStyles[key]
118119
}
119120
return style
120121
}
@@ -391,7 +392,7 @@ func (e *encoder) addElem(name string, v reflect.Value, minSize bool) {
391392
// Stored as int64
392393
e.addElemName(0x12, name)
393394

394-
e.addInt64(int64(v.Int()/1e6))
395+
e.addInt64(int64(v.Int() / 1e6))
395396
default:
396397
i := v.Int()
397398
if (minSize || v.Type().Kind() != reflect.Int64) && i >= math.MinInt32 && i <= math.MaxInt32 {

bson/helper_safe.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// +build !go1.7 safe appengine
2+
3+
package bson
4+
5+
import (
6+
"reflect"
7+
)
8+
9+
type typeID uintptr
10+
11+
func rt2id(rt reflect.Type) typeID {
12+
return typeID(reflect.ValueOf(rt).Pointer())
13+
}

bson/helper_unsafe.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// +build !safe
2+
// +build !appengine
3+
// +build go1.7
4+
5+
package bson
6+
7+
import (
8+
"reflect"
9+
"unsafe"
10+
)
11+
12+
type typeID uintptr
13+
14+
type unsafeIntf struct {
15+
typ unsafe.Pointer
16+
word unsafe.Pointer
17+
}
18+
19+
func rt2id(rt reflect.Type) typeID {
20+
return typeID(((*unsafeIntf)(unsafe.Pointer(&rt))).word)
21+
}

0 commit comments

Comments
 (0)