Squash a few calls to the hideously expensive PyObject_CallObject(o,a)
-- replace then with slightly faster PyObject_Call(o,a,NULL). (The
difference is that the latter requires a to be a tuple; the former
allows other values and wraps them in a tuple if necessary; it
involves two more levels of C function calls to accomplish all that.)
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index c3c5893..a12e7df 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3257,7 +3257,7 @@
static int
slot_nb_nonzero(PyObject *self)
{
- PyObject *func, *res;
+ PyObject *func, *res, *args;
static PyObject *nonzero_str, *len_str;
func = lookup_maybe(self, "__nonzero__", &nonzero_str);
@@ -3272,7 +3272,11 @@
return 1;
}
}
- res = PyObject_CallObject(func, NULL);
+ args = res = PyTuple_New(0);
+ if (args != NULL) {
+ res = PyObject_Call(func, args, NULL);
+ Py_DECREF(args);
+ }
Py_DECREF(func);
if (res == NULL)
return -1;
@@ -3651,9 +3655,14 @@
func = lookup_method(self, "__iter__", &iter_str);
if (func != NULL) {
- res = PyObject_CallObject(func, NULL);
- Py_DECREF(func);
- return res;
+ PyObject *args;
+ args = res = PyTuple_New(0);
+ if (args != NULL) {
+ res = PyObject_Call(func, args, NULL);
+ Py_DECREF(args);
+ }
+ Py_DECREF(func);
+ return res;
}
PyErr_Clear();
func = lookup_method(self, "__getitem__", &getitem_str);