diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-08-18 02:01:21 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-08-18 02:01:21 (GMT) |
commit | 08336e30adc97345ed1a88ad2a1b9a6f47896fa0 (patch) | |
tree | d0e3382f4ad0dfc953c87a84c97d80a896812ca6 /Python | |
parent | 8692c79ba988487b32d3517a1ce78ed761eb47e8 (diff) | |
download | cpython-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.c | 66 |
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, |