@@ -740,7 +740,6 @@ dict_print(register dictobject *mp, register FILE *fp, register int flags)
740740{
741741 register int i ;
742742 register int any ;
743- register dictentry * ep ;
744743
745744 i = Py_ReprEnter ((PyObject * )mp );
746745 if (i != 0 ) {
@@ -752,19 +751,27 @@ dict_print(register dictobject *mp, register FILE *fp, register int flags)
752751
753752 fprintf (fp , "{" );
754753 any = 0 ;
755- for (i = 0 , ep = mp -> ma_table ; i < mp -> ma_size ; i ++ , ep ++ ) {
756- if (ep -> me_value != NULL ) {
754+ for (i = 0 ; i < mp -> ma_size ; i ++ ) {
755+ dictentry * ep = mp -> ma_table + i ;
756+ PyObject * pvalue = ep -> me_value ;
757+ if (pvalue != NULL ) {
758+ /* Prevent PyObject_Repr from deleting value during
759+ key format */
760+ Py_INCREF (pvalue );
757761 if (any ++ > 0 )
758762 fprintf (fp , ", " );
759763 if (PyObject_Print ((PyObject * )ep -> me_key , fp , 0 )!= 0 ) {
764+ Py_DECREF (pvalue );
760765 Py_ReprLeave ((PyObject * )mp );
761766 return -1 ;
762767 }
763768 fprintf (fp , ": " );
764769 if (PyObject_Print (ep -> me_value , fp , 0 ) != 0 ) {
770+ Py_DECREF (pvalue );
765771 Py_ReprLeave ((PyObject * )mp );
766772 return -1 ;
767773 }
774+ Py_DECREF (pvalue );
768775 }
769776 }
770777 fprintf (fp , "}" );
@@ -779,7 +786,6 @@ dict_repr(dictobject *mp)
779786 PyObject * sepa , * colon ;
780787 register int i ;
781788 register int any ;
782- register dictentry * ep ;
783789
784790 i = Py_ReprEnter ((PyObject * )mp );
785791 if (i != 0 ) {
@@ -792,13 +798,19 @@ dict_repr(dictobject *mp)
792798 sepa = PyString_FromString (", " );
793799 colon = PyString_FromString (": " );
794800 any = 0 ;
795- for (i = 0 , ep = mp -> ma_table ; i < mp -> ma_size && v ; i ++ , ep ++ ) {
796- if (ep -> me_value != NULL ) {
801+ for (i = 0 ; i < mp -> ma_size && v ; i ++ ) {
802+ dictentry * ep = mp -> ma_table + i ;
803+ PyObject * pvalue = ep -> me_value ;
804+ if (pvalue != NULL ) {
805+ /* Prevent PyObject_Repr from deleting value during
806+ key format */
807+ Py_INCREF (pvalue );
797808 if (any ++ )
798809 PyString_Concat (& v , sepa );
799810 PyString_ConcatAndDel (& v , PyObject_Repr (ep -> me_key ));
800811 PyString_Concat (& v , colon );
801- PyString_ConcatAndDel (& v , PyObject_Repr (ep -> me_value ));
812+ PyString_ConcatAndDel (& v , PyObject_Repr (pvalue ));
813+ Py_DECREF (pvalue );
802814 }
803815 }
804816 PyString_ConcatAndDel (& v , PyString_FromString ("}" ));
0 commit comments