diff -r bb67b810aac1 Objects/listobject.c --- a/Objects/listobject.c Mon Feb 23 07:56:13 2015 -0800 +++ b/Objects/listobject.c Tue Feb 24 10:01:05 2015 +0200 @@ -1955,26 +1955,41 @@ listsort(PyListObject *self, PyObject *a lo.values = NULL; } else { + PyObject *args; + args = PyTuple_New(1); + if (args == NULL) + return NULL; if (saved_ob_size < MERGESTATE_TEMP_SIZE/2) /* Leverage stack space we allocated but won't otherwise use */ keys = &ms.temparray[saved_ob_size+1]; else { keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size); - if (keys == NULL) + if (keys == NULL) { + Py_DECREF(args); return NULL; + } } for (i = 0; i < saved_ob_size ; i++) { - keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i], - NULL); + if (Py_REFCNT(args) != 1) { + Py_DECREF(args); + args = PyTuple_New(1); + } + Py_INCREF(saved_ob_item[i]); + PyTuple_SET_ITEM(args, 0, saved_ob_item[i]); + keys[i] = PyObject_Call(keyfunc, args, NULL); + Py_DECREF(saved_ob_item[i]); + PyTuple_SET_ITEM(args, 0, NULL); if (keys[i] == NULL) { for (i=i-1 ; i>=0 ; i--) Py_DECREF(keys[i]); if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2) PyMem_FREE(keys); + Py_DECREF(args); goto keyfunc_fail; } } + Py_DECREF(args); lo.keys = keys; lo.values = saved_ob_item; diff -r bb67b810aac1 Python/bltinmodule.c --- a/Python/bltinmodule.c Mon Feb 23 07:56:13 2015 -0800 +++ b/Python/bltinmodule.c Tue Feb 24 10:01:05 2015 +0200 @@ -479,6 +479,7 @@ typedef struct { PyObject_HEAD PyObject *func; PyObject *it; + PyObject *args; /* cached args tuple */ } filterobject; static PyObject * @@ -508,6 +509,12 @@ filter_new(PyTypeObject *type, PyObject Py_INCREF(func); lz->func = func; lz->it = it; + lz->args = PyTuple_New(1); + if (lz->args == NULL) { + Py_DECREF(it); + Py_DECREF(func); + return NULL; + } return (PyObject *)lz; } @@ -518,6 +525,7 @@ filter_dealloc(filterobject *lz) PyObject_GC_UnTrack(lz); Py_XDECREF(lz->func); Py_XDECREF(lz->it); + Py_XDECREF(lz->args); Py_TYPE(lz)->tp_free(lz); } @@ -547,8 +555,21 @@ filter_next(filterobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = PyObject_CallFunctionObjArgs(lz->func, - item, NULL); + PyObject *args = lz->args; + if (Py_REFCNT(args) != 1) { + args = PyTuple_New(1); + if (args == NULL) { + Py_DECREF(item); + return NULL; + } + Py_DECREF(lz->args); + lz->args = args; + } + Py_INCREF(args); + PyTuple_SET_ITEM(args, 0, item); + good = PyObject_Call(lz->func, args, NULL); + PyTuple_SET_ITEM(args, 0, NULL); + Py_DECREF(args); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1418,6 +1439,7 @@ typedef struct { PyObject_HEAD PyObject *iters; PyObject *func; + PyObject *argtuple; /* cached args tuple */ } mapobject; static PyObject * @@ -1461,6 +1483,12 @@ map_new(PyTypeObject *type, PyObject *ar func = PyTuple_GET_ITEM(args, 0); Py_INCREF(func); lz->func = func; + lz->argtuple = PyTuple_New(PyTuple_Size(lz->iters)); + if (lz->argtuple == NULL) { + Py_DECREF(iters); + Py_DECREF(func); + return NULL; + } return (PyObject *)lz; } @@ -1471,6 +1499,7 @@ map_dealloc(mapobject *lz) PyObject_GC_UnTrack(lz); Py_XDECREF(lz->iters); Py_XDECREF(lz->func); + Py_DECREF(lz->argtuple); Py_TYPE(lz)->tp_free(lz); } @@ -1487,23 +1516,35 @@ map_next(mapobject *lz) { PyObject *val; PyObject *argtuple; - PyObject *result; + PyObject *result = NULL; Py_ssize_t numargs, i; - numargs = PyTuple_Size(lz->iters); - argtuple = PyTuple_New(numargs); - if (argtuple == NULL) - return NULL; + argtuple = lz->argtuple; + numargs = PyTuple_Size(argtuple); + if (Py_REFCNT(argtuple) != 1) { + argtuple = PyTuple_New(numargs); + if (argtuple == NULL) + return NULL; + Py_DECREF(lz->argtuple); + lz->argtuple = argtuple; + } + Py_INCREF(argtuple); for (i=0 ; iiters, i)); if (val == NULL) { - Py_DECREF(argtuple); - return NULL; + numargs = i; + goto done; } PyTuple_SET_ITEM(argtuple, i, val); } result = PyObject_Call(lz->func, argtuple, NULL); +done: + for (i = 0; i < numargs; i++) { + val = PyTuple_GET_ITEM(argtuple, i); + PyTuple_SET_ITEM(argtuple, i, NULL); + Py_DECREF(val); + } Py_DECREF(argtuple); return result; }