소스 검색

fix nil attachment on stream in custom encoder on sorted map

Ivan Romanov 6 년 전
부모
커밋
aba8654400
3개의 변경된 파일35개의 추가작업 그리고 0개의 파일을 삭제
  1. 33 0
      extension_tests/decoder_test.go
  2. 1 0
      reflect_map.go
  3. 1 0
      reflect_struct_encoder.go

+ 33 - 0
extension_tests/decoder_test.go

@@ -2,6 +2,7 @@ package test
 
 import (
 	"bytes"
+	"fmt"
 	"github.com/json-iterator/go"
 	"github.com/stretchr/testify/require"
 	"strconv"
@@ -47,6 +48,38 @@ func Test_customize_byte_array_encoder(t *testing.T) {
 	should.Equal(`"abc"`, str)
 }
 
+type CustomEncoderAttachmentTestStruct struct {
+	Value int32 `json:"value"`
+}
+
+type CustomEncoderAttachmentTestStructEncoder struct {}
+
+func (c *CustomEncoderAttachmentTestStructEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {
+	attachVal, ok := stream.Attachment.(int)
+	stream.WriteRaw(`"`)
+	stream.WriteRaw(fmt.Sprintf("%t %d", ok, attachVal))
+	stream.WriteRaw(`"`)
+}
+
+func (c *CustomEncoderAttachmentTestStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {
+	return false
+}
+
+func Test_custom_encoder_attachment(t *testing.T) {
+
+	jsoniter.RegisterTypeEncoder("test.CustomEncoderAttachmentTestStruct", &CustomEncoderAttachmentTestStructEncoder{})
+	expectedValue := 17
+	should := require.New(t)
+	buf := &bytes.Buffer{}
+	stream := jsoniter.NewStream(jsoniter.Config{SortMapKeys: true}.Froze(), buf, 4096)
+	stream.Attachment = expectedValue
+	val := map[string]CustomEncoderAttachmentTestStruct{"a": {}}
+	stream.WriteVal(val)
+	stream.Flush()
+	should.Nil(stream.Error)
+	should.Equal("{\"a\":\"true 17\"}", buf.String())
+}
+
 func Test_customize_field_decoder(t *testing.T) {
 	type Tom struct {
 		field1 string

+ 1 - 0
reflect_map.go

@@ -290,6 +290,7 @@ func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
 	stream.WriteObjectStart()
 	mapIter := encoder.mapType.UnsafeIterate(ptr)
 	subStream := stream.cfg.BorrowStream(nil)
+	subStream.Attachment = stream.Attachment
 	subIter := stream.cfg.BorrowIterator(nil)
 	keyValues := encodedKeyValues{}
 	for mapIter.HasNext() {

+ 1 - 0
reflect_struct_encoder.go

@@ -200,6 +200,7 @@ type stringModeStringEncoder struct {
 
 func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
 	tempStream := encoder.cfg.BorrowStream(nil)
+	tempStream.Attachment = stream.Attachment
 	defer encoder.cfg.ReturnStream(tempStream)
 	encoder.elemEncoder.Encode(ptr, tempStream)
 	stream.WriteString(string(tempStream.Buffer()))