Skip to content

Commit a128436

Browse files
committed
init
1 parent 6416e6e commit a128436

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

Objects/listobject.c

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
31193126
fail:
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

Comments
 (0)