@@ -3,6 +3,7 @@ package jsoniter
33import  (
44	"fmt" 
55	"github.com/modern-go/reflect2" 
6+ 	"io" 
67	"reflect" 
78	"sort" 
89	"unsafe" 
@@ -107,6 +108,9 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
107108				stringEncoder : ctx .EncoderOf (reflect2 .TypeOf ("" )),
108109			}
109110		}
111+ 		if  typ .Kind () ==  reflect .Interface  {
112+ 			return  & dynamicMapKeyEncoder {ctx , typ }
113+ 		}
110114		return  & lazyErrorEncoder {err : fmt .Errorf ("unsupported map key type: %v" , typ )}
111115	}
112116}
@@ -203,6 +207,21 @@ func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {
203207	return  false 
204208}
205209
210+ type  dynamicMapKeyEncoder  struct  {
211+ 	ctx      * ctx 
212+ 	valType  reflect2.Type 
213+ }
214+ 
215+ func  (encoder  * dynamicMapKeyEncoder ) Encode (ptr  unsafe.Pointer , stream  * Stream ) {
216+ 	obj  :=  encoder .valType .UnsafeIndirect (ptr )
217+ 	encoderOfMapKey (encoder .ctx , reflect2 .TypeOf (obj )).Encode (reflect2 .PtrOf (obj ), stream )
218+ }
219+ 
220+ func  (encoder  * dynamicMapKeyEncoder ) IsEmpty (ptr  unsafe.Pointer ) bool  {
221+ 	obj  :=  encoder .valType .UnsafeIndirect (ptr )
222+ 	return  encoderOfMapKey (encoder .ctx , reflect2 .TypeOf (obj )).IsEmpty (reflect2 .PtrOf (obj ))
223+ }
224+ 
206225type  mapEncoder  struct  {
207226	mapType      * reflect2.UnsafeMapType 
208227	keyEncoder   ValEncoder 
@@ -253,6 +272,9 @@ func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
253272		subStream .buf  =  make ([]byte , 0 , 64 )
254273		key , elem  :=  mapIter .UnsafeNext ()
255274		encoder .keyEncoder .Encode (key , subStream )
275+ 		if  subStream .Error  !=  nil  &&  subStream .Error  !=  io .EOF  &&  stream .Error  ==  nil  {
276+ 			stream .Error  =  subStream .Error 
277+ 		}
256278		encodedKey  :=  subStream .Buffer ()
257279		subIter .ResetBytes (encodedKey )
258280		decodedKey  :=  subIter .ReadString ()
0 commit comments