Kaydet (Commit) 08336e30 authored tarafından Benjamin Peterson's avatar Benjamin Peterson

follup to #3473: don't duplicate the reduce code

üst 8692c79b
...@@ -2001,68 +2001,22 @@ is printed without a trailing newline before reading."); ...@@ -2001,68 +2001,22 @@ is printed without a trailing newline before reading.");
static PyObject * static PyObject *
builtin_reduce(PyObject *self, PyObject *args) 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; " if (PyErr_WarnPy3k("reduce() not supported in 3.x; "
"use functools.reduce()", 1) < 0) "use functools.reduce()", 1) < 0)
return NULL; return NULL;
if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result)) if (functools_reduce == NULL) {
return NULL; PyObject *functools = PyImport_ImportModule("functools");
if (result != NULL) if (functools == NULL)
Py_INCREF(result); return NULL;
functools_reduce = PyObject_GetAttrString(functools, "reduce");
it = PyObject_GetIter(seq); Py_DECREF(functools);
if (it == NULL) { if (functools_reduce == NULL)
PyErr_SetString(PyExc_TypeError, return NULL;
"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;
}
} }
return PyObject_Call(functools_reduce, args, 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;
} }
PyDoc_STRVAR(reduce_doc, PyDoc_STRVAR(reduce_doc,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment