Skip to content

Commit d394a13

Browse files
committed
#197 fix place holder encoder to use EncodeInterface, WriteToStream is unsafe when the real encoder is unknown
1 parent 9fddff0 commit d394a13

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

feature_reflect.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
164164
}
165165

166166
func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) {
167-
WriteToStream(val, stream, encoder)
167+
encoder.getRealEncoder().EncodeInterface(val, stream)
168168
}
169169

170170
func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool {

jsoniter_interface_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,23 @@ import (
77
"unsafe"
88

99
"github.com/stretchr/testify/require"
10+
"reflect"
1011
)
1112

13+
func Test_write_empty_interface_via_placeholder(t *testing.T) {
14+
should := require.New(t)
15+
m := map[uint32]interface{}{1:"hello"}
16+
inf := reflect.ValueOf(m).MapIndex(reflect.ValueOf(uint32(1))).Interface()
17+
encoder := &placeholderEncoder{
18+
cfg: ConfigFastest.(*frozenConfig),
19+
cacheKey: reflect.TypeOf(m).Elem(),
20+
}
21+
stream := ConfigFastest.BorrowStream(nil)
22+
encoderOfType(ConfigFastest.(*frozenConfig), reflect.TypeOf(m).Elem())
23+
encoder.EncodeInterface(inf, stream)
24+
should.Equal(`"hello"`, string(stream.Buffer()))
25+
}
26+
1227
func Test_write_array_of_interface(t *testing.T) {
1328
should := require.New(t)
1429
array := []interface{}{"hello"}

0 commit comments

Comments
 (0)