summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2008-08-18 02:01:21 (GMT)
committerBenjamin Peterson <benjamin@python.org>2008-08-18 02:01:21 (GMT)
commit08336e30adc97345ed1a88ad2a1b9a6f47896fa0 (patch)
treed0e3382f4ad0dfc953c87a84c97d80a896812ca6 /Python
parent8692c79ba988487b32d3517a1ce78ed761eb47e8 (diff)
downloadcpython-08336e30adc97345ed1a88ad2a1b9a6f47896fa0.zip
cpython-08336e30adc97345ed1a88ad2a1b9a6f47896fa0.tar.gz
cpython-08336e30adc97345ed1a88ad2a1b9a6f47896fa0.tar.bz2
follup to #3473: don't duplicate the reduce code
Diffstat (limited to 'Python')
-rw-r--r--Python/bltinmodule.c66
1 files changed, 10 insertions, 56 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 4a1ffd5..4e6f901 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -2001,68 +2001,22 @@ is printed without a trailing newline before reading.");
static PyObject *
builtin_reduce(PyObject *self, PyObject *args)
{
- PyObject *seq, *func, *result = NULL, *it;
+ static PyObject *functools_reduce = NULL;
if (PyErr_WarnPy3k("reduce() not supported in 3.x; "
"use functools.reduce()", 1) < 0)
return NULL;
- if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))
- return NULL;
- if (result != NULL)
- Py_INCREF(result);
-
- it = PyObject_GetIter(seq);
- if (it == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "reduce() arg 2 must support iteration");
- Py_XDECREF(result);
- return NULL;
- }
-
- if ((args = PyTuple_New(2)) == NULL)
- goto Fail;
-
- for (;;) {
- PyObject *op2;
-
- if (args->ob_refcnt > 1) {
- Py_DECREF(args);
- if ((args = PyTuple_New(2)) == NULL)
- goto Fail;
- }
-
- op2 = PyIter_Next(it);
- if (op2 == NULL) {
- if (PyErr_Occurred())
- goto Fail;
- break;
- }
-
- if (result == NULL)
- result = op2;
- else {
- PyTuple_SetItem(args, 0, result);
- PyTuple_SetItem(args, 1, op2);
- if ((result = PyEval_CallObject(func, args)) == NULL)
- goto Fail;
- }
+ if (functools_reduce == NULL) {
+ PyObject *functools = PyImport_ImportModule("functools");
+ if (functools == NULL)
+ return NULL;
+ functools_reduce = PyObject_GetAttrString(functools, "reduce");
+ Py_DECREF(functools);
+ if (functools_reduce == NULL)
+ return NULL;
}
-
- Py_DECREF(args);
-
- if (result == NULL)
- PyErr_SetString(PyExc_TypeError,
- "reduce() of empty sequence with no initial value");
-
- Py_DECREF(it);
- return result;
-
-Fail:
- Py_XDECREF(args);
- Py_XDECREF(result);
- Py_DECREF(it);
- return NULL;
+ return PyObject_Call(functools_reduce, args, NULL);
}
PyDoc_STRVAR(reduce_doc,