@@ -2992,50 +2992,55 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, PyObject *keylist,
29922992 lo .keys = saved_ob_item ;
29932993 lo .values = NULL ;
29942994 }
2995- else {
2996- if (keyfunc != NULL ) {
2997- if (saved_ob_size < MERGESTATE_TEMP_SIZE /2 )
2998- /* Leverage stack space we allocated but won't otherwise use */
2999- keys = & ms .temparray [saved_ob_size + 1 ];
3000- else {
3001- keys = PyMem_Malloc (sizeof (PyObject * ) * saved_ob_size );
3002- if (keys == NULL ) {
3003- PyErr_NoMemory ();
3004- goto keyfunc_fail ;
3005- }
3006- }
3007- for (i = 0 ; i < saved_ob_size ; i ++ ) {
3008- keys [i ] = PyObject_CallOneArg (keyfunc , saved_ob_item [i ]);
3009- if (keys [i ] == NULL ) {
3010- for (i = i - 1 ; i >=0 ; i -- )
3011- Py_DECREF (keys [i ]);
3012- if (saved_ob_size >= MERGESTATE_TEMP_SIZE /2 )
3013- PyMem_Free (keys );
3014- goto keyfunc_fail ;
3015- }
3016- }
3017- }
2995+ else if (keyfunc != NULL ) {
2996+ if (saved_ob_size < MERGESTATE_TEMP_SIZE /2 )
2997+ /* Leverage stack space we allocated but won't otherwise use */
2998+ keys = & ms .temparray [saved_ob_size + 1 ];
30182999 else {
3019- assert (keylist != NULL );
3020- if (!PyList_Check (keylist )) {
3021- PyErr_Format (PyExc_TypeError ,
3022- "'%.200s' object is not a list" ,
3023- Py_TYPE (keylist )-> tp_name );
3000+ keys = PyMem_Malloc (sizeof (PyObject * ) * saved_ob_size );
3001+ if (keys == NULL ) {
3002+ PyErr_NoMemory ();
30243003 goto keyfunc_fail ;
30253004 }
3026- self_kl = ((PyListObject * ) keylist );
3027- DISABLE_LIST (self_kl , keylist_ob_size , keylist_ob_item , keylist_allocated );
3028- keylist_frozen = 1 ;
3029- if (saved_ob_size != keylist_ob_size ) {
3030- PyErr_SetString (PyExc_ValueError ,
3031- "Lengths of input list and keylist differ." );
3032- goto keylist_fail ;
3005+ }
3006+
3007+ for (i = 0 ; i < saved_ob_size ; i ++ ) {
3008+ keys [i ] = PyObject_CallOneArg (keyfunc , saved_ob_item [i ]);
3009+ if (keys [i ] == NULL ) {
3010+ for (i = i - 1 ; i >=0 ; i -- )
3011+ Py_DECREF (keys [i ]);
3012+ if (saved_ob_size >= MERGESTATE_TEMP_SIZE /2 )
3013+ PyMem_Free (keys );
3014+ goto keyfunc_fail ;
30333015 }
3034- keys = keylist_ob_item ;
30353016 }
3017+
30363018 lo .keys = keys ;
30373019 lo .values = saved_ob_item ;
30383020 }
3021+ else {
3022+ assert (keylist != NULL );
3023+ if (!PyList_Check (keylist )) {
3024+ PyErr_Format (PyExc_TypeError ,
3025+ "'%.200s' object is not a list" ,
3026+ Py_TYPE (keylist )-> tp_name );
3027+ goto keyfunc_fail ;
3028+ }
3029+
3030+ self_kl = ((PyListObject * ) keylist );
3031+ DISABLE_LIST (self_kl , keylist_ob_size , keylist_ob_item , keylist_allocated );
3032+ keylist_frozen = 1 ;
3033+ if (saved_ob_size != keylist_ob_size ) {
3034+ PyErr_SetString (PyExc_ValueError ,
3035+ "Lengths of input list and keylist differ." );
3036+ goto keylist_fail ;
3037+ }
3038+
3039+ keys = keylist_ob_item ;
3040+ lo .keys = keys ;
3041+ lo .values = saved_ob_item ;
3042+ }
3043+
30393044 /* The pre-sort check: here's where we decide which compare function to use.
30403045 * How much optimization is safe? We test for homogeneity with respect to
30413046 * several properties that are expensive to check at compare-time, and
0 commit comments