Skip to content

Commit 72dccde

Browse files
authored
bpo-29548: Fix some inefficient call API usage (GH-97)
1 parent 72e81d0 commit 72dccde

File tree

7 files changed

+23
-40
lines changed

7 files changed

+23
-40
lines changed

Modules/_testcapimodule.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -3070,7 +3070,7 @@ slot_tp_del(PyObject *self)
30703070
/* Execute __del__ method, if any. */
30713071
del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
30723072
if (del != NULL) {
3073-
res = PyEval_CallObject(del, NULL);
3073+
res = _PyObject_CallNoArg(del);
30743074
if (res == NULL)
30753075
PyErr_WriteUnraisable(del);
30763076
else

Modules/_threadmodule.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -994,8 +994,7 @@ t_bootstrap(void *boot_raw)
994994
_PyThreadState_Init(tstate);
995995
PyEval_AcquireThread(tstate);
996996
nb_threads++;
997-
res = PyEval_CallObjectWithKeywords(
998-
boot->func, boot->args, boot->keyw);
997+
res = PyObject_Call(boot->func, boot->args, boot->keyw);
999998
if (res == NULL) {
1000999
if (PyErr_ExceptionMatches(PyExc_SystemExit))
10011000
PyErr_Clear();

Modules/_tkinter.c

+4-7
Original file line numberDiff line numberDiff line change
@@ -2417,7 +2417,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[
24172417
}
24182418
PyTuple_SET_ITEM(arg, i, s);
24192419
}
2420-
res = PyEval_CallObject(func, arg);
2420+
res = PyObject_Call(func, arg, NULL);
24212421
Py_DECREF(arg);
24222422

24232423
if (res == NULL)
@@ -2661,16 +2661,13 @@ static void
26612661
FileHandler(ClientData clientData, int mask)
26622662
{
26632663
FileHandler_ClientData *data = (FileHandler_ClientData *)clientData;
2664-
PyObject *func, *file, *arg, *res;
2664+
PyObject *func, *file, *res;
26652665

26662666
ENTER_PYTHON
26672667
func = data->func;
26682668
file = data->file;
26692669

2670-
arg = Py_BuildValue("(Oi)", file, (long) mask);
2671-
res = PyEval_CallObject(func, arg);
2672-
Py_DECREF(arg);
2673-
2670+
res = PyObject_CallFunction(func, "Oi", file, mask);
26742671
if (res == NULL) {
26752672
errorInCmd = 1;
26762673
PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
@@ -2840,7 +2837,7 @@ TimerHandler(ClientData clientData)
28402837

28412838
ENTER_PYTHON
28422839

2843-
res = PyEval_CallObject(func, NULL);
2840+
res = _PyObject_CallNoArg(func);
28442841
Py_DECREF(func);
28452842
Py_DECREF(v); /* See Tktt_New() */
28462843

Objects/abstract.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1329,7 +1329,7 @@ PyNumber_Long(PyObject *o)
13291329
}
13301330
trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
13311331
if (trunc_func) {
1332-
result = PyEval_CallObject(trunc_func, NULL);
1332+
result = _PyObject_CallNoArg(trunc_func);
13331333
Py_DECREF(trunc_func);
13341334
if (result == NULL || PyLong_CheckExact(result)) {
13351335
return result;

Objects/fileobject.c

+14-27
Original file line numberDiff line numberDiff line change
@@ -49,39 +49,26 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c
4949
PyObject *
5050
PyFile_GetLine(PyObject *f, int n)
5151
{
52+
_Py_IDENTIFIER(readline);
5253
PyObject *result;
5354

5455
if (f == NULL) {
5556
PyErr_BadInternalCall();
5657
return NULL;
5758
}
5859

59-
{
60-
PyObject *reader;
61-
PyObject *args;
62-
_Py_IDENTIFIER(readline);
63-
64-
reader = _PyObject_GetAttrId(f, &PyId_readline);
65-
if (reader == NULL)
66-
return NULL;
67-
if (n <= 0)
68-
args = PyTuple_New(0);
69-
else
70-
args = Py_BuildValue("(i)", n);
71-
if (args == NULL) {
72-
Py_DECREF(reader);
73-
return NULL;
74-
}
75-
result = PyEval_CallObject(reader, args);
76-
Py_DECREF(reader);
77-
Py_DECREF(args);
78-
if (result != NULL && !PyBytes_Check(result) &&
79-
!PyUnicode_Check(result)) {
80-
Py_DECREF(result);
81-
result = NULL;
82-
PyErr_SetString(PyExc_TypeError,
83-
"object.readline() returned non-string");
84-
}
60+
if (n <= 0) {
61+
result = _PyObject_CallMethodIdObjArgs(f, &PyId_readline, NULL);
62+
}
63+
else {
64+
result = _PyObject_CallMethodId(f, &PyId_readline, "i", n);
65+
}
66+
if (result != NULL && !PyBytes_Check(result) &&
67+
!PyUnicode_Check(result)) {
68+
Py_DECREF(result);
69+
result = NULL;
70+
PyErr_SetString(PyExc_TypeError,
71+
"object.readline() returned non-string");
8572
}
8673

8774
if (n < 0 && result != NULL && PyBytes_Check(result)) {
@@ -197,7 +184,7 @@ PyObject_AsFileDescriptor(PyObject *o)
197184
}
198185
else if ((meth = _PyObject_GetAttrId(o, &PyId_fileno)) != NULL)
199186
{
200-
PyObject *fno = PyEval_CallObject(meth, NULL);
187+
PyObject *fno = _PyObject_CallNoArg(meth);
201188
Py_DECREF(meth);
202189
if (fno == NULL)
203190
return -1;

Objects/typeobject.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -4348,7 +4348,7 @@ _common_reduce(PyObject *self, int proto)
43484348
if (!copyreg)
43494349
return NULL;
43504350

4351-
res = PyEval_CallMethod(copyreg, "_reduce_ex", "(Oi)", self, proto);
4351+
res = PyObject_CallMethod(copyreg, "_reduce_ex", "Oi", self, proto);
43524352
Py_DECREF(copyreg);
43534353

43544354
return res;

Objects/weakrefobject.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ proxy_checkref(PyWeakReference *proxy)
461461

462462
WRAP_BINARY(proxy_getattr, PyObject_GetAttr)
463463
WRAP_UNARY(proxy_str, PyObject_Str)
464-
WRAP_TERNARY(proxy_call, PyEval_CallObjectWithKeywords)
464+
WRAP_TERNARY(proxy_call, PyObject_Call)
465465

466466
static PyObject *
467467
proxy_repr(PyWeakReference *proxy)

0 commit comments

Comments
 (0)