diff options
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,  | 
