Replace PyObject_CallFunctionObjArgs() with fastcall

* PyObject_CallFunctionObjArgs(func, NULL) => _PyObject_CallNoArg(func)
* PyObject_CallFunctionObjArgs(func, arg, NULL) => _PyObject_CallArg1(func, arg)

PyObject_CallFunctionObjArgs() allocates 40 bytes on the C stack and requires
extra work to "parse" C arguments to build a C array of PyObject*.

_PyObject_CallNoArg() and _PyObject_CallArg1() are simpler and don't allocate
memory on the C stack.

This change is part of the fastcall project. The change on listsort() is
related to the issue #23507.
This commit is contained in:
Victor Stinner 2016-12-01 14:43:22 +01:00
parent 8be1c39eb3
commit 27580c1fb5
33 changed files with 71 additions and 83 deletions

View file

@ -312,7 +312,7 @@ pack_from_list(PyObject *obj, PyObject *items, PyObject *format,
assert(PyObject_CheckBuffer(obj));
assert(PyList_Check(items) || PyTuple_Check(items));
structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
structobj = _PyObject_CallArg1(Struct, format);
if (structobj == NULL)
return -1;
@ -406,7 +406,7 @@ pack_single(char *ptr, PyObject *item, const char *fmt, Py_ssize_t itemsize)
if (format == NULL)
goto out;
structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
structobj = _PyObject_CallArg1(Struct, format);
if (structobj == NULL)
goto out;
@ -620,7 +620,7 @@ unpack_rec(PyObject *unpack_from, char *ptr, PyObject *mview, char *item,
if (ndim == 0) {
memcpy(item, ptr, itemsize);
x = PyObject_CallFunctionObjArgs(unpack_from, mview, NULL);
x = _PyObject_CallArg1(unpack_from, mview);
if (x == NULL)
return NULL;
if (PyTuple_GET_SIZE(x) == 1) {
@ -696,7 +696,7 @@ ndarray_as_list(NDArrayObject *nd)
if (format == NULL)
goto out;
structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
structobj = _PyObject_CallArg1(Struct, format);
Py_DECREF(format);
if (structobj == NULL)
goto out;
@ -788,7 +788,7 @@ get_itemsize(PyObject *format)
PyObject *tmp;
Py_ssize_t itemsize;
tmp = PyObject_CallFunctionObjArgs(calcsize, format, NULL);
tmp = _PyObject_CallArg1(calcsize, format);
if (tmp == NULL)
return -1;
itemsize = PyLong_AsSsize_t(tmp);