@@ -3,6 +3,7 @@ package jsoniter
3
3
import (
4
4
"fmt"
5
5
"github.com/modern-go/reflect2"
6
+ "io"
6
7
"reflect"
7
8
"sort"
8
9
"unsafe"
@@ -107,6 +108,9 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
107
108
stringEncoder : ctx .EncoderOf (reflect2 .TypeOf ("" )),
108
109
}
109
110
}
111
+ if typ .Kind () == reflect .Interface {
112
+ return & dynamicMapKeyEncoder {ctx , typ }
113
+ }
110
114
return & lazyErrorEncoder {err : fmt .Errorf ("unsupported map key type: %v" , typ )}
111
115
}
112
116
}
@@ -203,6 +207,21 @@ func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {
203
207
return false
204
208
}
205
209
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
+
206
225
type mapEncoder struct {
207
226
mapType * reflect2.UnsafeMapType
208
227
keyEncoder ValEncoder
@@ -253,6 +272,9 @@ func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
253
272
subStream .buf = make ([]byte , 0 , 64 )
254
273
key , elem := mapIter .UnsafeNext ()
255
274
encoder .keyEncoder .Encode (key , subStream )
275
+ if subStream .Error != nil && subStream .Error != io .EOF && stream .Error == nil {
276
+ stream .Error = subStream .Error
277
+ }
256
278
encodedKey := subStream .Buffer ()
257
279
subIter .ResetBytes (encodedKey )
258
280
decodedKey := subIter .ReadString ()
0 commit comments