diff --git a/feature_reflect_array.go b/feature_reflect_array.go index 7eb2af9..a6dd91c 100644 --- a/feature_reflect_array.go +++ b/feature_reflect_array.go @@ -13,6 +13,9 @@ func decoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecod } func encoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder { + if typ.Len() == 0 { + return emptyArrayEncoder{} + } encoder := encoderOfType(cfg, prefix+"[array]->", typ.Elem()) if typ.Elem().Kind() == reflect.Map { encoder = &OptionalEncoder{encoder} @@ -20,6 +23,20 @@ func encoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncod return &arrayEncoder{typ, typ.Elem(), encoder} } +type emptyArrayEncoder struct{} + +func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteEmptyArray() +} + +func (encoder emptyArrayEncoder) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteEmptyArray() +} + +func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return true +} + type arrayEncoder struct { arrayType reflect.Type elemType reflect.Type @@ -27,10 +44,6 @@ type arrayEncoder struct { } func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if encoder.arrayType.Len() == 0 { - stream.WriteEmptyArray() - return - } stream.WriteArrayStart() elemPtr := unsafe.Pointer(ptr) encoder.elemEncoder.Encode(elemPtr, stream)