@@ -2927,6 +2927,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
29272927 FT_ATOMIC_STORE_PTR_RELEASE (self -> ob_item , NULL );
29282928 self -> allocated = -1 ; /* any operation will reset it to >= 0 */
29292929
2930+ PyObject * * keylist ;
29302931 if (keyfunc == NULL ) {
29312932 keys = NULL ;
29322933 lo .keys = saved_ob_item ;
@@ -2943,18 +2944,24 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
29432944 goto keyfunc_fail ;
29442945 }
29452946 }
2946-
2947- for (i = 0 ; i < saved_ob_size ; i ++ ) {
2948- keys [i ] = PyObject_CallOneArg (keyfunc , saved_ob_item [i ]);
2949- if (keys [i ] == NULL ) {
2950- for (i = i - 1 ; i >=0 ; i -- )
2951- Py_DECREF (keys [i ]);
2952- if (saved_ob_size >= MERGESTATE_TEMP_SIZE /2 )
2953- PyMem_Free (keys );
2954- goto keyfunc_fail ;
2947+ if (PyList_CheckExact (keyfunc )) {
2948+ keylist = ((PyListObject * ) keyfunc )-> ob_item ;
2949+ for (i = 0 ; i < saved_ob_size ; i ++ ) {
2950+ keys [i ] = keylist [i ];
2951+ }
2952+ }
2953+ else {
2954+ for (i = 0 ; i < saved_ob_size ; i ++ ) {
2955+ keys [i ] = PyObject_CallOneArg (keyfunc , saved_ob_item [i ]);
2956+ if (keys [i ] == NULL ) {
2957+ for (i = i - 1 ; i >=0 ; i -- )
2958+ Py_DECREF (keys [i ]);
2959+ if (saved_ob_size >= MERGESTATE_TEMP_SIZE /2 )
2960+ PyMem_Free (keys );
2961+ goto keyfunc_fail ;
2962+ }
29552963 }
29562964 }
2957-
29582965 lo .keys = keys ;
29592966 lo .values = saved_ob_item ;
29602967 }
@@ -3118,8 +3125,15 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
31183125 result = Py_None ;
31193126fail :
31203127 if (keys != NULL ) {
3121- for (i = 0 ; i < saved_ob_size ; i ++ )
3122- Py_DECREF (keys [i ]);
3128+ if (PyList_CheckExact (keyfunc )) {
3129+ for (i = 0 ; i < saved_ob_size ; i ++ ) {
3130+ keylist [i ] = keys [i ];
3131+ }
3132+ }
3133+ else {
3134+ for (i = 0 ; i < saved_ob_size ; i ++ )
3135+ Py_DECREF (keys [i ]);
3136+ }
31233137 if (saved_ob_size >= MERGESTATE_TEMP_SIZE /2 )
31243138 PyMem_Free (keys );
31253139 }
0 commit comments