Skip to content
This repository was archived by the owner on Dec 15, 2025. It is now read-only.

Commit b1b0038

Browse files
committed
expose OptionalEncoder&OptionalDecoder; add attachment to Stream&Iterator for customized decoder/encoder
1 parent aed5a81 commit b1b0038

File tree

8 files changed

+38
-34
lines changed

8 files changed

+38
-34
lines changed

feature_any.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package jsoniter
22

33
import (
4+
"errors"
45
"fmt"
56
"io"
67
"reflect"
7-
"errors"
88
)
99

1010
// Any generic object representation.

feature_iter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ type Iterator struct {
7777
captureStartedAt int
7878
captured []byte
7979
Error error
80+
Attachment interface{} // open for customized decoder
8081
}
8182

8283
// NewIterator creates an empty Iterator instance

feature_pool.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream {
2828

2929
func (cfg *frozenConfig) ReturnStream(stream *Stream) {
3030
stream.Error = nil
31+
stream.Attachment = nil
3132
select {
3233
case cfg.streamPool <- stream:
3334
return
@@ -48,6 +49,7 @@ func (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator {
4849

4950
func (cfg *frozenConfig) ReturnIterator(iter *Iterator) {
5051
iter.Error = nil
52+
iter.Attachment = nil
5153
select {
5254
case cfg.iteratorPool <- iter:
5355
return

feature_reflect.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -72,24 +72,24 @@ func init() {
7272
textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
7373
}
7474

75-
type optionalDecoder struct {
76-
valueType reflect.Type
77-
valueDecoder ValDecoder
75+
type OptionalDecoder struct {
76+
ValueType reflect.Type
77+
ValueDecoder ValDecoder
7878
}
7979

80-
func (decoder *optionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
80+
func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
8181
if iter.ReadNil() {
8282
*((*unsafe.Pointer)(ptr)) = nil
8383
} else {
8484
if *((*unsafe.Pointer)(ptr)) == nil {
8585
//pointer to null, we have to allocate memory to hold the value
86-
value := reflect.New(decoder.valueType)
86+
value := reflect.New(decoder.ValueType)
8787
newPtr := extractInterface(value.Interface()).word
88-
decoder.valueDecoder.Decode(newPtr, iter)
88+
decoder.ValueDecoder.Decode(newPtr, iter)
8989
*((*uintptr)(ptr)) = uintptr(newPtr)
9090
} else {
9191
//reuse existing instance
92-
decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
92+
decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
9393
}
9494
}
9595
}
@@ -113,23 +113,23 @@ func (decoder *deferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
113113
}
114114
}
115115

116-
type optionalEncoder struct {
117-
valueEncoder ValEncoder
116+
type OptionalEncoder struct {
117+
ValueEncoder ValEncoder
118118
}
119119

120-
func (encoder *optionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
120+
func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
121121
if *((*unsafe.Pointer)(ptr)) == nil {
122122
stream.WriteNil()
123123
} else {
124-
encoder.valueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
124+
encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
125125
}
126126
}
127127

128-
func (encoder *optionalEncoder) EncodeInterface(val interface{}, stream *Stream) {
128+
func (encoder *OptionalEncoder) EncodeInterface(val interface{}, stream *Stream) {
129129
WriteToStream(val, stream, encoder)
130130
}
131131

132-
func (encoder *optionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {
132+
func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {
133133
return *((*unsafe.Pointer)(ptr)) == nil
134134
}
135135

@@ -307,7 +307,7 @@ func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error
307307
templateInterface := reflect.New(typ).Elem().Interface()
308308
var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
309309
if typ.Kind() == reflect.Ptr {
310-
decoder = &optionalDecoder{typ.Elem(), decoder}
310+
decoder = &OptionalDecoder{typ.Elem(), decoder}
311311
}
312312
return decoder, nil
313313
}
@@ -320,7 +320,7 @@ func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error
320320
templateInterface := reflect.New(typ).Elem().Interface()
321321
var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
322322
if typ.Kind() == reflect.Ptr {
323-
decoder = &optionalDecoder{typ.Elem(), decoder}
323+
decoder = &OptionalDecoder{typ.Elem(), decoder}
324324
}
325325
return decoder, nil
326326
}
@@ -480,7 +480,7 @@ func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error
480480
checkIsEmpty: checkIsEmpty,
481481
}
482482
if typ.Kind() == reflect.Ptr {
483-
encoder = &optionalEncoder{encoder}
483+
encoder = &OptionalEncoder{encoder}
484484
}
485485
return encoder, nil
486486
}
@@ -507,7 +507,7 @@ func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error
507507
checkIsEmpty: checkIsEmpty,
508508
}
509509
if typ.Kind() == reflect.Ptr {
510-
encoder = &optionalEncoder{encoder}
510+
encoder = &OptionalEncoder{encoder}
511511
}
512512
return encoder, nil
513513
}
@@ -567,7 +567,7 @@ func createCheckIsEmpty(typ reflect.Type) (checkIsEmpty, error) {
567567
case reflect.Map:
568568
return &mapEncoder{}, nil
569569
case reflect.Ptr:
570-
return &optionalEncoder{}, nil
570+
return &OptionalEncoder{}, nil
571571
default:
572572
return nil, fmt.Errorf("unsupported type: %v", typ)
573573
}
@@ -678,7 +678,7 @@ func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error)
678678
if err != nil {
679679
return nil, err
680680
}
681-
return &optionalDecoder{elemType, decoder}, nil
681+
return &OptionalDecoder{elemType, decoder}, nil
682682
}
683683

684684
func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
@@ -687,9 +687,9 @@ func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error)
687687
if err != nil {
688688
return nil, err
689689
}
690-
encoder := &optionalEncoder{elemEncoder}
690+
encoder := &OptionalEncoder{elemEncoder}
691691
if elemType.Kind() == reflect.Map {
692-
encoder = &optionalEncoder{encoder}
692+
encoder = &OptionalEncoder{encoder}
693693
}
694694
return encoder, nil
695695
}

feature_reflect_array.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func encoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
2121
return nil, err
2222
}
2323
if typ.Elem().Kind() == reflect.Map {
24-
encoder = &optionalEncoder{encoder}
24+
encoder = &OptionalEncoder{encoder}
2525
}
2626
return &arrayEncoder{typ, typ.Elem(), encoder}, nil
2727
}

feature_reflect_extension.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
185185
if typ.Kind() == reflect.Ptr {
186186
decoder := typeDecoders[typ.Elem().String()]
187187
if decoder != nil {
188-
return &optionalDecoder{typ.Elem(), decoder}
188+
return &OptionalDecoder{typ.Elem(), decoder}
189189
}
190190
}
191191
return nil
@@ -216,7 +216,7 @@ func _getTypeEncoderFromExtension(typ reflect.Type) ValEncoder {
216216
if typ.Kind() == reflect.Ptr {
217217
encoder := typeEncoders[typ.Elem().String()]
218218
if encoder != nil {
219-
return &optionalEncoder{encoder}
219+
return &OptionalEncoder{encoder}
220220
}
221221
}
222222
return nil
@@ -254,7 +254,7 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err
254254
for _, binding := range structDescriptor.Fields {
255255
binding.levels = append([]int{i}, binding.levels...)
256256
omitempty := binding.Encoder.(*structFieldEncoder).omitempty
257-
binding.Encoder = &optionalEncoder{binding.Encoder}
257+
binding.Encoder = &OptionalEncoder{binding.Encoder}
258258
binding.Encoder = &structFieldEncoder{&field, binding.Encoder, omitempty}
259259
binding.Decoder = &deferenceDecoder{field.Type.Elem(), binding.Decoder}
260260
binding.Decoder = &structFieldDecoder{&field, binding.Decoder}

feature_reflect_slice.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func encoderOfSlice(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
2121
return nil, err
2222
}
2323
if typ.Elem().Kind() == reflect.Map {
24-
encoder = &optionalEncoder{encoder}
24+
encoder = &OptionalEncoder{encoder}
2525
}
2626
return &sliceEncoder{typ, typ.Elem(), encoder}, nil
2727
}

feature_stream.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ import (
44
"io"
55
)
66

7-
// Stream is a io.Writer like object, with JSON specific write functions.
7+
// stream is a io.Writer like object, with JSON specific write functions.
88
// Error is not returned as return value, but stored as Error member on this stream instance.
99
type Stream struct {
10-
cfg *frozenConfig
11-
out io.Writer
12-
buf []byte
13-
n int
14-
Error error
15-
indention int
10+
cfg *frozenConfig
11+
out io.Writer
12+
buf []byte
13+
n int
14+
Error error
15+
indention int
16+
Attachment interface{} // open for customized encoder
1617
}
1718

1819
// NewStream create new stream instance.

0 commit comments

Comments
 (0)