[Python-checkins] r65802 - python/trunk/Python/bltinmodule.c
benjamin.peterson
python-checkins at python.org
Mon Aug 18 04:01:21 CEST 2008
Author: benjamin.peterson
Date: Mon Aug 18 04:01:21 2008
New Revision: 65802
Log:
follup to #3473: don't duplicate the reduce code
Modified:
python/trunk/Python/bltinmodule.c
Modified: python/trunk/Python/bltinmodule.c
==============================================================================
--- python/trunk/Python/bltinmodule.c (original)
+++ python/trunk/Python/bltinmodule.c Mon Aug 18 04:01:21 2008
@@ -2001,68 +2001,22 @@
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,
More information about the Python-checkins
mailing list