summaryrefslogtreecommitdiff
path: root/Objects/listobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/listobject.c')
-rw-r--r--Objects/listobject.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c
index dcd7b5efe5..89941749d4 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -804,6 +804,9 @@ listextend(PyListObject *self, PyObject *b)
Py_RETURN_NONE;
}
m = Py_SIZE(self);
+ /* It should not be possible to allocate a list large enough to cause
+ an overflow on any relevant platform */
+ assert(m < PY_SSIZE_T_MAX - n);
if (list_resize(self, m + n) < 0) {
Py_DECREF(b);
return NULL;
@@ -1909,7 +1912,7 @@ reverse_sortslice(sortslice *s, Py_ssize_t n)
* duplicated).
*/
static PyObject *
-listsort(PyListObject *self, PyObject *args, PyObject *kwds)
+listsort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
{
MergeState ms;
Py_ssize_t nremaining;
@@ -1919,24 +1922,11 @@ listsort(PyListObject *self, PyObject *args, PyObject *kwds)
PyObject **saved_ob_item;
PyObject **final_ob_item;
PyObject *result = NULL; /* guilty until proved innocent */
- int reverse = 0;
- PyObject *keyfunc = NULL;
Py_ssize_t i;
- static char *kwlist[] = {"key", "reverse", 0};
PyObject **keys;
assert(self != NULL);
assert (PyList_Check(self));
- if (args != NULL) {
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
- kwlist, &keyfunc, &reverse))
- return NULL;
- if (Py_SIZE(args) > 0) {
- PyErr_SetString(PyExc_TypeError,
- "must use keyword argument for key function");
- return NULL;
- }
- }
if (keyfunc == Py_None)
keyfunc = NULL;
@@ -2085,6 +2075,19 @@ keyfunc_fail:
#undef IFLT
#undef ISLT
+static PyObject *
+listsort(PyListObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"key", "reverse", 0};
+ PyObject *keyfunc = NULL;
+ int reverse = 0;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|$Oi:sort",
+ kwlist, &keyfunc, &reverse))
+ return NULL;
+ return listsort_impl(self, keyfunc, reverse);
+}
+
int
PyList_Sort(PyObject *v)
{
@@ -2092,7 +2095,7 @@ PyList_Sort(PyObject *v)
PyErr_BadInternalCall();
return -1;
}
- v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
+ v = listsort_impl((PyListObject *)v, NULL, 0);
if (v == NULL)
return -1;
Py_DECREF(v);
@@ -2281,12 +2284,10 @@ list_richcompare(PyObject *v, PyObject *w, int op)
/* We have an item that differs -- shortcuts for EQ/NE */
if (op == Py_EQ) {
- Py_INCREF(Py_False);
- return Py_False;
+ Py_RETURN_FALSE;
}
if (op == Py_NE) {
- Py_INCREF(Py_True);
- return Py_True;
+ Py_RETURN_TRUE;
}
/* Compare the final item again using the proper operator */