@@ -329,15 +329,29 @@ func (e encoder) encodeMap(b []byte, p unsafe.Pointer, t reflect.Type, encodeKey
329329 return e .encodeNull (b , nil )
330330 }
331331
332+ // checkRefCycle/freeRefCycle expect the map header pointer itself,
333+ // rather than a pointer to the header.
334+ p = * (* unsafe .Pointer )(p )
335+
336+ if shouldCheckForRefCycle (& e ) {
337+ key := cycleKey {ptr : p }
338+ if hasRefCycle (& e , key ) {
339+ return b , refCycleError (t , p )
340+ }
341+
342+ defer freeRefCycleInfo (& e , key )
343+ }
344+
332345 keys := m .MapKeys ()
333346 if sortKeys != nil && (e .flags & SortMapKeys ) != 0 {
334347 sortKeys (keys )
335348 }
336349
337350 start := len (b )
338- var err error
339351 b = append (b , '{' )
340352
353+ var err error
354+
341355 for i , k := range keys {
342356 v := m .MapIndex (k )
343357
@@ -384,6 +398,19 @@ func (e encoder) encodeMapStringInterface(b []byte, p unsafe.Pointer) ([]byte, e
384398 return e .encodeNull (b , nil )
385399 }
386400
401+ // checkRefCycle/freeRefCycle expect the map header pointer itself,
402+ // rather than a pointer to the header.
403+ p = * (* unsafe .Pointer )(p )
404+
405+ if shouldCheckForRefCycle (& e ) {
406+ key := cycleKey {ptr : p }
407+ if hasRefCycle (& e , key ) {
408+ return b , refCycleError (mapStringInterfaceType , p )
409+ }
410+
411+ defer freeRefCycleInfo (& e , key )
412+ }
413+
387414 if (e .flags & SortMapKeys ) == 0 {
388415 // Optimized code path when the program does not need the map keys to be
389416 // sorted.
@@ -424,9 +451,10 @@ func (e encoder) encodeMapStringInterface(b []byte, p unsafe.Pointer) ([]byte, e
424451 sort .Sort (s )
425452
426453 start := len (b )
427- var err error
428454 b = append (b , '{' )
429455
456+ var err error
457+
430458 for i , elem := range s .elements {
431459 if i != 0 {
432460 b = append (b , ',' )
0 commit comments